在linux上运行python脚本(安装pytorch踩坑记录,pyinstaller使用方式,构建docker镜像)

  • Post author:
  • Post category:linux




背景

脚本需要导入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,也就是说根本不需要自己麻烦的构建。。。



版权声明:本文为corruptwww原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。