ONNX Runtime安装

您在单图对比中发现 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 接近,同时稳定性更高。


🚀 立即行动建议

  1. 执行方案一:更新 onnxruntime-gpu 到匹配版本。
  2. 验证:重新运行 GUI,选择 ONNX Runtime 配置,测试单图对比,观察延迟是否降至 20 ms 左右。
  3. 若仍失败 :提供您的 nvcc --versionpip list | grep onnxruntime 输出,我帮您精确定位版本。

请先尝试修复 GPU 环境,这是获得预期加速的唯一途径。如有其他问题,欢迎继续交流。

相关推荐
QQ24221997923 分钟前
基于python+微信小程序的家教管理系统_mh3j9
开发语言·python·微信小程序
Neolnfra24 分钟前
拒绝数据“裸奔”!把顶级AI装进自己的硬盘,这款神仙开源工具我粉了
人工智能·开源·蓝耘maas
code_li25 分钟前
只花了几分钟,用AI开发了一个微信小程序!(附教程)
人工智能·微信小程序·小程序
飞Link40 分钟前
瑞萨联姻 Irida Labs:嵌入式开发者如何玩转“端侧视觉 AI”新范式?
人工智能
RSTJ_16251 小时前
PYTHON+AI LLM DAY THREETY-SEVEN
开发语言·人工智能·python
郝学胜-神的一滴1 小时前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
Aision_1 小时前
Agent 为什么需要 Checkpoint?
人工智能·python·gpt·langchain·prompt·aigc·agi
清水白石0081 小时前
《Python性能深潜:从对象分配开销到“小对象风暴”的破解之道(含实战与最佳实践)》
开发语言·python
小贺儿开发1 小时前
《唐朝诡事录之长安》——盛世马球
人工智能·unity·ai·shader·绘画·影视·互动
秋91 小时前
ESP32 与 Air780E 4G 模块配合做 MQTT 数据传输
人工智能