解决方案
这个报错的意思是 ONNX Runtime 在尝试加载 CUDA 执行提供程序(CUDAExecutionProvider)时失败了,原因通常是 onnxruntime-gpu 版本和本机的 CUDA、cuDNN 版本不匹配,或者相关的动态链接库(DLL /.so 文件)找不到。
核心排查方向
版本匹配是关键:onnxruntime-gpu 对 CUDA 和 cuDNN 版本有严格要求。你可以参考 ONNX Runtime 官方文档确认对应关系,常见组合为:
- CUDA 12.x + cuDNN 9.x
- CUDA 11.x + cuDNN 8.x
操作步骤:
- 检查本机环境:通过
nvcc --version查看 CUDA 版本,通过cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR(Linux)或查看安装目录(Windows)确认 cuDNN 版本。 - 核对并安装匹配版本:根据你的 CUDA/cuDNN 版本,在官方文档找到对应的 onnxruntime-gpu 版本并安装。例如 CUDA 12.x 通常安装
onnxruntime-gpu==1.18.x或更新的版本。不要直接用pip install onnxruntime-gpu安装默认最新版,建议指定版本号。 - 检查环境变量:确保 CUDA 和 cuDNN 的 bin 目录(Windows)或 lib 目录(Linux)已添加到系统 PATH 或 LD_LIBRARY_PATH 中。
- 避免版本冲突:确保环境中没有同时安装
onnxruntime(CPU版)和onnxruntime-gpu,两者会冲突。
其他可能情况
- 缺少特定库文件:报错可能具体指出缺少哪个文件,如
libcudnn.so.9、libcublasLt.so.12等。这通常意味着对应库未安装或未加入路径,按提示补齐对应库文件即可。 - 降级或升级 onnxruntime-gpu:如果当前版本不匹配,可以尝试降级或升级到与你的 CUDA 环境匹配的版本。有案例是将
1.20.1降级到1.18.0后成功。
如果以上都排查无误但问题依旧,可以考虑使用 Docker 容器来隔离并标准化 CUDA 环境,避免本机环境干扰。