调试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
相关产品推荐
相关产品推荐

