我写了一个基于 pytorch 的算法应用,现在考虑做一个功能,就是允许用户上传不同版本的 pytorch (源码或者安装包之类的),然后我在用户上传的这个版本的基础上进行 import 等操作,基于该版本的 pytorch 运行我自己写的算法应用,整个操作要求是不需要后台手动替换或者手动安装,完全自动化,这个有可能做到吗?假设先不考虑不同版本之间的依赖和兼容性问题

我写了一个基于 pytorch 的算法应用,现在考虑做一个功能,就是允许用户上传不同版本的 pytorch (源码或者安装包之类的),然后我在用户上传的这个版本的基础上进行 import 等操作,基于该版本的 pytorch 运行我自己写的算法应用,整个操作要求是不需要后台手动替换或者手动安装,完全自动化,这个有可能做到吗?假设先不考虑不同版本之间的依赖和兼容性问题
1 chf007 Mar 18, 2024 Python 不是那种基于虚拟机的语言,动态换代码难 |
2 aloxaf Mar 18, 2024 不怕用户上传个挖矿程序上去吗 |
3 mightybruce Mar 18, 2024 可以做到,但是这简直就是可以直接攻击的点,最好还是不要干。 这个叫做 self modifying script |
4 uliah Mar 18, 2024 从项目的角度有两种常用的做法: 1 、将 pytorch 部分开发成独立应用, 通过 HTTP 暴露 2 、运行多个版本的 pytorch 容器 3 、main 进入后, 查询支持的 pytorch 版本, 选择后调用 1 、编写一个 DOCKERFILE & deploy 模板 2 、main 进入后, 填写 version 发布任务 3 、任务 BUILD 后运行, 返回结果 |
5 qazwsxkevin Mar 18, 2024 importlib.import_module 是重载模块代码的,你这个情况应该适用 |
6 momo1999 Mar 18, 2024 你要找的是不是 importlib |
7 cc666 Mar 18, 2024 importlib.reload() 可以动态更新模块 但是依赖于被更新模块的模块不会自动被更新,挺麻烦,可以试试 ipython 的%autoreload ,但还是有坑( from module import something ),没研究过是怎么实现的 这个需求挺奇怪的,为什么不用多进程或者重启进程,大不了 subprocess 跑一个 python 脚本 |
8 nevermoreluo Mar 18, 2024 总的来说完全切出去用进程间通信管道或者网络之类的都可以,这样风险低很多,不然要考虑的太多心智负担太重 如果真的要做 代码里面首先不能有全局变量之类的声明,这些声明的空间是另外开辟的 你要想好覆盖会不会发生异常情况 其次原理上就是把 import 的 cache 删了 再 reload 但是这时候内存中已经实例化的对象是不变的,如果这是你想要的就叫 feature ,如果不是 祝你幸福 顶多加载到静态类方法能执行到新的 |
9 Hstar Mar 18, 2024 为什么纠结于替换 pytorch 库,这过程中不可控因素太多啦。 工程化一点的做法应该是直接按照新的 pytorch 生成一个 python 虚拟环境或者容器。按这个思路来的话现成的解法就太多了。 |
10 ipwx Mar 18, 2024 docker run my-python-torch-xxx |
11 zeromovie OP 感谢大家的回复,主要是有个测试类似框架的需求,可能看起来挺奇怪吧 |
12 ClericPy Mar 18, 2024 1. importlib 2. sys.modules.pop 具体自己查 |
13 tomczhen Mar 18, 2024 我的理解,启动脚本中增加 pythonpath 给到上传的包路径即可。这样自动化起来很容易。攻击问题就自行解决吧。 |
14 LemonPrefect Mar 19, 2024 via Android 为所有版本构建 docker 容器然后要什么版本启动什么版本? |
15 founddev Mar 25, 2024 可以 from importlib import import_module |