ONNX Runtime 相关推理代码:
# runtime
ort_session = onnxruntime.InferenceSession('yourmodel.onnx', providers=['CUDAExecutionProvider'])
# double check is using GPU?
print(ort_session.get_providers())
# onnx 的输入是 numpy array 而非 tensor!(具体看你怎么转换的)
ort_inputs = {'input': numpy_input}
ort_output = ort_session.run(['output'], ort_inputs)[0]
# 将 onnx 输出的 tensor 转回 numpy
ort_output = torch.from_numpy(ort_output)
报错:
[E:onnxruntime:Default, provider_bridge_ort.cc:1548 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1209 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.11: cannot open shared object file: No such file or directory
[W:onnxruntime:Default, onnxruntime_pybind_state.cc:861 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Please reference https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirementsto ensure all dependencies are met.
['CPUExecutionProvider']
解决方案:
-
根据报错提供的链接 https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html 查找对应的 ONNX Runtime,CUDA 和 cuDNN 版本,我这里是 ONNX Runtime 1.17,CUDA 12.2 和 cuDNN 8.9.2
-
有两个坑
-
第一坑:对于 CUDA 12.2 的 ONNX Runtime 1.17 需要用以下命令下载才行,不能用一般的pip install onnxruntime 或 pip install onnxruntime-gpu,相关文档:https://onnxruntime.ai/docs/install/
pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
-
第二个坑,下载 cuDNN 要从 archive 里找 https://developer.nvidia.com/rdp/cudnn-archive 不能下载 cuDNN 现在推荐的 cuDNN 9.0 ,下载老版本的 cuDNN 时可以参考 cuDNN 9.0 的下载命令 https://developer.nvidia.com/cudnn-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
-
都下载好后,查看 onnxruntime,cuda 和 cudnn 三个版本的 bash 分别如下:
# 查看 onnxruntime 版本
python
Python 3.10.0 (default, Mar 3 2022, 09:58:08) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import onnxruntime
>>> print(onnxruntime.__version__)
# 输出 onnxruntime 版本
1.17.1
# 查看 cuda 版本
nvcc -V
# 输出 cuda 版本是 12.2
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0
# 查看 cudnn 版本
apt-cache search cudnn
# 输出 cudnn 版本是 8.9.2.26
nvidia-cudnn - NVIDIA CUDA Deep Neural Network library (install script)
libcudnn8 - cuDNN runtime libraries
libcudnn8-dev - cuDNN development libraries and headers
libcudnn8-samples - cuDNN samples
cudnn-local-repo-ubuntu2204-8.9.2.26 - cudnn-local repository configuration files
- 此外可能还需要设置PATH、LD_LIBRARY_PATH
这是让onnxruntime找到cuda的关键一步。
操作如下:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
可以将上面的操作放到~/.bashrc中,然后使用source更新一下。
- 大功告成,重新运行代码时,同时出现 [‘CUDAExecutionProvider’, ‘CPUExecutionProvider’]
参考博客:https://zhuanlan.zhihu.com/p/492040015
模型转换参考:https://zhuanlan.zhihu.com/p/477743341