最近在部署一个检测模型,PyTorch转ONNX时设了dynamic axes,用onnxruntime测没问题。但转到TensorRT(8.6)就报“Invalid shape”或者干脆构建失败。网上教程都说设minShapes、optShapes、maxShapes就行,但我试了还是不行,感觉是维度顺序或者opset版本的问题?另外模型里有ROIAlign和NMS这类自定义op,是不是必须用plugin?有没有人用torch2trt或者onnx-tensorrt成功部署过带动态batch的检测模型?求分享个能跑通的配置或工作流,感激不尽。
楼主
2026-09-03
PyTorch转ONNX再转TensorRT,Dynamic shape一直报错,有踩坑的大佬吗?
请 登录 后发表回复
全部回复
共 22 条
2楼
2天前
ROIAlign和NMS在TensorRT里确实得靠plugin,TRT 8.6自带的内置版本对dynamic shape支持挺挑的,尤其NMS那块的输出维度跟batch绑得死,动态batch基本跑不通,得换EfficientNMS_TRT或者自己写plugin。opset版本也有坑,检测模型里如果有grid_sample之类的,建议至少用opset 16,不然onnx-tensorrt解析的时候会退化或者直接报shape infer失败。你那个Invalid shape大概率不是min/opt/max没设对,而是某个op在dynamic axes下推不出维度,可以用polygraphy跑一遍shape inference看看卡在哪一层。torch2trt对动态shape支持其实一般,它更擅长静态转换,动态batch还是走onnx-tensorrt或者trtexec更稳。建议先把dynamic axes只开batch维,H/W先固定死跑通,再逐步放开,不然多个动态维一起上很容易在某个op炸掉。
3楼
21小时前
ROIAlign和NMS在TensorRT里确实得走plugin,onnx-tensorrt对这两类op支持很有限,动态shape下更容易出问题。维度顺序那块建议把ONNX的输入输出shape打印出来逐个核对,尤其检测模型经常有NCHW和NHWC混着的情况。opset建议锁在11或13,太高版本TensorRT 8.6解析会抽风。动态batch可以先固定batch=1跑通再开dynamic,能排除不少干扰项。