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)

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

相关推荐
步行cgn1 小时前
Spring AOP 实战:安全日志
python·安全·spring
诺伦1 小时前
OpenAI Agents API 公测拆解:托管编排+持久会话+自有沙箱搭一条自动增长流水线 | RiseClaw玄策
python·openai·ai agent·营销自动化·agent编排
坊钰2 小时前
【LangGraph框架入门级】2. 图核心概念:State、Node、Edge 与 Reducers
python·ai编程·langgraph
wewowilling2 小时前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小猴子爱上树2 小时前
跨境电商AI图片翻译工具:批量图片翻译、视频字幕翻译与智能抠图一站式解决
大数据·人工智能·python·音视频
5G微创业2 小时前
去除抖音视频水印的Python实现
python·微信小程序·去水印
WeiXin_DZbishe2 小时前
基于微信小程序的本地闲置物品交易平台-计算机毕设 附源码【课程设计】26825
vue.js·spring boot·python·微信小程序·架构·php·课程设计
M--Y2 小时前
LangChain 提示工程:少样本提示与输出解析器
python·langchain·大模型·llm·输出解析器·少样本提示
朱包林2 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算