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

简介: 量化部署必卷 | EasyQuant量化通过Scale优化轻松超越TensorRT量化(一)

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

线性量化过程可以表示为函数,其中是一个张量,是一个正实数Scale因子。量化结果,其中为b位宽整数域。线性量化函数包括3个子过程,即、和。输入张量和Scale因子的线性量化公式可以表示为:

image.png

其中表示使用上限舍入将的输入张量舍入为整数,而“·”表示元素乘积。在线性量化的不同实现中,它可以采用不同类型的舍入(、或)。表示张量中超出量化域范围的数值被剪裁。

定义一个量化的层神经网络为。、和分别为FP32范围内的第层输入激活、权重和量化Scale因子。具体来说,量化Scale因子()包含2部分。第层输入激活的Scale记为。第层权重的Scale记为。是应用于特征映射中的每个元素的非负实数。是输入权值的非负实数。为了便于讨论在每层量化方案中举例说明了所提出的方法。对于过通道量化方案,中的每个滤波器都应该有独立的Scale。此外,将预训练的FP32模型的第个输出特征图表示为,其对应的量化推理输出特征图表示为。

因此,在第层的整个线性量化前向卷积和反量化操作可以描述为:

其中,∗为卷积运算。第层的原始输出可以表示为:

image.png

从式(2)可以看出,Scale因子实际上控制了量化过程中的阈值,这在很大程度上影响了原始输出特征映射()和量化推理特征映射()之间卷积结果的余弦相似性。因此,目标函数侧重于优化权重()和激活()的尺度因子,并提高和之间的相似性。

3.2、Scale优化

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

image.png

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

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

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

1、每层的最佳Scale

根据等式(2)优化了预训练卷积神经网络的比例因子,其中激活是从具有N个样本的给定校准数据集D生成的。它比普通的训练数据集少得多。在神经网络的第层,作者的方法可以表示为最大化输出特征图余弦相似性:

image.png

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

在这里采用交替优化方法分2个层次来解决这个问题。首先,是固定的,并解决权重调整的。其次,是固定的,并解决以微调激活Scale。和交替优化,直到收敛或超过时间限制。在这里,为了快速收敛,和分别以最大值或激活值初始化。对于和的搜索空间,将的区间线性划分为n个候选选项,并对它们进行简单的搜索策略。

在实验中,超参数、和n对于、和的各种任务都具有鲁棒性。更先进的搜索方法可以用于搜索候选Scale,而在实验中作者发现,简单的搜索策略对目标函数的不规则波动具有更强的鲁棒性。

因此,作者在优化过程中应用了这些合理的初始化策略来解决这个问题。当在每个通道量化方案中优化权值Scale时,其中是c(该层中的滤波器数)维数的集合,这样可以在一个搜索过程中并行地调整每个kernel的独立Scale。

2、对整个网络的最优Scale

在前一节中,将介绍如何优化一层的最优Scale的激活Scale和权重Scale。将作者方法一层一层地应用于整个卷积神经网络。

对于每一层,从当前模型中获得输入激活,其中所有前一层都被量化和优化。从原始模型中收集输出特征图,而不进行量化。采用这种贪婪策略的好处是:

  • 将整个网络的优化划分为子问题,有助于减少优化的巨大搜索空间;
  • 当前层的优化考虑了来自所有前一层的累积噪声。

首先,对于一个L层卷积神经网络,采用提出的方法依次得到最优Scale。算法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效率,这在工业应用中很重要。

相关文章
|
机器学习/深度学习 人工智能 数据可视化
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
2690 0
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
|
9月前
|
人工智能 数据可视化 数据挖掘
Gemini-2.5-pro大模型专业画常用图表保姆级教程:圆角环形图+柱状图排序图+系列按行和按列排布图,国内直接使用
虚竹哥推出AI数据可视化工具《xuzhu-huatu-plus》,支持多种图表类型,如柱状图、饼图、热力图等,输入指令即可生成图表代码,大幅简化绘图流程。用户仅需访问指定平台,选择智能体并输入需求,AI即自动完成图表设计,助力高效数据分析与展示。提供免费授权码体验,国内可直接使用。
477 9
|
9月前
|
弹性计算 Ubuntu Linux
阿里云服务器操作系统【镜像】怎么选择合适?
选择阿里云ECS操作系统需结合业务需求、技术栈及合规性综合评估。根据应用场景推荐Windows Server或Linux发行版,注意CentOS已停更,建议迁移至Alibaba Cloud Linux、Anolis OS等替代系统。同时考虑实例兼容性、成本及镜像来源,确保系统稳定与长期支持。
|
8月前
|
人工智能 数据可视化
关于AI编程对普通人的一个最大的缺点
AI虽擅长编码,但图形界面设计能力较弱,普通人难以通过命令行操作。建议集成可视化UI设计工具,如拖拽组件、精准设尺寸,让AI生成代码,减少反复调试,提升效率。
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
4160 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
机器学习/深度学习 存储 人工智能
【大语言模型】ACL2024论文-01 Quantized Side Tuning: Fast and Memory-Efficient Tuning of Quantized Large Language
本文介绍了Quantized Side Tuning(QST)方法,旨在解决大型语言模型(LLMs)微调过程中的内存效率和速度问题。QST通过将模型权重量化为4位,并引入一个与LLM分离的侧网络,显著减少了内存占用并加快了微调速度,同时保持了与现有技术相当的性能。实验表明,QST可以将总内存占用减少高达2.3倍,并将微调速度提高高达3倍。
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
557 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
机器学习/深度学习 人工智能 算法
极智AI | 谈谈几种量化策略:MinMax、KLD、ADMM、EQ
大家好,我是极智视界,本文分享了 谈谈几种量化策略:MinMax、KLD、ADMM、EQ。希望我的分享能给你的学习带来一点帮助。
2767 0
|
XML 自然语言处理 API
个人微信开发api文档
个人微信开发api文档
|
安全 小程序 算法
微信支付-全面详解(学习总结---从入门到深化)
微信支付-全面详解(学习总结---从入门到深化)
1265 0