您在单图对比中发现 ONNX Runtime 是最慢的,这与预期(接近 TensorRT FP16 的速度)不符。结合您之前控制台出现的警告信息:
[W:onnxruntime:Default, onnxruntime_pybind_state.cc:1013 ...] Failed to create CUDAExecutionProvider. Require cuDNN 9.* and CUDA 12.* ...
根本原因 :您的 ONNX Runtime 环境 未能成功加载 CUDA 执行提供器 ,导致推理回退到 CPU 上运行,因此速度极慢(约 100-200 ms,而 GPU 预期仅 20 ms)。
以下是详细的问题分析和解决方案。
🔍 问题分析
1. CUDA 执行提供器加载失败
ONNX Runtime GPU 版要求严格匹配的 CUDA 版本 和 cuDNN 版本。您的环境可能:
- CUDA 版本不匹配(例如您用的是 CUDA 11.8,但 onnxruntime-gpu 需要 CUDA 12.x)。
- cuDNN 未安装或版本过低。
- 缺少 MSVC 运行时库。
这导致 ONNX Runtime 无法使用 GPU,自动回退到 CPU,因此推理延迟飙升。
2. 输入数据类型转换开销
即使使用 CPU,astype(np.float32) 和内存拷贝也会增加少量延迟,但不是主因。
✅ 解决方案(按优先级排序)
方案一:修复 ONNX Runtime GPU 环境(推荐)
1. 检查当前 CUDA 版本
在命令行执行:
cmd
nvcc --version
或
python
import torch; print(torch.version.cuda)
记下 CUDA 版本(例如 11.8 或 12.1)。
2. 安装匹配的 ONNX Runtime GPU 版本
根据您的 CUDA 版本,选择对应的 onnxruntime-gpu 包:
| CUDA 版本 | 安装命令 |
|---|---|
| CUDA 11.x | pip install onnxruntime-gpu==1.17.1 |
| CUDA 12.x | pip install onnxruntime-gpu==1.18.0 |
如果您不确定,可以先卸载旧版本再安装:
cmd
pip uninstall onnxruntime-gpu onnxruntime
pip install onnxruntime-gpu==1.17.1 # 适用于 CUDA 11.8
3. 验证 GPU 是否被识别
在 Python 中运行:
python
import onnxruntime as ort
print(ort.get_available_providers())
如果输出中包含 'CUDAExecutionProvider',则 GPU 可用。
方案二:若无法修复 GPU 环境,暂时移除 ONNX Runtime 配置
如果您暂时不想处理 CUDA 环境问题,可以在 GUI 中不使用 ONNX Runtime 配置 ,继续使用已验证的 TensorRT 混合优化 或 TensorRT 纯FP32,它们已经能提供足够的加速。
您可以在 GUI 的"选择配置"下拉框中直接选择其他配置,无需修改代码。
方案三:优化 ONNX Runtime 推理代码(小幅度提升)
即使 GPU 不可用,也可通过以下优化减少 CPU 推理开销:
修改 ONNXRuntimeInference 类
python
class ONNXRuntimeInference:
def __init__(self, onnx_path, use_fp16=True):
self.onnx_path = onnx_path
self.use_fp16 = use_fp16
self.session = None
self._init_session()
# 获取输入输出名称,避免每次 run 时查找
self.input_name = self.session.get_inputs()[0].name
self.output_name = self.session.get_outputs()[0].name
def _init_session(self):
sess_options = ort.SessionOptions()
sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
# 优先 CUDA,不可用则 CPU
providers = [('CUDAExecutionProvider', {'device_id': 0}), 'CPUExecutionProvider']
self.session = ort.InferenceSession(self.onnx_path, sess_options, providers=providers)
def infer(self, input_np):
# 确保输入是 float32 且连续
input_np = np.ascontiguousarray(input_np.astype(np.float32))
outputs = self.session.run([self.output_name], {self.input_name: input_np})
return outputs[0]
此优化减少了字典查找和字符串匹配开销,但 GPU 不可用时提升有限。
📊 预期修复后效果
| 配置 | 修复前延迟 | 修复后延迟(GPU 可用) |
|---|---|---|
| ONNX Runtime FP16 (剪枝10%) | ~150 ms (CPU) | ~20 ms (GPU) |
修复后,ONNX Runtime 的速度将与 TensorRT FP16 接近,同时稳定性更高。
🚀 立即行动建议
- 执行方案一:更新 onnxruntime-gpu 到匹配版本。
- 验证:重新运行 GUI,选择 ONNX Runtime 配置,测试单图对比,观察延迟是否降至 20 ms 左右。
- 若仍失败 :提供您的
nvcc --version和pip list | grep onnxruntime输出,我帮您精确定位版本。
请先尝试修复 GPU 环境,这是获得预期加速的唯一途径。如有其他问题,欢迎继续交流。