You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试ONNXRuntime中“CUDA kernel not found in registries for Op type”问题

ONNX模型性能慢于PyTorch的排查方案

一、确认算子是否在CPU执行

可以通过两种方式验证:

  • 开启详细日志:设置ONNXRuntime日志级别为VERBOSE,运行推理后日志会明确显示每个算子使用的执行提供方(CUDAExecutionProvider或CPUExecutionProvider)。示例代码:
import onnxruntime as ort

sess_options = ort.SessionOptions()
sess_options.log_severity_level = 0  # 0=VERBOSE级别
session = ort.InferenceSession(
    "your_model.onnx",
    sess_options,
    providers=["CUDAExecutionProvider", "CPUExecutionProvider"]
)
# 执行推理
outputs = session.run(None, {"input": your_input_tensor})

查看日志中类似Executing node [node_name] using CUDAExecutionProvider或CPUExecutionProvider的条目,即可确认算子的执行设备。

  • 启用性能分析:开启ONNXRuntime的profiling功能,生成的性能报告能直观展示每个算子的执行设备和耗时。示例代码:
sess_options.enable_profiling = True
session = ort.InferenceSession("your_model.onnx", sess_options, providers=["CUDAExecutionProvider", "CPUExecutionProvider"])
outputs = session.run(None, {"input": your_input_tensor})
profile_path = session.end_profiling()

可以用torch_tb_profiler加载生成的profile文件查看详细数据。

二、针对算子无CUDA kernel的调试步骤

1. 检查ONNX opset版本兼容性

ONNXRuntime的CUDA算子实现对opset版本有明确要求:

  • Resize:需要opset 11及以上才能支持完整的CUDA kernel
  • GridSample:需要opset 16及以上
  • Equal:低opset版本可能存在类型支持限制

可以用Netron可视化模型,查看每个算子的opset版本;或通过代码检查:

import onnx
model = onnx.load("your_model.onnx")
print(f"模型opset版本: {model.opset_import[0].version}")

2. 验证ONNXRuntime GPU安装正确性

确保安装的是带CUDA支持的ONNXRuntime版本:

  • 运行pip show onnxruntime-gpu,确认版本为1.20.1且包含CUDA依赖
  • 代码中检查可用提供方:
import onnxruntime as ort
print(ort.get_available_providers())

输出应包含CUDAExecutionProvider,否则说明GPU版本未正确安装。

3. 重新导出ONNX模型

从PyTorch导出时,指定兼容的opset版本并开启优化:

torch.onnx.export(
    model,
    dummy_input,
    "optimized_model.onnx",
    opset_version=17,  # 选择足够高的opset版本
    export_params=True,
    do_constant_folding=True,
    input_names=["input"],
    output_names=["output"],
    dynamic_axes={"input": {0: "batch_size"}}  # 按需开启动态维度
)

导出时避免使用PyTorch特有的未标准化算子,确保算子符合ONNX标准定义。

4. 算子兼容性排查

  • Equal算子:CUDA kernel仅支持输入张量类型一致(如均为float32或int32),若输入类型不匹配会自动 fallback到CPU,可在导出前统一张量类型。
  • Resize算子:确认插值模式(如linear或nearest)是否被CUDA支持,部分小众插值模式可能无GPU实现。
  • GridSample算子:检查输入的grid张量维度是否符合要求,若维度异常会触发CPU fallback。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:32:23