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 环境,这是获得预期加速的唯一途径。如有其他问题,欢迎继续交流。

相关推荐
weixin_46846685几秒前
机器学习与深度学习新手区分指南
人工智能·python·深度学习·机器学习·计算机视觉·ai·机器视觉
AI算法沐枫几秒前
基于YOLO26深度学习的【果园荔枝检测与计数】系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
开发语言·人工智能·python·深度学习·qt·学习·机器学习
AI服务老曹1 分钟前
统一安防底座:基于 GB28181 与 RTSP 的边缘计算 AI 视频管理平台架构演进(附 Docker 部署与源码交付机制)
人工智能·音视频·边缘计算
逻辑君1 分钟前
Foresight研究报告【20260010】
人工智能·算法·机器学习
中电金信2 分钟前
中电金信分布式核心系统与鲲鹏实现“原生开发”,共筑数智金融新范式
大数据·人工智能
嘛也学不会2 分钟前
0 吴恩达-AI agent 理论
人工智能·教程·设计原则·agnet 工作流·吴恩达 agent ai 课程
独孤--蝴蝶2 分钟前
BERT在开发中的一些方法的应用以及讲解
人工智能·深度学习·bert
实在智能RPA3 分钟前
AI Agent 赋能金融反洗钱,自定义风控规则如何落地?
人工智能·ai·金融
一切皆是因缘际会4 分钟前
AI高速迭代下的技术风险与理性突围
大数据·数据结构·人工智能·架构
追光者♂4 分钟前
【测评系列3】CSDN AI数字营销实测体验官:测试 开源项目——Superpowers 游戏引擎从零开发实战指南
人工智能·深度学习·机器学习·typescript·开源·游戏引擎·superpowers