062、后训练量化(PTQ)的IR转换流程

📅 2026/8/20 13:15:33
062、后训练量化(PTQ)的IR转换流程
062、后训练量化(PTQ)的IR转换流程从一次凌晨三点的事故说起去年秋天,我接手了一个边缘端部署的视觉模型。模型在GPU上跑FP32精度时mAP 0.78,客户要求压到INT8,目标mAP不低于0.74。我心想PTQ嘛,calibration跑一遍,量化参数一算,IR一转换,完事。结果凌晨三点,模型在NPU上跑出了全黑输出——所有像素值都是0。不是精度下降,是彻底死掉了。排查了一整夜,最后发现是IR转换过程中一个ReLU6的量化边界处理出了问题。FP32下ReLU6的clip范围是[0, 6],量化到INT8时,零点(zero point)被设成了0,但scale计算时把6映射到了255。问题在于,ReLU6的输出在FP32下永远不会超过6,但量化后的INT8表示中,255对应的实际值是6.0,而输入中恰好有一个值因为浮点误差变成了6.000001,被clip到了255,再反量化时变成了6.0,但后续的卷积层在计算时把这个值当成了异常输入,导致整个tensor的统计量崩了。这个bug让我意识到:PTQ的IR转换不是简单的数学映射,而是一系列工程陷阱的集合。今天这篇笔记,我就把PTQ的IR转换流程拆开揉碎,重点讲那些文档里不会写、但实际调试中一定会踩的坑。PTQ的IR转换到底在做什么先明确一个概念:PTQ(Post-Training Quantization)的IR转换,本质上是把FP32的算子计算图,转换成带有量化参数(scale、zero point)的量化计算图。这个转换发生在MLIR的dialect之间,典型路径是: