Pyinstaller打包Pytorch框架所遇到的问题


目录

  • 前言
  • 基本流程
    • 一、安装Pyinstaller 和 测试Hello World
    • 二、打包整个项目,在本机上调试生成exe
    • 三、在新电脑上测试
  • 参考资料

前言 ??第一次尝试用Pyinstaller打包Pytorch,碰见了很多问题,耗费了许多时间!想把这个过程中碰到的问题与解决方法记录一下,方便后来者。
基本流程 ??使用Pyinstaller打包流程可分为以下三步:
  • 安装Pyinstaller,写个Hello world打包测试
  • 打包整个项目,在本机上调试生成exe
  • 将exe拷贝到新电脑上,测试和调试
一、安装Pyinstaller 和 测试Hello World ??使用Pycharm打开项目,点击Terminal,输入以下命令:

pip install pyinstaller
??请确保Terminal所在路径为项目根目录,以免在后续打包过程中找不到一些模块。图中红框内(pytorch)是我的项目所需要的虚拟环境。
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??编写Hello World测试,新建test.py:
if __name__ == '__main__': print("Hello World!") while True: pass

??在Terminal输入以下命令,打包test.py:

pyinstaller -F test.py
??回车运行,开始打包!在文件夹dist中找到test.exe程序,运行测试,没报错说明Pyinstaller安装成功。
二、打包整个项目,在本机上调试生成exe ??实际的项目一般是多文件,打包过程远比Hello World复杂多了。打包项目的核心要点有两个:
  • 配置好.spec文件
  • 补齐依赖项
??关于.spec文件配置详见参考链接一,这里不再赘述。需要注意的是,在测试阶段,打包时应设置为-D模式,方便补齐dll。本文重点讲dll及其依赖项的补齐。先安装必备工具Dependens,通过这个工具,我们可以得到.dll文件所需要的依赖项。在运行打包后的exe常常遇到以下的问题:
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??这提示我们系统缺少caffe2_nvrtc.dll或其对应的依赖项。
  • 先到对应路径查看caffe2_nvrtc.dll是否存在
  • 若不存在,直接在Anaconda配置环境的文件夹搜索,一般都可以找到。将找到的caffe2_nvrtc.dll复制粘贴到根目录下
  • 若存在,说明是缺少caffe2_nvrtc.dll的依赖项,使用Dependencies工具查看所需要的依赖项,后补齐到根目录下
??Dependencies的使用非常简单,直接将.dll拖进去即可。这里以torch_python.dll举例
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??可以发现,缺少若干个dll文件,补齐便可。通过上述方法,依样画葫芦,基本可以解决关于dll报错的问题。
??但每次重新打包后,需要手动复制粘贴dll文件,很是麻烦,通过配置.spec文件可简化操作。以记事本方式打开.spec,找到datas:
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??小括号内有两个路径,第一个路径'kernel32.dll'表示原始数据路径,存放kernel32.dll的路径;第二路径为'.'表示目标路径,打包后原始数据存放的路径。意思就是将第一路径的东西在打包后,放在第二路径上。需要注意的是,这边我设置的是相对路径,相对于.spec中的pathex
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

三、在新电脑上测试 ??我使用的是pytorch的GPU版本,在新电脑上运行发现会报如下错误,应该是缺少cuda库的缘故。
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??我的解决办法简单粗暴,直接拷贝cuda包到移动硬盘
【Pyinstaller打包Pytorch框架所遇到的问题】Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??每次到新的电脑,添加cuda到环境变量
Pyinstaller打包Pytorch框架所遇到的问题
文章图片

??建议在程序额外设置一个选项,可将网络切换成CPU推理,以便在其他电脑测试时,即使环境未配置成功,也可通过CPU推理验证打包成功与否。最后,祝大家好运,打包成功那一刻是蛮喜悦的!
参考资料
  • python项目(非单一.py文件)用Pyinstaller打包发布成exe,在windos上运行程序
  • 嘗試使用Pyinstaller打包yolov5中detect.py文件(含pytorch框架)所遇到的問題
  • pyinstaller打包经验分享以及一些错误解决方法~~
  • Dependencies安装链接

    推荐阅读