onnxruntime 安装后 GPU 没加速?3 条命令确认它跑在 CPU 还是 GPU
onnxruntime 安装完,pip install onnxruntime 没报错、代码也出结果了,于是你以为 GPU 在干活。
其实它跑的是 CPU。
我在这台机器上完整复现了一遍,全程有原始输出。下面每一步都能照抄。
先看结论:三条命令
bash
# 1. 装的到底是哪个包
pip list | grep -i onnxruntime
# 2. 运行时实际启用哪个 provider
python3 -c "import onnxruntime as ort; print(ort.get_available_providers())"
# 3. 会话真正用的是哪个(最关键,别省)
python3 -c "
import onnxruntime as ort
s = ort. InferenceSession('你的模型.onnx', providers=['CUDAExecutionProvider'])
print(s.get_providers()) # ← 打印的不是你指定的,就是被回退了
"
第 3 条是重点。providers= 是"我希望用",get_providers() 才是"实际用了"。 这两个不一样的时候,程序不会报错。
坑一:onnxruntime 和 onnxruntime-gpu 是两个包
这一条坑掉的人最多。它们名字只差一个后缀,装的却是完全不同的东西:
| 包名 | 装出来是什么 |
|---|---|
onnxruntime |
只有 CPU |
onnxruntime-gpu |
CPU + CUDA + TensorRT |
我实测装 onnxruntime(CPU 版)后的输出:
$ pip install onnxruntime
Successfully installed coloredlogs-15.0.1 flatbuffers-25.12.19 humanfriendly-10.0
mpmath-1.3.0 numpy-2.2.6 onnxruntime-1.23.2 packaging-26.3 protobuf-7.36.2 sympy-1.14.0
$ python3 -c "import onnxruntime as ort; print(ort.get_available_providers())"
['AzureExecutionProvider', 'CPUExecutionProvider']
只有 CPUExecutionProvider。 一行 GPU 的影子都没有。
想用 GPU 就装另一个:
bash
pip install onnxruntime-gpu
装完 provider 列表立刻变长:
['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']
注意 :onnxruntime-gpu 不会自动卸掉 onnxruntime,两个包可以同时存在(我这边就是两个都在)。官方要求不要同时装,容易互相盖文件:
bash
pip uninstall onnxruntime onnxruntime-gpu -y
pip install onnxruntime-gpu # 需要用哪个就装哪个
坑二:列表里有 CUDA,不等于真的能用
装完 onnxruntime-gpu,get_available_providers() 里就有 CUDAExecutionProvider 了。
但这里有个陷阱 :我换了一台没有 NVIDIA 显卡的机器测,列表里照样有 CUDA。
原因是:provider 列表反映的是这个包内置了哪些后端 ,不是你这台机器能不能跑 。有没有显卡、驱动装没装,要等到真正建会话那一刻才知道。
坑三:指定了 CUDA,它却悄悄退回 CPU
这是最坑的一个。看我的实测:
python
import numpy as np, onnxruntime as ort
sess = ort. InferenceSession('add.onnx', providers=['CUDAExecutionProvider'])
print(sess.run(None, {'X': np.array([1.0, 2.0], dtype=np.float32)})[0])
print(sess.get_providers())
输出:
[2. 3.]
['CPUExecutionProvider'] ← 我指定的是 CUDA,实际是 CPU
程序没报错,结果也正确,就是没用 GPU。
为什么?因为 onnxruntime 在 CUDA 加载失败时会回退到 CPU 并继续跑,只在日志里留一句警告。真正的原因藏在 stderr 里:
[E:onnxruntime:Default, provider_bridge_ort.cc:2251 TryGetProviderInfo_CUDA]
[ONNXRuntimeError]: 1: FAIL: Failed to load library libonnxruntime_providers_cuda.so
with error: libcublasLt.so.12: cannot open shared object file: No such file or directory
[W:onnxruntime:Default, onnxruntime_pybind_state.cc:1013 CreateExecutionProviderFactoryInstance]
Failed to create CUDAExecutionProvider.
Require cuDNN 9.* and CUDA 12.*. Please install all dependencies as mentioned in the GPU
requirements page (https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements),
make sure they're in the PATH, and that your GPU is supported.
读这两行就够了:
libcublasLt.so.12: cannot open shared object file: 缺 CUDA 的运行时库Require cuDNN 9.* and CUDA 12.*: 版本要求写得很死:CUDA 12.x + cuDNN 9.x,缺一不可
所以想真正启用 GPU,得先确认这三样:
bash
nvidia-smi # 驱动在不在、能看到显卡吗
nvcc --version # CUDA 版本,要 12.x
ls /usr/lib/x86_64-linux-gnu/libcudnn.so* # cuDNN 要 9.x
如果这套检查失败,别急着改代码:代码没问题,是环境没配好。
坑四:模型太新,onnxruntime 反而读不了
装完环境,加载模型时还可能撞这个:
onnxruntime.capi.onnxruntime_pybind11_state. Fail: [ONNXRuntimeError]: 1: FAIL:
Load model from add.onnx failed:...Unsupported model IR version: 14,
max supported IR version: 11
原因 :新版 onnx 库导出的模型 IR version 是 14,而 onnxruntime 1.23 最高只支持 11。
修法:导出模型时把 IR version 降下来,一行就够。
python
import onnx
model = ... # 你造好的模型
model.ir_version = 11 # ← 降到 onnxruntime 支持的上限
onnx.save(model, 'model.onnx')
改完立刻能加载(我这边改完就不报这个错了)。
怎么确认真用上了 GPU
把上面三件事连起来,就是一套完整的自检:
bash
# ① 包对不对
pip list | grep -i onnxruntime # 要有 onnxruntime-gpu
# ② 环境对不对
nvidia-smi && nvcc --version # 驱动 + CUDA 12.x
# ③ 会话对不对(最容易被忽略的一条)
python3 -c "
import onnxruntime as ort
s = ort. InferenceSession('model.onnx', providers=['CUDAExecutionProvider'])
print('实际 provider:', s.get_providers())
assert 'CUDAExecutionProvider' in s.get_providers(), '没跑在 GPU 上,去查上面两条'
"
只有第 ③ 条打印出 CUDAExecutionProvider,才算真的在用显卡。 前两条都过了、第 ③ 条还是 CPU,就去翻 stderr 里那行 [E:onnxruntime:...CUDA],里面会写清楚缺的是哪个库。
附:本文所有命令的实测环境
Python 3.10.12
onnxruntime 1.23.2 (CPU 版)
onnxruntime-gpu 1.23.2 (后装,与本机无 GPU 时对比 provider 列表)
onnx 1.23.2 (默认导出 ir_version=14)
前面每一段输出都是在这台机器上真跑出来的,不是从文档抄的。