使用trtexec转换ONNX模型至TensorRT时出现INT64权重转换警告的问题求助
解决TensorRT转换ONNX时INT64权重转INT32的警告问题
我来帮你理清这个警告的来龙去脉,再给你几个可行的解决办法:
警告产生的原因
PyTorch默认会把部分模型参数、常量张量(比如固定的维度值、索引参数)设置为INT64类型。当你用torch.onnx.export()导出模型时,这些INT64类型的张量会被原封不动保留在ONNX文件里。但TensorRT对INT64的原生支持并不友好,它更倾向于用INT32处理整数运算,所以转换时会自动尝试把这些INT64权重向下转成INT32,这就是你看到的警告的由来。
虽然这只是个警告,但如果你的模型没有依赖INT64的特殊计算(比如处理超大尺寸的张量索引),最好还是解决掉这个问题,避免后续可能出现的类型不兼容隐患。
具体解决方法
方法1:导出ONNX前在PyTorch中转换张量类型
在导出模型之前,手动把模型里所有INT64类型的张量转成INT32:
- 处理模型参数:
# 遍历模型状态字典,转换INT64参数为INT32 for key in model.state_dict(): param = model.state_dict()[key] if param.dtype == torch.int64: model.state_dict()[key] = param.to(torch.int32) model.load_state_dict(model.state_dict())
- 处理模型内部常量:检查你的模型
forward函数,如果有用torch.tensor()定义的INT64常量(比如torch.tensor([224,224], dtype=torch.int64)),直接把dtype改成torch.int32。
完成这些操作后再导出ONNX,模型里的整数张量就都是INT32类型了。
方法2:修改已导出的ONNX模型
如果你已经导出了ONNX模型,可以用ONNX官方库直接修改模型的张量类型:
import onnx # 加载原始ONNX模型 onnx_model = onnx.load("your_original_model.onnx") # 遍历所有初始化张量(权重/常量) for initializer in onnx_model.graph.initializer: if initializer.data_type == onnx.TensorProto.INT64: # 修改数据类型为INT32 initializer.data_type = onnx.TensorProto.INT32 # 把INT64数据转成INT32并迁移到对应字段 initializer.int32_data.extend(initializer.int64_data) del initializer.int64_data[:] # 保存修改后的模型 onnx.save(onnx_model, "your_fixed_model.onnx")
之后用这个修改后的ONNX模型转TensorRT,警告就会消失。
方法3:调整ONNX导出参数
尝试使用更高版本的ONNX opset(比如opset 13及以上),新版本opset对整数类型的处理更规范,可能会自动避免INT64的问题:
torch.onnx.export( model, dummy_input, "your_model.onnx", opset_version=13, # 提高opset版本 do_constant_folding=True, # 开启常量折叠优化张量类型 export_params=True, fp16=True # 保留你的FP16导出设置 )
额外说明
如果你的模型确实需要处理INT64范围的数值(比如索引超过2^31-1),那这个警告可能意味着TensorRT无法很好支持你的模型逻辑,这时候需要重新评估模型设计或者寻找TensorRT的INT64兼容方案。但对于绝大多数常见的CV、NLP模型来说,INT32完全可以满足需求,上述方法应该能解决你的问题。
内容的提问来源于stack exchange,提问作者yy G




