onnxruntime 安装后 GPU 没加速?3 条命令确认它跑在 CPU 还是 GPU

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)

前面每一段输出都是在这台机器上真跑出来的,不是从文档抄的。

相关推荐
尹人入圣40 分钟前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
Nuanyt1 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌1 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987372 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
专注仿真4 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放4 小时前
Python基础语法练习题(75)
开发语言·python·学习
黑十5 小时前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
threelab6 小时前
开源图片去水印代码
python
taller_20007 小时前
【012】数据类型入门: Excel 数据到 Python 值的转换
python·excel·pie·py
淡漠的蓝精灵7 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他