AI学习者 · 2022年12月30日

量化部署必卷 | EasyQuant量化通过Scale优化轻松超越TensorRT量化

image.png

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、线性量化公式

image.png
image.png

3.2、Scale优化

神经网络模型的量化过程可以分为每一层,其中权值和激活分别被量化,并准备进行卷积操作。卷积层的量化情况如图1所示。

image.png

整个信息从神经网络的第一层传递到转换。它在神经网络的最终输出中引入了不可避免的噪声。大多数训练后工作使用KL散度方法来计算每一层的激活的Scale因子。通常,它们使用大约1000个校准数据来近似每一层的输入激活分布。对于每一层的权重Scale,通常使用绝对最大值作为阈值来确定Scale,因为较大的权重值总是主导结果。它们分别优化每个激活的Scale,而不优化权重Scale,这很容易导致误差积累。

它还忽略了优化原始和量化分布之间的相似性这一事实,这不能保证提高原始和量化卷积输出之间的相似。此外,这些方法主要针对激活和权重设计INT8量化,并需要INT32位来保存CNN推理过程中的所有中间结果。这需要更多的计算时间,并限制了它们的应用领域。

为了解决这一问题,作者提出了一种简单有效的Scale优化方法,该方法联合优化激活Scale和量化卷积输出之间的权重。此外,还提出了INT7量化推理,以进一步加速传统的INT8量化,并将其部署在真实的ARM平台上。

1、每层的最佳Scale

image.png

其中,将激活和权重缩放到固定的位宽度范围。一般来说,Scale越大,数值越大,就会饱和到量化范围的最大值。Scale越小,越小的数值就会四舍五入为零。

image.png

2、对整个网络的最优Scale

image.png

  • 将整个网络的优化划分为子问题,有助于减少优化的巨大搜索空间;
  • image.png

image.png

3.3、INT7训练后推理

在这里作者实现了对INT7训练后推理的高效设计。这里还讨论了详细的解释,以提供更多的见解,7位宽的意义。

image.png

量化在很大程度上依赖于硬件的特性,以利用低比特推理。在常规的卷积计算中,在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、图像分类

image.png

2、目标检测

image.png

3、人脸识别

image.png

4.2、INT7训练后量化

image.png

4.3、在小于7-bits时的比较

image.png

5、总结

本文从保持量化精度和部署延迟的角度,提出了一种基于Scale优化的方法来提高训练后的量化。作者提出的INT7量化推理不依赖于任何特定的框架,可以应用于任何线性训练后方案,以提高推理速度和准确性。它有利于真正的工业INT8训练后量化,而没有复杂的量化感知微调。

实验表明,该方法可以在各种任务和卷积结构中获得更好的量化模型精度。通过设计Int16中间存储和整数Winograd算法,在实际硬件平台上,与TRT方法相比可以以更低的精度降低进一步提高推理速度。

6、参考

[1].EasyQuant: Post-training Quantization via Scale Optimization.

作者: 小书童
文章来源:集智书童

推荐阅读

更多嵌入式AI干货请关注 嵌入式AI 专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
16328
内容数
1218
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息