
ONNX → TensorRT 转换总失败?
这份 Checklist 让你一次成功!
"ONNX 导出成功,TensorRT 解析报错?"
"trtexec 卡在 'Building CUDA Engine' 一小时不动?"
"INT8 精度崩了,但不知道哪一步出错?"
在工业 AI 视觉部署中,ONNX → TensorRT 是从训练到推理的关键桥梁。
但算子不支持、动态 shape 配置错误、精度掉点等问题,常常让工程师"卡"数天。
本文整理了一份实战验证的转换 Checklist ,覆盖 导出 → 校验 → 构建 → 验证 全流程,助你避开 90% 的坑!
✅ 一、ONNX 导出阶段
| 检查项 | 正确做法 | 常见错误 |
|---|---|---|
| 输入尺寸固定 | dynamic=False(除非明确需要动态 batch) |
动态 shape 导致 TensorRT 构建失败 |
| Opset 版本 | 使用 opset=11 或 13(兼容性最好) | opset=17 可能含 TRT 不支持算子 |
| 权重类型 | 避免 INT64,强制转为 FP32/INT32 | 报错:"TensorRT does not support INT64" |
| 简化模型 | 运行 onnxsim 合并冗余节点 |
多余 Transpose/Reshape 导致解析失败 |
💡 命令示例:
bashpython -m onnxsim model.onnx model_sim.onpx --input-shape "1,3,640,640"
✅ 二、ONNX 校验阶段
| 检查项 | 工具/方法 |
|---|---|
| 结构合法性 | onnx.checker.check_model(model) |
| 算子支持性 | 对照 TensorRT Supported Ops |
| 关键算子替换 | Upsample → Resize(mode='linear' 需 TRT ≥8.5)SiLU → HardSwish(若 TRT 版本低) |
| 可视化拓扑 | Netron 打开 ONNX,检查是否有孤立节点 |
⚠️ 高危算子:
Gather+ 动态索引(TRT 支持有限)- 自定义 OP(需插件实现)
✅ 三、TensorRT 引擎构建阶段
| 配置项 | 推荐设置 | 说明 |
|---|---|---|
| 精度模式 | FP16 + INT8(若需量化) | 同时启用可 fallback |
| Workspace | ≥1GB(1 << 30) |
内存不足导致构建失败 |
| Optimization Profile | 明确设置 min/opt/max shape | 动态 batch 必须配置 |
| 校准器 | 继承 IInt8EntropyCalibrator2 |
MinMax 对小目标不鲁棒 |
🛠️ 调试技巧 :
使用
trtexec先测试:
bashtrtexec --onnx=model_sim.onnx --fp16 --workspace=2048
✅ 四、精度 & 性能验证阶段
| 验证项 | 方法 |
|---|---|
| 数值一致性 | 对比 ONNX Runtime 与 TensorRT 输出(L2 误差 <1e-3) |
| mAP 对齐 | 在相同测试集上运行,FP16 损失应 <0.5%,INT8 <1.5% |
| 吞吐量达标 | Jetson Orin 上 YOLOv8s FP16 ≥200 FPS |
| 内存稳定 | 连续推理 1 小时无 OOM |
🔍 快速诊断脚本:
python# 伪代码:输出层逐元素对比 diff = np.abs(trt_output - onnx_output).max() assert diff < 1e-2, f"数值偏差过大: {diff}"
💬 结语
ONNX → TensorRT 转换,不是"能不能跑通",而是"是否稳定可靠"。
一次成功的转换,背后是数十个细节的精准把控。
把这份 Checklist 打印出来,贴在工位上------
下次转换,一次过!