1.Tensorrt配置与流程
Pytorch->onnx->Tensorrt
2.TensorRT一致性对齐
如果出现TensorRT与pytorch模型结果/ONNX模型结果不一致的问题,可以从以下方式排查:
-
Tensorrt只支持int32类型,因此排查输入是否包含int64/long类型
-
排查模型结构中是否包含只支持int64/long输入类型的层/模型内部是否存在类型转换
-
进行算子替换,使其不依赖于TensorRT不支持的类型
-
只在送入类型强依赖层的时候,将依赖输入强转为int64/long类型。这种方案仍会出现TensorRT和onnx结果之间的差异,但能使得精度掉点影响范围最小化
-
-
模型权重是否存在超出int32范围的值
-
在生成onnx图的时候进行权重范围限定,clamp到int32的范围
-
def clamp_weights_to_int32(model):
for name, param in model.named_parameters():
if param.dtype == torch.int64:
print("param is:",param)
# 将权重转换为 int32
param.data = param.data.to(torch.int32)
# 钳制权重值到 INT32 范围
param.data = torch.clamp(param.data, min=-2147483648, max=2147483647)
for buffer_name, buffer in model.named_buffers():
if buffer.dtype == torch.int64:
buffer.data = buffer.data.to(torch.int32)
buffer.data = torch.clamp(buffer.data, min=-2147483648, max=2147483647)
return model
-
查看onnx计算图,定位到问题算子位置,进行算子/操作替换