【TensorRT 多输入】trtexec 如何对多输入的 onnx 模型进行序列化(转化)?

【TensorRT 多输入】trtexec 如何对多输入的 ONNX 模型进行序列化(转化)?

在将包含多个输入的 ONNX 模型转换为 TensorRT 引擎时,可以使用 trtexec 工具。以下是基于讨论中的总结步骤:

1. 基本用法

要使用 trtexec 转换多输入的 ONNX 模型,需要使用 --shapes 参数指定每个输入的形状。形状可以是静态的或动态的。例如:

trtexec --onnx=model.onnx --saveEngine=model.trt --shapes=input1:shape1,input2:shape2,...
2. 动态形状

对于动态形状,可以使用 --minShapes--optShapes--maxShapes 参数来指定输入的最小、最优和最大形状。例如:

trtexec --onnx=model.onnx --saveEngine=model.trt --minShapes=input1:min_shape1,input2:min_shape2,... --optShapes=input1:opt_shape1,input2:opt_shape2,... --maxShapes=input1:max_shape1,input2:max_shape2,...

动态维度通常用 -1 表示。

3. 具体示例

下面是一个包含动态输入的实际示例命令:

trtexec --onnx=encoder-temp_rnnt.onnx \
--saveEngine=encoder-trtexec.trt --minShapes=audio_signal:[1,80,1],length:[1] \
--optShapes=audio_signal:[1,80,1000],length:[1] \
--maxShapes=audio_signal:[1,80,10000],length:[1]

对于另一个具有多输入的模型:

trtexec --onnx=decoder_joint-temp_rnnt.onnx \
--saveEngine=decoder-trtexec.trt \
--shapes=encoder_outputs:[1,1024,1],targets:[1,1],target_length:[1],input-states-1:[2,1,640],input-states-2:[2,1,640]

个人的写法如下,可供参考,在 log 中可以详细地看到问题、或者模型转化的经过:

trtexec --onnx=model_1.onnx \
        --saveEngine=model_1.plan \
        --minShapes=pixel_seq:4x1,xy_seq:4x1x2,text:4x50 \
        --optShapes=pixel_seq:8x360,xy_seq:8x360x2,text:8x50 \
        --maxShapes=pixel_seq:16x562,xy_seq:16x562x2,text:16x50 \
        --verbose \
> trtexec-1.log 2>&1
4. 错误处理

如果遇到错误 stoi(StringToInteger Error),可能是因为形状格式不正确。例如,将 [1,1024,1] 改为 1x1024x1

trtexec --onnx=decoder_joint-temp_rnnt.onnx \
--saveEngine=decoder-trtexec.trt \
--shapes=encoder_outputs:1x1024x1,targets:1x1,target_length:1,input-states-1:2x1x640,input-states-2:2x1x640

同时确保 ONNX 模型的 batch 维度是动态的。

总结

通过正确指定输入的形状和动态范围,可以使用 trtexec 将多输入的 ONNX 模型成功转换为 TensorRT 引擎。在遇到问题时,检查形状格式和模型的批处理维度是解决问题的关键。

参考 TensorRT 官方 issue: https://github.com/NVIDIA/TensorRT/issues/2324

上一篇:发现XWPFDocument写入Word文档时的小BUG:两天的探索与解决之旅


下一篇:微信小程序开发,引用Vant Weapp UI样式,报错“没有找到可以构建的 NPM 包……”