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 --version 和 pip list | grep onnxruntime 输出,我帮您精确定位版本。

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

相关推荐
Hi202402171 小时前
Vortex CUDA 生态适配:让 CUDA C、CUTLASS 与 Triton 在 RISC-V GPGPU 上运行
人工智能·risc-v·gpgpu
龙腾AI白云4 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票4 小时前
企业对接AI合同审查系统的工程实践
人工智能
admin and root4 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA4 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
happylifetree5 小时前
Python09:核心语法-数据存储与运算-字面量
python
跨境小彭5 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
心之语歌5 小时前
Tkinter 画布基本梳理
运维·服务器·python
封印师请假去地球钓鱼5 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
AI搅拌机5 小时前
ComfyUI管理大师:安全稳定升级+切换指定版本!
人工智能