一、目的
- 实现了用pyinstaller打包深度学习模型为exe,实现模型在不同的环境下可以运行。
- 主要打包的是test ,也就是测试效果,并不是到别的环境下训练
- 实现了带资源打包,比如.pth等
二、具体流程
1.创建虚拟环境
因为使用pyinstaller打包深度学习模型,本身就会很大,所以我们需要在虚拟环境下打包。
我用的是anaconda
conda create --name SR# SR是我这边的虚拟环境名
conda activate SR
2.在本地运行模型
需要在虚拟环境下,先把模型运行起来,测试可行才能进行下一步
3.安装pyinstaller
pip install pyinstaller
这个是最方便的方法;
但是我在具体操作时出现了pyinstaller报错的情况。
(1)本地环境python3.7,pyinstaller出现报错
原因:,现在我们pip install pyinstaller的版本,只支持python3.8以上。
解决方案1: 要想办法下载更低版本的pyinstaller ,maybe是 pip install pyinstaller=xx?没试过
解决方案2: 我这边是直接把环境换成了python3.8,丝滑~
4.打包多文件、带资源项目
由于我需要打包的是多个.py文件,以及包含了.pth权重资源文件的项目,所以我不能用许多博客里描述的直接用
pyinstaller -F xx.py#哒咩!!!
会出现千奇百怪的问题,就算打包完了也不能用
所以我们需要通过.spec来进行打包,这个.spec文件在我看来,有点像是Cmakelist.txt起到的作用。
step1:生成.spec文件
pyi-makespec test.py
这个test.py就是我们的测试的那个主要的文件。通过这个命令可以在本地生成同名的.spec文件。生成成功会显示:
Wrote C:\..\ESRGAN.spec.
Now run pyinstaller.py to build the executable.
step2:修改spec文件
因为是多文件、带资源打包,我们需要修改spec文件,不然会打包失败。
spec文件里的具体参数的设置可以找其他的博客,我这里主要写一下一些用到的参数,以及在设置中我遇到的错误:
我们主要修改的是spec的下面这个部分
a = Analysis(
['inference_realbasicvsr.py',
"D:\\..\\models\\builde.py",#这里写项目里所有用到的.py文件的绝对路径
"D:\\..\\configs\\xx.py"
],
pathex=['D:\\documents\\work\\RealBasicVSR-master'],#这里写项目所在位置的绝对路径
binaries=[],#这里是二进制文件,我试过把.pth写在这里,会报错
datas=[('D:\\documents\\work\\xx.py','configs'),
("D:\\documents\\work\\xx.pth",".weights"),
("D:\\documents\\work\\xx2.pth",".weights" )],#这里写所有的资源文件,格式为('资源文件的绝对路径\\xx.pth','生成位置')
hiddenimports=['mmcv','mmcv._ext'],#需要引入的库,可以在打包报错后一个个引入
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
其中datas=[]是引入资源文件的关键!!!
我们需要把所有的资源文件写到这个里,按照元组的格式(),()…
里面参数的含义:(‘D:\documents\work\xx.py’,‘weights’)前面表示的是本地的资源文件的绝对路径。后面的参数表示:在项目打包后,会在exe的那个同级路径下面生成一个".weights"的文件夹,在打包过程中会把这些资源文件放在这个文件夹下面。
所以exe在找资源文件的时候,也需要到这个路径".weights/xx.pth"下找。
注意!!所以在test.py中,读取资源文件的地方也要改成’.weights/xx.pth’,虽然当下在pycharm编译不会成功,但是打包后可以运行
step3:项目打包
完成上面工作后,可以开始打包了,我是用pycharm在这个虚拟环境下打包的:
pyinstaller test.spec
注意:输入这个命令就行,加别的命令会报错,如果有–add data参数的需求,直接在spec里改datas就行,–hidden什么的直接在spec里改就行了,我在上面写了。
打包成功会显示:
...
96931 INFO: Building EXE from EXE-00.toc completed successfully.
96995 INFO: checking COLLECT
96995 INFO: Building COLLECT because COLLECT-00.toc is non existent
96996 INFO: Building COLLECT COLLECT-00.toc
133736 INFO: Building COLLECT COLLECT-00.toc completed successfully.
step4:打包成功!
打包成功后,会在你的项目下面出现两个文件夹:build和dist。我们需要的打包后的lib库以及exe文件就在这个dist下面。
进入这个exe路径下,进入cmd,直接运行就行
D:\..\dist\XX>XX.exe data/demo_001 TEST
不用加python,参数设置也和之前在pycharm下一样就行
(1)错误1:出现xx.dll找不到或者别的什么
原因1: 这个可能是因为这个dll没有
解决方法: 如果是常见库的dll,就在自己电脑上用everything扒拉一下,复制过来就行
原因2: 这个可能是因为这个dll依赖的别的dll没有
解决方法: 我们用Dependence找一下这个dll依赖了什么dll,如果是常见库的dll,就在自己电脑上用everything扒拉一下,复制过来就行。
注:dependence用法,直接把dll拉到那个界面就行,标红的库就是没有的
(2)错误2:迁移到别的电脑后,出现NoneType …write
这个问题的原因有很多,我这里只写我遇到的:
这是我遇到的问题,这个问题是因为项目中的VGG19预训练模型是从网上下载的,之后再运行,代码会直接在迁移后的电脑的./cache/torch/hub/checkpoints/下找这个下载的预训练模型。
但是在别的机子上可能没有这个.pth,所以我们只要复制过去就行。