一、从一次深夜调试说起
上周三凌晨两点,我在产线测试间盯着屏幕上的mAP数值发愣。 同一个YOLOv5s模型,FP32版本在测试集上跑得好好的,mAP 0.68;转成INT8部署到边缘设备后,直接掉到0.51。 量化误差吃掉了整整17个点的精度——这已经不是误差,是灾难。
更诡异的是,同样的校准集、同样的PTQ(训练后量化)流程,上周还能保住0.62。 排查了一圈:校准集没污染、量化配置没改动、甚至换了台设备重烧固件。 最后发现,产线新采集的样本里多了些夜间低光照图片,模型对暗部细节的响应分布变了,而PTQ的校准过程对此毫无感知。
那一刻我彻底明白:静态PTQ就像给模型拍一张“标准照”,实际部署环境光照变了,照片还是那张照片,精度自然对不上。 要解决这个问题,必须让模型在训练阶段就“见过”量化是什么样子——这就是QAT(量化感知训练)要干的事。
二、QAT不是魔术,是模拟手术
很多人把QAT想得太玄乎,其实核心思想就一句话:在训练前向时模拟量化误差,让反向传播去适应它。 相当于在手术前先用VR模拟操作流程,等真上手术台时已经轻车熟路。
关键看这个模拟过程怎么实现。 早期有些团队自己写FakeQuantize节点,手动插到每个Conv和Linear层后面,代码写得像打补丁,后期维护简直噩梦。 现在主流框架(PyTorch的FX Graph Mode、TensorFlow的TFLite Converter)都提供了自动化插入工具,但自动化不代表没坑。



