TensorFlow-GPU结合PyInstaller打包分发程序失败问题求助
我之前也碰到过几乎一模一样的坑!结合你描述的情况(CPU版正常、GPU版脚本能跑但打包失败、已复制CUDA/cuDNN DLL),给你几个针对性的解决方案,按顺序试试应该能搞定:
先核对版本兼容性(最容易忽略的点)
TensorFlow 1.7.0对CUDA和cuDNN的版本有严格要求:必须是CUDA 9.0(不是9.1/9.2)和cuDNN 7.0.x,哪怕你复制了DLL,如果版本不匹配,打包后肯定跑不起来。先确认你用的CUDA/cuDNN是不是这个版本,要是不对,先换成对应版本再试。修改PyInstaller打包参数,强制导入缺失模块
PyInstaller经常会漏掉TensorFlow-GPU的一些内部依赖模块,你可以在打包命令里加上--hidden-import参数强制包含它们:pyinstaller --hidden-import tensorflow.python.pywrap_tensorflow_internal --hidden-import tensorflow.contrib --onefile your_script.py如果是用spec文件打包,就在
hiddenimports列表里添加这些模块:hiddenimports=['tensorflow.python.pywrap_tensorflow_internal', 'tensorflow.contrib', 'tensorflow.contrib.slim']在spec文件中明确指定CUDA/cuDNN的DATAS路径
手动复制DLL有时候会漏,不如直接在spec文件里配置让PyInstaller自动打包所有需要的DLL。比如你的CUDA安装在C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0,cuDNN在C:/Program Files/NVIDIA Corporation/cuDNN/v7.0,就把下面的内容加到spec文件的datas里:datas=[ ('C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/bin/*.dll', 'bin'), ('C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/lib/x64/*.dll', 'lib/x64'), ('C:/Program Files/NVIDIA Corporation/cuDNN/v7.0/bin/*.dll', 'bin') ]然后用
pyinstaller your_script.spec重新打包。检查打包后的DLL完整性
打包完成后,打开生成的dist文件夹,确认以下关键DLL都在里面:- CUDA相关:
cublas64_90.dll、cudart64_90.dll、cufft64_90.dll、curand64_90.dll、cusolver64_90.dll、cusparse64_90.dll - cuDNN相关:
cudnn64_7.dll
要是缺了,手动从CUDA/cuDNN的安装目录复制过来,再运行exe试试。
- CUDA相关:
调整PyInstaller版本
如果你用的是最新版PyInstaller,可能对TensorFlow 1.x的支持不够好,建议换成PyInstaller 3.4或3.5版本,这两个版本对TF1.7的兼容性更稳定。可以用pip安装指定版本:pip install pyinstaller==3.5
另外,运行打包后的exe时,要确保目标电脑安装了支持CUDA 9.0的NVIDIA驱动(版本384.xx及以上),不然也会报错。
内容的提问来源于stack exchange,提问作者Aleksk89




