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

相关推荐
chaojihaomai7 分钟前
AI电商商品图生成中的材质保真问题——扩散模型重建优先级分析与锁定式方案
人工智能·材质
大模型探索者2 小时前
2026 企业智能体平台选型指南:从通用到行业深耕,怎么选?
大数据·人工智能
深圳行云创新2 小时前
北极星知识图谱平台|太空越来越“拥挤”,知识图谱如何预测空间碎片碰撞风险?
人工智能·知识图谱
Am-Chestnuts2 小时前
国产AI多轮对话归档与多格式导出实践
人工智能·word
麻瓜生活睁不开眼3 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
workflower4 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
AKAMAI4 小时前
Linode接口及默认防火墙现已全面开放使用
人工智能·云计算
前端开发江鸟4 小时前
RAG 回答错了,问题到底出在召回、重排,还是生成?
人工智能
美狐美颜SDK开放平台5 小时前
直播app开发如何实现主播级美颜效果?美颜sdk开发方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美颜api
东方小月5 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端