背景
脚本需要导入pytorch等库才能运行。
脚本在windows上运行成功,尝试放到linux上运行。
linux服务器内存较小。
方法一:在linux上安装依赖
把脚本放到linux上,直接安装依赖。
安装环境也有两种方法:一是先安装conda,再在里面安装环境;二是直接使用pip安装。
其实无论哪种方法,只要linux内存够,应该都是可以的。但我的问题就出在了内存上。
使用conda安装,报错:InvalidArchiveError
。报错内容是conda缓存不足。
使用pip安装,进度条下载到一半,报错:killed
。还是报的linux内存不足。
解决方法有几种:
1是使用--no-cache-dir
参数
2是先下载轮子文件whl到本地再pip安装
具体可以参考这篇文章:https://blog.csdn.net/qq_39383591/article/details/121962775
在我尝试了几次下载失败后,我决定用回最开始使用的方法:即在windows打包好环境再放到linux中运行。
方法二:使用pyinstaller
在windows使用pyinstaller 打包好环境再放到linux中运行。
推荐先在conda中新建一个环境,再拉取环境依赖,否则使用当前环境打包,会导致打包后的文件过大:
>conda create --name sg3
>conda activate sg3
>conda env create -f environment.yml
第二次运行可以直接用生成的spec文件打包,节省时间
pyinstaller main.spec
问题一:exe运行报错:torch\lib\shm.dll
打包后找不到部分dll依赖项,相关issue:
https://github.com/pyinstaller/pyinstaller/issues/6960
看了一下,这个issue是最近出现的,pyinstaller的5.7版本应该是把这个问题修复了,于是我用pip list
命令查看了本机的各个库版本,发现已经更新。我再去打包的环境里查看库版本,果然版本过低,需要升级。
使用命令升级:pip install --upgrade pyinstaller
问题二:conda报错:ValueError: check_hostname requires server_hostname
原因:开启了代理服务器,conda下载失败
解决:关闭代理服务器
问题三:conda报错:PackageNotInstalledError: Package is not installed in prefix
使用了错误的升级库命令:conda update pyinstaller
解决:使用正确命令pip install --upgrade pyinstaller
问题四:exe运行报错:ModuleNotFoundError: No module named 'scipy.signal'
我在github上找到了类似的issue:https://github.com/pyinstaller/pyinstaller/issues/3456
但也仅仅是相似,按开发者的说法,升级scipy的版本即可解决问题,但这并没有解决我的问题。
最后我选择在pyinstaller生成的spec文件中忽略掉这个包:
毫无疑问,去掉这个包之后,因为这个包丢失而导致的问题也出来了:
DLL load failed while importing _fblas
我在stackoverflow中找到了类似问题。
方法三:使用docker镜像
理论上来说,docker镜像应该是最方便的方法,事实也确实如此。但由于脚本需要传参的关系,我错误的认为直接打包或复制文件即可在linux上运行,就没选docker这种方式。
在开始着手构建docker镜像的过程中,我还注意到了我拉取的github上的原项目就有dockerfile,也就是说根本不需要自己麻烦的构建。。。