又挖来美团的东西~~ 不知道大伙用过没哦,无需任何Trick,极致缩小量化性能差距!提出量化友好方案
解决结构重参数模型的量化时性能下降问题,无需任何技巧,采用标准PTQ,RepVGG在ImageNet上的精度下降就能保持在2%以内。
论文链接:https://arxiv.org/abs/2212.01593
性能与推理速度间的均衡在实际应用中非常重要,而结构重参数机制是达成该均衡的一种非常有效的模块。但是,因结构重参数训练得到的模型在面临量化时却出现了严重的性能下降(比如RepVGG-A0经PTQ量化,指标从72.4%下降到了52.2%)。
本文旨在挖掘产生该现象的根本原因,提出了一种简单、鲁棒且有效的补救措施,在享有重参数的优势同时具有量化友好特性。所提方案大幅缩小了RepVGG在INT8与FP32之间性能差距。无需任何技巧,采用标准PTQ,RepVGG在ImageNet上的精度下降保持在2%以内。
在标准量化流程中,有多个地方会引入误差。作者采用MSE进行量化误差度量:
C1:权值分布有利于量化;
C2:激活张量分布易于进行量化。
首先,我们采用官方Code复现RepVGG-A0性能,见上表。这里,我们采用标准PTQ对RepVGG-A0进行量化并评估INT8精度。
上图给出了复现模型的权值分布,可以看到: 权值很好的分布在零附近,没有特别的异常值存在,即满足上述C1条件。这就是促使我们对C2进行验证是否激活张量导致的量化性能极具恶化。不幸的是,激活张量具有输入依赖性且与权值相耦合,无法通过对输入分布进行假设并得出具体结论。相反,我们对每个分支的标准差进行分析
在模型训练过程中,有一个针对weight decay设计的重要但容易被忽视的成分:custom L2(它有助于改善精度,促进量化)。该部分损失12_loss_eq_kernel表示如下
该损失将通过增大分母来减小损失,而这则会放大激活张量的方差,为量化带来难度。为此,作者通过提出分母提出了一个简单的替代方案:
下表给出了此时的结果,移除分母项后,FP32模型的精度下降了0.7%,但量化精度提升到了61.2%。尽管该精度在实际场景仍无法接受,但该实验表明:常规L2权值衰减策略通过重分配权值分布构建了一个更强的FP32模型,但同时增大的激活张量的方差,导致了量化崩塌。
Quantization-friendly Reparameterization
接下来,作者提供了多个配置(S1-S4)逐步解决量化崩塌问题,核心结果见下表。
S1(Normal L2):即前述customL2到标准weight decay的替换,我们诚挚为S1。结果见上表,可以看到:尽管FP32精度下降0.5%,但INT8精度提升11.3%。此时,模型精度仍无法满足实际应用需求。那么是什么原因导致的呢?从下图可以看到:第5与6层权值具有较大的标准差(2.4, 5.1)和最大值(692.1107, 14477.3740),这就解释了为何量化性能不够好。
既然NormalL2已经对每个分支的卷积添加了约束,为何融合后的权值出现了如此大的异常值呢?基于公式2和3,作者重写公式如下:
S4(Post BN on S3) 由于三分支相加会引入协方差漂移问题,作者在三分支相加之后引入了一个额外的BN层以稳定训练,该配置称之为S4。此时,FP32模型精度提升到了72.2%,INT8精度提升到了70.4%。到此为止,我们成功解决了RepVGG的量化损失问题,并将所得模型称之为QARepVGG。 whaosoft aiot http://143ai.com
实验
本文主要聚焦ImageNet分类任务,同时采用YOLOv6验证所提方案的泛化性。关于PTQ,我们采用Nvidia开源的Pytorch量化工具,所有卷积与全连接层均被量化为8bit,量化机制为symmetric uniform。
上表给出了ImageNet分类任务上的性能对比,可以看到:
在FP32方面,所提方案取得了与RepVGG相当的精度;
在INT8方面,RepVGG存在严重的量化性能退化,如RepVGG-B0精度从75.1%下降到40.2%;所提方案量化精度损失在2%以内。
当带有组卷积时,RepVGG性能退化进一步加速,如RepVGG-B2g4指标从78.5%下降到了13.7%;而QARepVGG-B2g4仅损失0.7%。
上表给出了YOLOv6使用所提方案后的性能对比,从中可以看到:
YOLOv6s-RepVGG存在严重的性能退化问题,PTQ量化导致性能退化7.4%mAP;YOLOv6t-RepVGG稍好,但仍退化3%mAP。这个程度的性能退化在实际部署中是不可接受的。
在FP32模型方面,YOLOv6s/t-QARepVGG具有与RepVGG版相当的精度,而INT8量化版精度损失在1.3%mAP以内,甚至优于YOLOv6-RepOpt-VGG。此外,RepOpt-VGG对于搜索超参非常敏感。