TensorRT动态Batch和动态宽高的实现
学习一下TensorRT中动态宽高和动态Batch的实现方式。
TensorRT之动态Batch和动态宽高
动态Batch
该特性的需求主要源于TensorRT
编译时对batch的处理,若静态batch则意味着无论你有多少图,都按照固定大小batch推理。耗时是固定的。
实现动态Batch的注意点:
1.onnx导出模型是,注意view操作不能固定batch维度数值,通常写-1。 2.onnx导出模型是,通常可以指定
dynamic_axes
(通常用于指定动态维度),实际上不指定也没关系。
动态宽高
该特性需求来自onnx
导出时指定的宽高是固定的,TensorRT
编译时也需要固定大小引擎,若你想得到另外一个不同大小的TensorRT
引擎(一个eng模型只能支持一个输入分辨率)时,就需要动态宽高的存在。而直接使用TensorRT
的动态宽高(一个eng模型能支持不同输入分辨率的推理)会带来不必要的复杂度,所以使用中间方案:在编译时修改onnx
输入实现相对动态(一个onnx模型,修改参数可以得到不同输入分辨率大小的eng模型),避免重回Pytorch
再做导出。
实现动态宽高的注意点:
1.不建议使用
dynamic_axes
指定Batch以外的维度为动态,这样带来的复杂度太高,并且存在有的layer不支持。 2.如果onnx
文件已经导出,但是输入的shape固定了,此时希望修改onnx
的输入shape: 步骤一:使用TRT::compile
函数的inputsDimsSetup
参数重新定义输入的shape。 步骤二:使用TRT::set_layer_hook_reshape
钩子动态修改reshape的参数实现适配。
动态Batch demo:
|
|
动态宽高 demo:
|
|
最后修改于 2023-05-16
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。