8-bits量化已被广泛应用于各种深度学习应用中的加速网络推理。有两种量化方法,基于训练的量化和训练后量化。基于训练的方法遭受繁琐的训练过程,而训练后量化则可能导致不可接受的精度下降。
在本文中提出了一种通过Scale优化的高效且简单的后训练方法,即EasyQuant(EQ),该方法可以获得与基于训练的方法相当的精度。具体而言,首先在卷积输出处交替优化所有层的权重和激活Scale,以进一步获得高量化精度。然后,将权重和激活的比特宽度降低到INT7,并采用INT16中间存储和整数Winograd卷积实现来加速推理。
在各种计算机视觉任务上的实验结果表明,EQ优于TensorRT方法,在7-bits的后训练中可以达到接近INT8的精度。
1、简介
深度卷积神经网络(CNN)在各种计算机视觉任务中取得了相当大的成功,包括分类、检测和识别。然而,由于这些模型所需的巨大计算能力,在计算受限的设备上部署CNN并非易事。量化是减少CNN模型内存占用和计算量的关键技术。
与Float-32(FP32)模型相比,低bits位表示(例如8-bits宽或更低)通常导致精度损失。尽管与后训练方法相比,基于训练的方法可以获得更高的精度,但它们在实际应用中存在一些缺点。例如,训练量化的神经网络是一项耗时的工作,需要专家经验来指导整个训练过程,这会显著影响工作的成功。此外,在某些场景中,整个训练数据不可用于部署量化模型。
在本文中,通过有效地优化权重和激活的Scale,介绍了一种有效且简单的训练后量化方法。提出的Scale优化方法被命名为EasyQuant(EQ)。具体而言,首先将量化卷积过程公式化为优化问题目标,以最大化FP32和INT8输出之间的余弦相似性。这个问题通过交替搜索权重和激活Scale来解决。对于整个网络优化,逐层顺序优化Scale,并贪婪地获得每一层的最优量化Scale。在每一层中联合优化权重和激活的Scale,并基于前一层的量化结果优化下一层的权重和激活Scale。此外,采用INT16中间存储和整数Winograd算法来提高7-bits宽度背景下的真实硬件推理延迟。
最后,在常见计算机视觉任务(包括分类、检测和识别)的不同位宽设置下验证了本文的方法。
总之,本文主要贡献是:
- 提出了一种用于训练后量化的Scale优化方法,该方法交替搜索权重和激活Scale目标,并可以获得与基于训练的量化方法相当的精度。
- 将所提出的训练后量化方法应用于更高效的INT7量化推理框架,这提高了中间INT16存储的使用效率。
- 在各种计算机视觉任务上的大量实验表明,Scale优化方法可以在7-bits的情况下实现有效的INT8训练后量化和接近INT8精度,而无需微调。此外,在实际ARM平台上实现并测试了所提出的EQ INT7推理。
2、相关工作
大多数的量化工作大致可以分为两类,即基于训练的量化和训练后量化。基于训练的量化通常应用复杂的设计,从头开始训练一个低bit位整数模型,或微调一个预先训练过的FP32模型。训练后的量化通常会将预训练过的网络从浮点范围转换为整数范围,以校准应用的Scale。
2.1、基于训练的量化
基于训练的量化的早期工作通常学习更有限bits宽度(例如2-bits以下)的量化网络。由于bits宽度更为有限,这些方法通常会遭受巨大的精度下降。最近的工作集中于更高的bits宽度量化,以获得与FP32模型类似的精度。Mishra等人提出了wide reduced-precision网络,通过增加滤波器数量来克服精度下降,并在4-bits宽度内获得更好的精度。Zhou等人提出逐步量化网络的部分权重,以减少5-bits量化所涉及的训练困难。
在Pact中通过与任务损失相关的训练采用了优化量化阈值,以指导4-bits宽度的训练过程。这些工作都试图从头开始训练小于8-bits的模型,这很难获得与8-bits模型类似的精度。此外,它们需要特定的硬件和软件才能工作,因为大多数应用设备只支持通用的INT8量化模型。因此,在当前的工业应用中很少采用较低bits(4-bits)的基于训练的量化。
另一种基于训练的方法是量化感知训练(QAT)。量化白皮书提出了QAT方法作为一种补充方法,以恢复INT8量化导致的一些损失的精度。QAT模拟了传统训练过程中的量化噪声,并在Float 32范围内使用常规方法训练模型,这些方法通常用于从Float 32模型进行微调。Jain等人通过使阈值在常规训练过程中可训练来改进QAT,这可以看作是一种基于训练的Scale优化方法。由于这些工作没有在训练过程中应用复杂的设计,因此它们可以主要处理8-bits量化,而几乎不考虑来自中间存储的影响。此外,从头开始训练量化模型具有很高的时间复杂性,需要目标任务域和量化域的专家经验,尤其是在更复杂的任务中,如目标检测和人脸识别。
2.2、训练后量化
由于上述缺点,INT8训练后量化成为大多数实际量化应用的主要趋势。这一领域的研究包括英伟达的TensorRT(TRT)和谷歌的Tensorflow-Lite。TRT采用KL散度最小化方法来校准激活的量化阈值,并利用最大绝对值作为权重量化的阈值。Tensorflow-Lite利用最大绝对值作为激活的阈值,并加入了以最大绝对值作为阈值的每通道量化方法来量化权重。这两种方法根据简单的最大绝对值或统计特征来量化激活Scale和权重Scale,在一些预先训练过的网络中,这些网络仍然存在不可接受的性能下降。
后来,Yoni Choukroun等人改进了量化方法,将每个层量化过程视为通过交替黄金分割搜索解决的约束优化过程。由于量化张量的搜索空间很大,整个搜索过程非常耗时。Banner等人通过理论推导最佳限幅值,优化了激活阈值。分析表达式基于激活分布的严格假设,而这在实际模型中很少出现。在这项工作中联合优化了每一层的权重和激活Scale,并以减少卷积输出的量化效应为目标。由于不需要特定的硬件和进一步的假设,本文的方法对于各种模型的情况更加稳健。
2.3、工业实用性
量化技术的一个重要好处是可以减少边缘设备上的推理延迟,而边缘设备的计算能力有限。然而,在有关量化的文献中很少有讨论量化方法的适用性,而且在实际的量化部署中它不是通用的。为了减少一般的边缘设备,如ARM CPU的推理延迟,量化方法为推理时间内的卷积操作提供了量化的权值和激活。有些方法,例如BNN、BEQ以及TNT,它只将权重量化到不动点,很难用来加速真实的推理过程。此外,一些方法OMSE、XNORNet以及OCS确实将权值和激活都量化到不动点,但它们通常需要特定的硬件或软件来促进量化推理的实现。这阻碍了这些方法的广泛使用。
本文的方法量化了权重和激活,而不需要专门的硬件。此外,作者提出了一种关于INT7量化推理的指令级优化,以加速正常的INT8推理,这可以很容易地部署在一般硬件上,例如ARM平台。
3、本文方法
在本节中,首先制定线性量化过程。然后,详细介绍了所提出的Scale优化方法。此外,还讨论了INT7训练后推理的设计。
3.1、线性量化公式
线性量化过程可以表示为函数,其中是一个张量,S是一个正实数Scale因子。量化结果,其中为b位宽整数域。线性量化函数包括3个子过程,即。输入张量X和Scale因子S的线性量化公式可以表示为:
其中表示使用上限舍入将的输入张量舍入为整数,而“·”表示元素乘积。在线性量化的不同实现中,它可以采用不同类型的舍入(或)。表示张量中超出量化域范围的数值被剪裁。
定义一个量化的l层神经网络为分别为FP32范围内的第l层输入激活、权重和量化Scale因子。具体来说,量化Scale因子()包含2部分。第l层输入激活的Scale记为。第层权重的Scale记为。是应用于特征映射中的每个元素的非负实数。是输入权值的非负实数。为了便于讨论在每层量化方案中举例说明了所提出的方法。对于过通道量化方案,中的每个滤波器都应该有独立的Scale。此外,将预训练的FP32模型的第个输出特征图表示为,其对应的量化推理输出特征图表示为。
因此,在第层的整个线性量化前向卷积和反量化操作可以描述为:
其中,∗为卷积运算。第层的原始输出可以表示为:
从式(2)可以看出,Scale因子实际上控制了量化过程中的阈值,这在很大程度上影响了原始输出特征映射()和量化推理特征映射()之间卷积结果的余弦相似性。因此,目标函数侧重于优化权重()和激活()的尺度因子,并提高和之间的相似性。
3.2、Scale优化
神经网络模型的量化过程可以分为每一层,其中权值和激活分别被量化,并准备进行卷积操作。卷积层的量化情况如图1所示。
整个信息从神经网络的第一层传递到转换。它在神经网络的最终输出中引入了不可避免的噪声。大多数训练后工作使用KL散度方法来计算每一层的激活的Scale因子。通常,它们使用大约1000个校准数据来近似每一层的输入激活分布。对于每一层的权重Scale,通常使用绝对最大值作为阈值来确定Scale,因为较大的权重值总是主导结果。它们分别优化每个激活的Scale,而不优化权重Scale,这很容易导致误差积累。
它还忽略了优化原始和量化分布之间的相似性这一事实,这不能保证提高原始和量化卷积输出之间的相似。此外,这些方法主要针对激活和权重设计INT8量化,并需要INT32位来保存CNN推理过程中的所有中间结果。这需要更多的计算时间,并限制了它们的应用领域。
为了解决这一问题,作者提出了一种简单有效的Scale优化方法,该方法联合优化激活Scale和量化卷积输出之间的权重。此外,还提出了INT7量化推理,以进一步加速传统的INT8量化,并将其部署在真实的ARM平台上。
1、每层的最佳Scale
根据等式(2)优化了预训练卷积神经网络的比例因子,其中激活是从具有N个样本的给定校准数据集D生成的。它比普通的训练数据集少得多。在神经网络的第层,作者的方法可以表示为最大化输出特征图余弦相似性:
其中,将激活和权重缩放到固定的位宽度范围。一般来说,Scale越大,数值越大,就会饱和到量化范围的最大值。Scale越小,越小的数值就会四舍五入为零。
在这里采用交替优化方法分2个层次来解决这个问题。首先,是固定的,并解决权重调整的。其次,是固定的,并解决以微调激活Scale。和交替优化,直到收敛或超过时间限制。在这里,为了快速收敛,和分别以最大值或激活值初始化。对于和的搜索空间,将的区间线性划分为n个候选选项,并对它们进行简单的搜索策略。
在实验中,超参数的各种任务都具有鲁棒性。更先进的搜索方法可以用于搜索候选Scale,而在实验中作者发现,简单的搜索策略对目标函数的不规则波动具有更强的鲁棒性。
因此,作者在优化过程中应用了这些合理的初始化策略来解决这个问题。当在每个通道量化方案中优化权值Scale时,其中是c(该层中的滤波器数)维数的集合,这样可以在一个搜索过程中并行地调整每个kernel的独立Scale。
2、对整个网络的最优Scale
在前一节中,将介绍如何优化一层的最优Scale的激活Scale和权重Scale。将作者方法一层一层地应用于整个卷积神经网络。
对于每一层,从当前模型中获得输入激活,其中所有前一层都被量化和优化。从原始模型中收集输出特征图,而不进行量化。采用这种贪婪策略的好处是:
- 将整个网络的优化划分为子问题,有助于减少优化的巨大搜索空间;
- 当前层的优化考虑了来自所有前一层的累积噪声。
首先,对于一个L层卷积神经网络,采用提出的方法依次得到最优。算法1总结了积分模型量化中训练后层的Scale优化方法。
3.3、INT7训练后推理
在这里作者实现了对INT7训练后推理的高效设计。这里还讨论了详细的解释,以提供更多的见解,7位宽的意义。
量化在很大程度上依赖于硬件的特性,以利用低比特推理。在常规的卷积计算中,在ARM NEON指令集中,可以通过有符号向量乘加长指令(SMLAL)和有符号乘加长成对指令(SADALP)来实现。SMLAL指令乘法并添加8位元素以产生16-bits结果,而SADALP指令将两个相邻的16-bits结果添加到32-bits累加器中。使用这两个指令可以在ARM架构上有效地实现卷积过程。上面提到的数据流如图2所示。
在INT8量化中,安全的解决方案是使用32-bits寄存器来存储中间变量。然而,在CortexA处理器中的ARM V8.2-A架构之前,没有指令将2个8-bits寄存器号的乘法结果存储到一个32-bits寄存器中。因此,通用解决方案首先使用SMLAL来增加8位元素并产生16-bits结果,然后使用SADALP将两个相邻的16-bits结果添加到32-bits累加器中。
对于常规卷积运算,8-bits(8位有符号整数)推理只能进行2次SMLAL运算,而不会产生任何溢出,这是无效的。作者提出的7-bits(7位有符号整数)推理可以在没有溢出的情况下进行8次SMLAL,这与INT8推理相比更有效。与8-bits推理相比,它可以在将SMLAL运算添加到32位累加器之前进行更多的SMLAL操作。一般来说,INT7后训练方法可以更多地利用CPU效率,这在工业应用中很重要。
4、实验
4.1、INT8与INT7的对比
1、图像分类
2、目标检测
3、人脸识别
4.2、INT7训练后量化
4.3、在小于7-bits时的比较
5、总结
本文从保持量化精度和部署延迟的角度,提出了一种基于Scale优化的方法来提高训练后的量化。作者提出的INT7量化推理不依赖于任何特定的框架,可以应用于任何线性训练后方案,以提高推理速度和准确性。它有利于真正的工业INT8训练后量化,而没有复杂的量化感知微调。
实验表明,该方法可以在各种任务和卷积结构中获得更好的量化模型精度。通过设计Int16中间存储和整数Winograd算法,在实际硬件平台上,与TRT方法相比可以以更低的精度降低进一步提高推理速度。
6、参考
[1].EasyQuant: Post-training Quantization via Scale Optimization.
7、推荐阅读
FasterX实时目标检测 | 依托NanoDet思想,使用辅助Head进一步提升YOLOX性能