前言
在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。
直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。
本文分析这个问题和提供解决方案,供大家参考。
问题分析——找不到ONNX Runtime GPU 动态库
首先直接运行python程序是正常使用GPU的,说明CUDA和cuDNN版本和安装都没问题,程序能找到相关CUDA库。
使用PyInstaller将.py文件打包为.exe后,只能用CPU推理了,因为它检测不到 GPU 加速所需的库。
这通常是因为打包时没有正确包含 onnxruntime 所需的 CUDA 库:
- onnxruntime_providers_cuda.dll
- onnxruntime_providers_shared.dll
解决方案
在使用PyInstaller命令打包时,通过--add-binary 添加 ONNX Runtime GPU动态库就可以啦
其中,需要把onnxruntime_providers_cuda.dll、onnxruntime_providers_shared.dll这两个库加进来
比如原来的打包命令:
pyinstaller --onefile server_v2.0.py
添加GPU动态库后的打包命令:
pyinstaller --add-binary "C:/Users/86775/anaconda3/envs/gRPC_python/Lib/site-packages/onnxruntime/capi/onnxruntime_providers_cuda.dll;./onnxruntime/capi" --add-binary "C:/Users/86775/anaconda3/envs/gRPC_python/Lib/site-packages/onnxruntime/capi/onnxruntime_providers_shared.dll;./onnxruntime/capi" --onefile server_v2.0.py
- onnxruntime_providers_cuda.dll,这个库可以用everying在电脑中搜索一下,找到文件所在的路径,填进来就可以了;
- onnxruntime_providers_shared.dll,这个库可以也用everying在电脑中搜索一下,找到文件所在的路径,填进来就可以了;
如下图所示,能看到运行exe后能使用CUDAExecutionProvider,成功GPU和CUDA加速模型推理 :
session = ort.InferenceSession(weights, providers=['CUDAExecutionProvider'])
# 检查是否使用CUDA
providers = session.get_providers()
print(f"Available providers: {providers}")
分享完成~