onnx模型不能直接被tensorrt加载,必须经解析、优化和序列化生成engine文件;需严格匹配onnx opset与tensorrt版本,导出时指定兼容opset并验证模型结构,python api中必须检查parser.parse返回值,避免静默失败。

ONNX 模型不能直接被 TensorRT 加载;必须经过显式解析、优化和序列化,生成 engine 文件才能部署。跳过中间的 onnx2trt(已弃用)或盲目调用 trt.OnnxParser 而不检查 parse 结果,90% 会静默失败。
确认 ONNX 模型是否被 TensorRT 支持
TensorRT 对 ONNX 算子的支持有严格版本对应关系,不是所有 ONNX opset 都能用。常见坑是导出时用了 opset=17,但 TRT 8.6 只支持到 opset=16。
- 查官方支持表:TRT 8.6 支持 ONNX opset 16,TRT 8.5 支持 opset 15 —— 不要高于目标 TRT 版本允许的 opset
- 用
onnx.checker.check_model(model)验证模型结构合法,再用onnx.shape_inference.infer_shapes(model)补全 shape 信息(TRT 解析器依赖它) - 导出 ONNX 时显式指定
opset_version=16,并关闭动态轴(除非你真需要),例如:torch.onnx.export(..., dynamic_axes=None)
用 Python API 构建 TensorRT engine 的关键步骤
别用已废弃的 onnx2trt 命令行工具;Python API 更可控,也方便调试 parse 失败原因。
- 创建
trt.Logger并设为trt.Logger.WARNING或更低,否则 parser 错误会被吞掉 - 用
trt.Builder创建 builder,设置max_batch_size(注意:TRT 8.4+ 默认 batch 维必须固定,动态 batch 需额外配置 profile) - 调用
parser.parse(model_serialized)后,**必须检查返回值**:if not parser.parse(...): raise RuntimeError("Failed to parse ONNX") - build 之前调用
network.get_input(0).shape确认输入 shape 已正确推导;若为-1,说明 shape 推断失败,需回溯 ONNX 导出逻辑
处理常见报错:「No importer registered for op」或「Assertion failed: convert_onnx_weights」
这两类错误基本都指向 ONNX 模型含 TRT 不认识的算子或权重格式异常。
-
No importer registered for op:通常是用了自定义 op、实验性 op(如NonMaxSuppression在旧 TRT 中不支持),或 ONNX 算子属性名/值不符合 TRT 期望(例如axis写成axis_i) -
convert_onnx_weights断言失败:常见于权重含INT64类型(TRT 只接受FLOAT32、INT32、BOOL),用onnx.helper.convert_model_to_single_float32或手动 cast 权重 - 临时方案:用
polygraphy surgeon sanitize清洗模型(polygraphy surgeon sanitize model.onnx -o clean.onnx),它能自动降级 opset、替换不支持类型
真正卡住的地方往往不在 build engine 这一步,而在 ONNX 模型本身是否“对 TensorRT 友好”——比如用了 torch.einsum、torch.scatter 或带 control flow 的 torch.where,这些在导出时容易变成不支持的 subgraph。与其反复调参,不如先用 netron 打开 ONNX,盯着输入输出 shape 和每个 node 的 op_type 看两分钟。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











