以下是使用 trtexec.exe 进行 INT8 量化的详细步骤及注意事项,结合多个实践场景和技术文档整理而成:
一、INT8 量化的核心步骤
1. 准备校准数据集
- 数据要求:需准备 100-1000 张代表性数据(如图像),用于统计激活值的动态范围。
- 格式要求:支持图像文件(如
.jpg、.png)或预处理后的.npy文件,需与模型输入形状完全一致(如BCHW格式)。 - 示例数据路径:
--calib=./calibration_data # 指定校准数据目录
2. 模型转换与量化参数设置
- 基本命令:
trtexec.exe --onnx=model.onnx --int8 --saveEngine=model_int8.engine --calib=./calibration_data - 关键参数:
--int8:启用 INT8 量化模式。--calib:指定校准数据集路径(需预处理后的数据)。--minShapes/--optShapes/--maxShapes:定义动态输入形状范围(如input:1x3x224x224)。--best:结合 FP16 和 INT8 混合精度,平衡速度与精度。
3. 校准与缓存生成
- 校准缓存文件:
首次运行时,TensorRT 会生成校准缓存文件(如calibration.cache),用于后续引擎构建的复用。 - 校准器类型:默认使用
IInt8EntropyCalibrator2,适合图像分类任务;其他场景可自定义校准器。
4. 动态输入与混合精度优化
- 动态输入支持:若模型支持动态 Batch 或分辨率,需显式指定形状范围:
--minShapes=input:1x3x224x224 --optShapes=input:8x3x224x224 --maxShapes=input:16x3x224x224 - 混合精度:
添加--fp16参数启用 FP16+INT8 混合量化,减少精度损失。
二、性能测试与验证
1. 推理性能测试
- 参数示例:
trtexec.exe --loadEngine=model_int8.engine --iterations=100 --duration=10 --percentile=95 - 关键指标:
- 延迟:关注
GPU Compute Time(纯推理耗时)。 - 吞吐量:通过
--iterations和--duration计算每秒处理量(FPS)。
- 延迟:关注
2. 精度验证
- 对比测试:分别运行 FP32、FP16 和 INT8 引擎,对比输出结果(如分类 logits、检测框位置)。
- 误差容忍度:通常 INT8 量化精度下降控制在 0.3%-1% 内可接受。
三、常见问题与解决方案
1. 精度下降严重
- 原因:校准数据不具代表性或预处理不一致。
- 解决:
- 确保校准数据分布与真实场景一致。
- 使用 QAT(量化感知训练)优化敏感层。
2. 校准失败或显存不足
- 原因:输入形状不匹配或显存限制。
- 解决:
- 显式指定
--workspace=4096(单位:MB)增加显存上限。 - 检查校准数据与
--optShapes是否一致。
- 显式指定
3. 动态模型量化效果差
- 原因:动态输入导致激活值范围不稳定。
- 解决:
- 为每个动态形状生成独立校准缓存。
- 使用
polygraphy工具分批次校准。
四、实战案例参考
YOLOv5 INT8 量化效果(Jetson Orin NX)
| 精度模式 | 推理耗时 | 显存占用 | mAP@0.5 |
|---|---|---|---|
| FP32 | 37.1 ms | 800 MB | 27.8% |
| INT8 | 13.2 ms | 310 MB | 27.5% |
- 结论:INT8 速度提升 2.8 倍,显存节省 61%,精度损失仅 0.3%。
五、工具与资源推荐
- Polygraphy:简化校准流程,支持自定义数据加载脚本。
- Nsight Systems:分析量化后模型各层耗时,定位性能瓶颈。
- 官方文档:
- TensorRT 开发者指南
- trtexec 参数详解
通过上述步骤和工具,可高效完成 INT8 量化并验证其效果。若需进一步优化精度,建议结合 QAT 或调整校准策略
553

被折叠的 条评论
为什么被折叠?



