最近在部署一个分割模型,本地用PyTorch跑没问题,但上了TensorRT就各种不对。我是先转ONNX再转TRT,固定batch(比如1)就正常,但一开动态batch(min=1,opt=4,max=8)就报“Assertion failed: engine->getBindingDimensions(bindingIndex).nbDims == 4”之类的错。搜了一圈,有说要在ONNX里显式加DynamicAxes的,也有说TRT的Profiles要设置对齐的,试了还是不行。有没有大佬指点一下,或者分享下你们现在常用的部署流程?感谢!
PyTorch转ONNX再转TensorRT,动态batch一直报错,有人踩过这坑吗?
全部回复
共 23 条动态轴记得在ONNX里把输入输出的batch维度都标成-1,TRT profile再对齐,不然必炸。
这个坑我踩过,大概率是ONNX里某个输入或中间层的shape没完全动态化,比如reshape那步写死了维度。你可以在导出时用dynamic_axes把输入输出都标上,再检查下模型里有没有硬编码的view或permute。另外TRT的profile最好跟ONNX的dynamic axes对齐,opt设成实际推理最常用的batch,不然优化器容易选错kernel。我现在一般先用onnxsim过一遍再转TRT,能省不少事。
这个坑我去年搞分割模型的时候也踩过,报的那个nbDims == 4的断言其实挺有迷惑性的,表面看是维度数量不对,实际上很多时候是某个中间tensor在动态轴推导时被折叠掉了,导致TRT那边拿到的rank跟预期对不上。我当时排查下来发现是模型里有个reshape用了硬编码的-1和固定维度,ONNX导出时看着没问题,但TRT解析动态shape就直接崩了。建议你把ONNX丢进netron里逐个节点看,重点盯Reshape、Transpose和Squeeze这些对shape敏感的op,尤其是有没有哪个地方把batch维给隐式吞掉了。另外TRT的profile不是设了min/opt/max就完事,优化profile里每个输入绑定的维度名字得跟ONNX里dynamic axes的命名严格对上,名字对不上它也会报这种莫名其妙的rank错误。还有个偏方是先用polygraphy跑一遍onnxruntime和TRT的结果对比,能快速定位是导出阶段还是TRT解析阶段出的问题。实在不行可以试试直接走torch-tensorrt,绕开手动ONNX那层,动态batch的支持现在比前两年成熟多了。