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

相关推荐
OneThingAI1 小时前
网心技术 | NemoClaw 深度解析,企业级 AI 运行时
人工智能·aigc·agent·openclaw·onethingai
2402_854808371 小时前
如何管理微服务下Oracle的数据库连接数_调整应用节点的MaxActive汇总以防止超processes
jvm·数据库·python
慕涯AI1 小时前
Agent 30 课程开发指南 - 第16课
人工智能·python
Shorasul1 小时前
如何修改数据库实例名_ORACLE_SID环境变量重命名实战
jvm·数据库·python
小程故事多_802 小时前
从基础Agent到复杂工作流,LangGraph如何用状态机重构智能体开发
人工智能·设计模式·重构·aigc·ai编程
几分醉意.2 小时前
Bright Data Web Scraping 实战:用 MCP + Dify 构建 Amazon 数据采集 AI 工作流(2026 指南)
大数据·人工智能·bright data mcp·dift
用户2018792831672 小时前
代码审查接招术receiving-code-review:一个让AI不再“舔狗”的魔法技能
人工智能
2301_803538952 小时前
如何在 Go 中精确安装指定版本的模块.txt
jvm·数据库·python
用户2018792831672 小时前
🕵️‍♂️ 程序员破案指南:像侦探一样用“系统性调试”(systematic-debugging)技能揪出Bug真凶
人工智能