4.2.3.9. 量化精度DEBUG思路

4.2.3.9.1. 基本的BaseLine

一般在认定QAT或者Quantized有精度问题的时候有统一的标准,当低于这个标准的时候,则可以认为量化的精度有问题。如果这个标准不能满足特殊任务的需求则需要单独处理。

4.2.3.9.1.1. 量化精度标准

总体指标:量化指标 >= 浮点指标 * 0.99

  • 单任务:总体指标 >= 浮点*0.99即为满足条件。部分子指标(如单个物体的检测指标)可能会有波动。

  • 多任务:每个任务的指标 >= 浮点*0.99即为满足条件。某些情况下,受到多任务训练的影响会有波动,部分任务的指标很高(大于100%),部分任务的指标稍低(低于99%)。

如果在实际执行过程中,发现QAT精度比量化精度标准低很少,比如0.x%的指标差距。这种情况可以优先考虑通过调参来解决,调参的经验参考:QAT经验总结 。如果差距很大,则可以继续下面的思路来解决每一部分精度很低的情况。

4.2.3.9.2. 常规的流程图

4.2.3.9.3. NAN的情况

如果在QAT阶段,出现指标完全不变的情况,或者出现明显的NAN报错。这种情况,一般可以认为是网络中出现NAN的情况,这种NAN的情况其实和浮点阶段类似。可以通过下面的方法来做好检查并避免QAT阶段的NAN现象。

  1. 检查浮点模型的精度是不是正常的。浮点阶段的模型如果有问题或者精度很低,QAT训练会有收敛的问题。

  2. 检查模型中是否有影响收敛的地方,比如常见的bug,检查方法和浮点中训练发散的情况一致。这个定位可能比较麻烦,比较常规的做法是量化部分模型,并分析这部分量化的影响。

  3. 如果没有发现任何问题的情况下,可以适当调小QAT阶段的lr。有时候加warmup也能解决,但是需要考虑warmup对最终指标的影响。

4.2.3.9.4. QAT精度过低

QAT是一个动态训练的过程,因此出现精度问题的影响因素很多。整个QAT训练从第一个epoch之后的提升能力大概在1-3个点(目前的经验),因此一般第一个epoch的指标较低的话就要考虑QAT是有明显精度问题的情况了。 在默认加上Calibration之后,如果精度还有问题的话,可以使用下面的几种工具来分析:

  1. 根据 QAT经验总结 提供的经验,对QAT的过程进行适当的调整,包括量化方法、超参、训练策略等。

  2. 通过 搭建量化友好的浮点模型 分析浮点模型中不适合量化的情况。根据分析的结果对浮点模型做适当的调整。

  3. 通过 模型精度DEBUG工具 提供的debug工具,来分析浮点模型和QAT模型中存在明显GAP的地方,通过调整部分int16或者浮点来解决。

4.2.3.9.5. quantized精度过低

目前QAT->Quantized的流程是固定的,同时在大部分的场景中已经验证转Quantized并不会出现明显的精度问题。 因此如果出现Quantized精度较低的情况,需要配合开发组一起来看。不过在出现Quantized精度低的情况下,也可以通过 模型精度DEBUG工具 中提供的相似度对比工具,来具体分析,是哪些分支,哪些层导致最终Quantized精度低的。