pyinstaller打包pytorch框架分类模型报错,
报错:pyinstaller OSError: could not get source code
解决思路:网上大部分资料都是降低torchvision,然后继续解决新的报错,这里提供另一个思路,就是直接把报错的框架代码注释了,项目急着部署,有点简单粗暴,各位大佬轻喷。
解决步骤:
首先可以看到该错误本质就是获取源码失败了,其实就是pyinstaller打包没有把这部分依赖引入进来,可能可以通过--add data另外引入包,不过我没有尝试,希望有大佬能指点一下。而我是直接修改torchvision源代码,其实就是把使用jit包的代码注释掉了以及把使用了jit的代码注释了。jit可以理解为pytorch版本的脚本语言,专门用来引入创建可序列化和可优化模型的方法。如果不确定项目是否有使用该模块或者改动源码是否有影响,可以做好备份先打包运行成功,最后试试模型推理效果。
1、看报错代码可以看出,是在torchvision/ops/misc.py路径使用到了jit,导致引入jit,因此需要到源码,找到torchvision/ops/misc.py使用jit的地方
如图所示FrozenBatchNorm2d类导致引入jit,因此继续追踪
最终锁定backbone_utils.py文件,需要此文件去除对FrozenBatchNorm2d类的使用,因为该类需要配合jit引入一些脚本。misc_nn_ops.FrozenBatchNorm2d是用来在预训练模型时候,冻结住bn的参数,大致就是训练模型才会使用到。
1、进入你所在的anaconda安装目录下,我的是
/opt/anaconda3/envs/classify/lib/python3.7/site-packages/torchvision/models/detection
2、修改backbone_utils.py文件,注释掉对jit的使用,注意一定要备份源码文件
3、下面这个步骤可能不需要,可以先尝试重新打包看看还会不会报错。我注释了上面代码之后发现还是有地方会去引用jit,所以还需要把jit相关脚本注释了。注意还是需要备份。
进入/opt/anaconda3/envs/classify/lib/python3.7/site-packages/torch/jit
修改frontend.py所在目录的__init.py文件,将jit.frontend引入去掉(这里可以看到也是在最上面的报错图里面出现的),
同时将相关函数全部去除。
4、最后重新打包,看看能否正常运行,如果可以运行还没完,再测试一下模型的推理效果和速度,如果和开发环境一致(主要确认注释了源代码是否有影响)即可宣布大功告成!
5、如果是其他类,只要判断对模型推理没影响也可以使用上述方法,当然,正规的操作还是多研究pyinstaller的正确使用姿势。
https://pyinstaller.org/en/stable/spec-files.html#adding-files-to-the-bundle
补充:另外我看github官网下也有issue在讨论,可以参考:
error about pytorch.jit when run *.exe · pyinstaller pyinstaller · Discussion #6230 · GitHub