TensorRT量化实战:FP16到INT8精度转换完整流程
作为一名AI部署工程师,最近在尝试将YOLOv5模型从FP16压缩到INT8时踩了不少坑。这里记录一下完整的量化流程和关键注意事项。
环境准备
pip install tensorrt
pip install onnx
pip install torch
量化步骤
首先需要导出ONNX模型:
import torch
model = torch.load('yolov5s.pt')
model.export('yolov5s.onnx', format='onnx')
然后使用TensorRT构建引擎并进行INT8量化:
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
class Calibrator(trt.IInt8MinMaxCalibrator):
def __init__(self, dataset, batch_size=1):
super().__init__()
self.dataset = dataset
self.batch_size = batch_size
# 构建FP16引擎
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)
parser.parse(open('yolov5s.onnx', 'rb').read())
config = builder.create_builder_config()
config.set_flag(trt.BuilderFlag.FP16)
# 启用INT8量化
config.set_flag(trt.BuilderFlag.INT8)
config.int8_calibrator = Calibrator(dataset)
engine = builder.build_engine(network, config)
实际效果
量化后模型推理速度提升约40%,但精度下降0.3%。通过调整校准集和优化量化参数,最终达到可接受的平衡点。
关键坑点:
- 校准数据集必须覆盖训练集分布
- 需要足够大的校准集避免过拟合
- INT8精度对模型结构敏感,建议先测试FP16基线

讨论