You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TensorFlow-GPU结合PyInstaller打包分发程序失败问题求助

解决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.dllcudart64_90.dllcufft64_90.dllcurand64_90.dllcusolver64_90.dllcusparse64_90.dll
    • cuDNN相关:cudnn64_7.dll
      要是缺了,手动从CUDA/cuDNN的安装目录复制过来,再运行exe试试。
  • 调整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

火山引擎 最新活动