(2024.7.2)
使用TensorRT处理动态输入形状推理时出现的错误,本案基于官方demo文件,已解决:
TensorRT版本10.0,官方例子使用的是这个https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDemo/TensorRT-10.0/main_pytorch.py。
首先本人的环境是没问题的,将trt_file设为使用静态形状推理的引擎时没有任何问题,输出结果正常。
问题一
问题在于使用动态形状推理的引擎时(从onnx模型转过来,h和w维度未指定,shape值为-1),出现如下错误([TRT] [E] IExecutionContext::setInputShape: Error Code 3: API Usage Error (Parameter check failed, condition: engineDims.nbDims == dims.nbDims. ):
此问题在于第77行
context.set_input_shape(input_tensor_name, data.shape)
时返回了False。这是因为本引擎的推理输入维度为(B, C, H, W),而官方推理中的输入维度为(C, H, W),故将此代码维度中的输入reshape为(1, C, H, W)即解决此问题。
# data = torch.arange(3 * 4 * 5, dtype=torch.float32).reshape(3, 4, 5) # inference input data
data = torch.arange(3 * 4 * 5, dtype=torch.float32).reshape(1, 3, 4, 5) # inference input data
问题二
解决上述问题后,继续运行又遇到另一个问题:(IExecutionContext::getTensorShape: Error Code 7: Internal Error (/body/body.0/body/body.0/skff_mid/Concat: axis 3 dimensions must be equal for concatenation on axis 1. Condition ‘==’ violated: 4 != 3. Instruction: CHECK_EQUAL 4 3.)
这个问题非常奇怪,在这里找到不完美的解决方案。
说是“只能定位到是推理时的shape不是64的倍数导致的”。那么解决方案可以是:
- 修改输入形状(限制其一定要满足某种格式)(亲测可用)
data = torch.arange(3 * 4 * 4, dtype=torch.float32).reshape(1, 3, 4, 4)
- “就是生成engine的过程中,将opt_height和opt_width设为非64的倍数”
此二问题解决后,可以得到正常的动态形状推理结果。