跨层均衡 首先,我们应用跨层均衡(CLE),这是对完整精度模型的预处理步骤,使其更适合量化。CLE对于具有深度可分离层和张量量化的模型尤为重要,但对其他层和量化选择也经常显示出改进。
添加量化器 接下来,我们选择量化器,并在网络中添加量化操作,如第2.3节所述。量化器的选择可能取决于特定的目标硬件;对于常见的AI加速器,我们建议使用对称量化器来量化权重,并使用非对称量化器来量化激活。如果硬件/软件堆栈支持,则最好对权重使用逐通道量化。
权重范围设置 为了设置所有权重张量的量化参数,我们建议使用基于层的均方误差(MSE)准则。在特定情况下,对于逐通道量化,使用最小-最大方法可能更有利。
AdaRound 如果我们有一个小的校准数据集4可用,我们接下来应用AdaRound来优化权重的舍入。这一步骤对于实现低位权重量化(例如4位)的PTQ至关重要。
偏差校正 如果我们没有这样的校准数据集,并且网络使用批归一化,我们可以使用分析偏差校正。
激活范围设置 作为最后一步,我们确定网络中所有数据相关张量(即激活)的量化范围。对于大多数层,我们使用基于MSE的准则,这需要一个小的校准集来找到最小的MSE损失。或者,我们可以使用基于BN的范围设置来实现完全无数据的流程。
3.6 实验
我们现在评估上述PTQ流程在常见的计算机视觉和自然语言理解应用中的性能。我们的结果总结在表6中。对于语义分割任务,我们在Pascal VOC上评估DeepLabV3(使用MobileNetV2骨干),对于目标检测,我们在COCO 2017上评估EfficientDet。其余的计算机视觉模型在ImageNet分类基准上进行评估。对于自然语言理解,我们在GLUE基准上评估BERT-base。
在所有情况下,我们观察到对于所有模型,权重和激活的8位量化(W8A8)与浮点数相比仅导致微小的准确性损失(在0.7%以内)。对于W8A8,通常需要500到1000张未标记的图像作为校准集。
对于W8A8量化,我们也没有看到使用逐通道量化带来显著的收益。然而,当权重量化为4位(W4A8)时情况就不同了。对于ResNet18/50和InceptionV3,无论是逐张量还是逐通道量化,准确率下降仍然在浮点数的1%以内。然而,对于MobileNetV2和EfficientNetlite等更高效的网络,对于逐张量量化,准确率下降分别增加了2.5%和4.2%。这可能是由于深度可分离卷积的量化。在这种情况下,逐通道量化可以带来显著的好处。例如,在EfficientNetlite中,逐通道量化将准确率提高了2.8%,与全精度准确率相差1.4%。我们在EfficientDet-D1和DeeplabV3中也观察到了类似的效果,它们的骨干网络都使用了深度可分离卷积。
对于BERT-base,我们观察到一些激活张量在其动态范围上有极大差异。为了使PTQ仍然有效,我们使用我们在第3.7节中概述的调试过程识别了这些层,并将它们保持在16位。否则,BERT-base遵循与大多数其他模型相似的趋势,我们的PTQ流水线允许4位权重量化,GLUE分数下降不超过1.5%。
3.7 调试
我们展示了标准的PTQ流水线可以在各种模型和网络上实现有竞争力的结果。然而,如果在按照我们的流程步骤后,模型的性能仍然不令人满意,我们建议一组诊断步骤来识别瓶颈并改善性能。虽然这不是严格的算法,但这些调试步骤可以提供关于为什么量化模型性能不佳的见解,并帮助解决潜在问题。这些步骤在图9中以流程图的形式展示,并在下面进行了更详细的描述:
FP32稳定性检查: 一个重要的初始调试步骤是确保浮点和量化模型在前向传递中表现相似,特别是在使用自定义量化流水线时。
将量化模型的位宽设置为32位,包括权重和激活,或者如果可能的话,绕过量化操作,并检查准确性是否与FP32模型相匹配。
权重或激活量化: 下一个调试步骤是独立地确定激活或权重量化对性能的影响。如果将所有权重量化为更高的位宽,同时将激活保持在较低的位宽,性能是否恢复?或者反过来,如果所有激活使用较高的位宽,而权重使用较低的位宽,性能是否恢复?这一步可以显示激活和权重量化对整体性能下降的相对贡献,并指导我们选择适当的解决方案。
修复权重量化: 如果前一步显示权重量化导致了显著的准确性下降,则可以尝试以下几种解决方案:
• 如果尚未实施,应用CLE,特别是对于具有深度可分离卷积的模型。
• 尝试通道级量化。这将解决不均匀的通道权重分布问题。
• 如果有校准数据,则应用偏置校正或AdaRound。
修复激活量化: 为了减少激活量化引起的量化误差,我们还可以尝试使用不同的范围设置方法或调整CLE以考虑激活量化范围,因为普通的CLE可能导致不均匀的激活分布。
逐层分析: 如果全局解决方案未将准确性恢复到可接受水平,我们将逐个考虑每个量化器。我们将每个量化器依次设置为目标比特宽度,同时将网络的其余部分保持为32位(参见图9中的内部for循环)。
可视化层: 如果量化单个张量导致显著的准确性下降,我们建议在不同的粒度上可视化张量分布,例如,按通道(如图5所示)和维度(例如BERT中的每个标记或每个嵌入)。
修复单个量化器: 可视化步骤可以揭示张量对量化的敏感性的来源。一些常见的解决方案包括为该量化器设置自定义范围或允许问题量化器使用更高的比特宽度,例如BERT-base(表6)。如果问题得到解决并且准确性恢复,我们继续下一个量化器。如果没有,我们可能需要采用其他方法,例如量化感知训练(QAT),这在第4节中讨论。
完成上述步骤后,最后一步是将完整模型量化为所需的比特宽度。如果准确性可接受,我们就有了最终的量化模型可供使用。否则,我们可以考虑更高的比特宽度和更小的粒度,或者回到更强大的量化方法,例如量化感知训练。