Agile-Quant: Activation-Guided Quantization for Faster Inference of LLMs on the Edge 旨在通过量化技术提高大型语言模型(LLMs)在边缘设备上的推理速度
Abstract
大型语言模型(LLMs)在复杂的语言建模任务中表现出色,但其计算和内存需求高,限制了在边缘设备上的广泛使用。量化技术被引入以提高LLMs在设备上的效率。最近的研究表明,8位或更低的权重量化对任务性能的总体影响很小,但激活值尚未量化。另一方面,主流的通用边缘设备仍难以有效执行这些低于8位的量化网络。在本文中,我们提出了Agile-Quant,这是一种针对流行大型语言模型的激活引导量化框架,并在多个边缘设备上实现了端到端加速器以提高推理速度。
通过硬件分析和激活分析,我们首先引入了一种基本的激活量化策略,以平衡任务性能和实际推理速度的权衡。然后,我们利用激活感知的token修剪技术来减少异常值和对注意力机制的不利影响。最终,我们利用基于SIMD的4位乘法器和高效的TRIP矩阵乘法来实现边缘设备上的LLMs加速器。
我们在不同规模的LLMs上应用了我们的框架,包括LLaMA、OPT和BLOOM,使用4位或8位的激活量化和4位的权重量化。实验表明,Agile-Quant在同时量化模型权重和激活的情况下,任务性能与现有的仅权重量化方法相当。此外,在8位和4位场景下,Agile-Quant在多个边缘设备上实现了最多2.55倍的速度提升,相比于其FP16的对比对象,这标志着该领域的一个开创性进展。
Introduction
基于Transformer(Vaswani等,2017)系列的大型语言模型(LLMs)(Touvron等,2023;Zhang等,2022;Brown等,2020a;Radford等,2019;Brown等,2020b)在自然语言处理(NLP)研究领域取得了突破性的表现。
应用场景。 在实际决策场景中,将LLMs推理作为关键元素通常需要严格的延迟要求。然而,LLMs的一个缺点是其计算和存储成本极高。以GPT-3-175B为例,当以紧凑的float16格式存储时,其参数需要326GB的内存。这超出了最强大的单个GPU的容量,更不用说在硬件受限的边缘设备上运行时要实现可接受的延迟所面临的挑战。量化特别是通过利用边缘平台(如CPU和Raspberry Pi)中常见的SIMD单元支持的高效8位定点(INT8)运算,提供了一种显著提高LLMs在边缘设备上推理吞吐量和能效的有前途的方法。
当前限制。 在完全实现LLMs量化模型在设备上带来的好处之前,必须解决两个需要仔细关注的紧迫问题。❶现有研究(Frantar等,2022;Lin等,2023;Xiao等,2022)主要集中在仅对权重进行4位量化,而将激活值保留在浮点(FP16)域中。这种方法限制了在常见边缘设备上高效加速模型推理,这些设备通常只支持16x16和8x8整数乘法器。具体而言,激活量化往往对任务性能有不利影响,特别是在模型规模变大时,由于激活中明显异常值的出现。Dettmers等人(2022)进行的实验表明,直接将这些异常值设为零可能导致任务性能大幅下降45%。此外,考虑到LLMs的模型规模庞大,有限的学术计算能力使得负担相关的训练成本变得困难。因此,后训练量化(PTQ)已成为一种普遍的方法,但未能最大限度地减少这些异常值带来的量化误差。总之,在处理激活中的异常值的同时量化LLMs的激活是一个关键但具有挑战性的问题。❷主流边缘处理器,如CPU和Raspberry Pi,利用SIMD单元高效地并行执行多项操作。SIMD指令擅长利用字节级数据(8位整数)的并行性,并在常见的ISA(指令集架构)和DNN处理框架中得到良好支持。例如,TensorFlow Lite中的GEMMLOWP(Jacob和Warden,2017)和PyTorch中的QNNPACK(Dukhan, Wu, 和 Lu,2018)。它们的低精度内核只是将子字节操作数零扩展以对齐到字节边界,作为8位或16位操作数处理。
在本文中,我们解决了上述设备端量化问题,同时享受LLMs提供的强大性能。我们提出了Agile-Quant,这是一种用于加速边缘设备上LLMs推理的激活引导量化框架。具体来说,我们从基于硬件延迟分析和LLMs激活分析的基本激活量化策略入手,旨在平衡任务性能和设备端推理速度。随后,我们利用激活感知剪枝方法来优化量化。这一点至关重要,因为量化后的标记常常会出现一些异常值,导致它们的注意力从第一个位置转移到附近的局部位置。通过剪枝标记,我们有效地消除了部分异常值,因为它们通常集中在不同标记的相同或相邻通道中。此外,移除不重要的标记可以减少重要标记之间的交互距离。最后,我们为Agile-Quant的硬件实现设计了面向边缘的优化。它主要包括两个组件:一个基于SIMD的4位乘法器以促进高效的4x4 INT4乘法,以及我们的高效TRIP矩阵乘法以减轻异常值的负面影响。
我们采用了流行的LLMs模型,如LLaMA(Touvron等,2023)、OPT(Zhang等,2022)和BLOOM(Scao等,2022),以验证我们框架的有效性和我们方法在多种边缘设备上的效率。Agile-Quant可以在保持与仅权重方法相媲美的最新任务性能的同时,实现高达2.55倍的实际设备端加速。
本工作的贡献总结如下:
- 我们设计了激活引导和面向边缘的量化策略,以平衡延迟降低和任务性能。
- 我们设计了一种激活感知标记剪枝方法,以最大限度地减少异常值和局部注意性对任务性能的负面影响。
- 我们提出了基于SIMD的4位乘法器和高效的TRIP矩阵乘法,以实现有效的硬件实现。
- 我们在多个流行数据集上实现了最新的任务性能,并取得了实际设备端加速。
Background and Related Works
在本节中,我们首先关注大型语言模型(LLMs)后训练量化的背景。然后我们讨论通用边缘设备上的低位计算。
大型语言模型的后训练量化
后训练量化(PTQ)技术广泛用于一次性压缩模型,特别是大型语言模型(LLMs),因为重新训练的成本很高。这些PTQ方法利用精确的求解器,在每层或每组的基础上解决压缩问题,依赖于有限的校准数据集。值得注意的是,AWQ(Lin等,2023)和SpQR(Dettmers等,2023)引入了能够有效保持LLM性能的精心设计的方法。GPTQ利用二阶信息来纠正错误,在3-4位范围内实现了令人称道的准确性。AWQ提出只保护1%的关键权重以显著减少量化误差。SpQR的重点是将较小模型的量化减少到每个参数3-4位。此外,他们提出了一种新的技术,使LLMs的压缩几乎无损。然而,这些工作未能在边缘设备上实现实际推理加速,因为激活部分仍然采用浮点格式,使得边缘设备的整数乘法器无效。
硬件设备上的低位计算
低精度线性代数内核旨在最大化低精度操作数的计算吞吐量。这是通过扩展现有的更宽位宽的线性代数内核实现的。使用低精度操作数带来了两个性能提升:增加缓存容量和利用低精度SIMD指令同时处理多个元素的能力。这些低精度线性代数内核的开创性例子,例如谷歌的GEMMLOWP(Jacob和Warden,2017)和Facebook的QNNPACK(Dukhan, Wu, 和Lu,2018),在使用8位量化时在提高DNN推理效率方面表现出色。然而,推动更激进的子字节量化并没有带来额外的性能收益,因为主流CPU仅支持精度为8位或更宽的SIMD操作。具体来说,低精度内核本质上会将子字节操作数扩展到8位并进行相应处理。此外,比特串行计算的概念作为一种有前景的解决方案出现,适用于带有子字节值的数据并行计算。这种方法涉及在乘法过程中逐位顺序处理两个操作数,同时并行管理多个操作数对。然而,其实际实现需要popcount操作,这本质上限制了运行时吞吐量。因此,这种方法仅在超低位场景(1或2位)中表现出显著优势。
Activation Analysis of LLMs
在本节中,我们分析了大型语言模型(LLMs)中标记的注意力,以及标记剪枝对激活量化的影响。此外,我们还进行延迟分析,以探讨潜在的量化策略。
LLMs中的标记重要性
在自然语言处理中,句子中常常存在许多非必要的词,这些词对整体理解贡献较小。这意味着我们可以用更少的资源高效处理这些词,甚至可能将其排除,以减少复杂性。由于词在语言模型中被嵌入为标记,我们探索注意力机制来分析每个标记的重要性。之前的研究(Kong等,2022;Dong等)在不同架构上积累多轮注意力的概率作为标记重要性分数。然而,LLMs中使用的因果注意力掩码确保在自注意力机制中,每个标记只能与之前的标记交互,而不能与之后的标记交互。因此,这种因果机制使得前面标记的累积概率不适合用于评估标记的重要性,因为这对前面标记的累积概率是不公平的。
在LLMs中,一个不同的起始标记被放置在输入序列的开始。起始标记的作用是初始化隐藏层并定义序列中标记的位置。这些方面对于生成既连贯又有上下文意义的文本至关重要。为了探索第一个起始标记与其他标记之间的关系,我们可视化了LLaMA-7B模型在Wikitext-2数据集上16个标记的第一层和最后一层的注意力图,如图1(a)和(b)所示。根据注意力图,第一层的几个标记显示出共享的三角形模式,表明标记倾向于相邻位置,尤其是前一个位置。而在最后一层,几乎所有标记都共享垂直条纹模式,表明所有标记都与第一个标记相关。然后,我们探索中间层的注意力图,显示这些图与最后一层的类似。因此,这指导我们建立标记重要性与标记对起始标记的注意力之间的联系。
注意力图怎么画的?判断标记重要性的因素是啥
激活量化的影响
我们分析了异常值的分布,并在图1(d)中可视化了不同通道中的异常值。我们注意到异常值分布在相邻甚至相同的通道中,因为深色的直线表明异常值的通道索引未变化。此外,由查询矩阵Q和键矩阵K生成的注意力图会受到激活量化的影响,因为它依赖于输入。在图1(c)中,我们可视化了最后一层的量化注意力图。注意力图呈现出三角形模式,量化的标记更倾向于相邻位置而不是起始标记,这表明注意力范围变得局部化,注意力强度减弱。这种变化意味着代表性特征的全局性恶化。从另一个角度来看,由量化误差导致的原始注意力图的信息减少将对最终任务性能产生不利影响。
异常值怎么定义的?
硬件设备上的延迟分析
为了深入了解LLMs的运行时分布,我们在广泛使用的LLaMA模型上进行了分析,利用Snapdragon 870 CPU,如图2所示。此分析包括FP16、INT8和INT4精度。由于非线性运算符(LayerNorm/Softmax/SwiGLU)对延迟的贡献相对较小,即FP16为<8%,INT8为<12%,INT4为<16%,我们使用FP16算术单元实现它们以确保任务性能。我们关注主要的计算工作负载,即在各种低位精度设置下进行的矩阵乘法。我们的观察显示,FC1和FC2在FP16中占54%的运行时延迟,在INT8中占49.5%。这一发现表明需要优先将这些组件量化为更低位(4位)表示。接下来,我们的优先顺序如下:线性变换 > 线性投影 > AttnV > QK。本质上,重点是对LLMs的权重和激活进行低位量化,同时确保任务性能至关重要。
Methodology
我们在这里解释激活量化流程,并提出激活引导框架以优化量化。同时,我们解释了4位乘法器的硬件实现。
不是量化吗,为啥是使用4位乘法器?
初步说明
在本研究中,我们解释用于激活量化的量化器。我们假设量化中使用的比特宽度为b,量化器可定义为函数Q(X|b),将向量X ∈ R^m×n中的浮点数映射到最接近的量化值q:
- 有符号:q = {−2^(b−1), …, 2^(b−1)−1}
- 无符号:q = {0, 1, …, 2^b−1}
存在多种量化器Q(X|b),其中均匀量化器(Jacob等,2018)和log2量化器(Cai, Takemoto, 和Nakajo,2018)被广泛使用。在我们的工作中,我们主要使用这两种量化器进行激活量化。
均匀量化已被大多数硬件设备支持:
其中s和zp分别表示缩放和零点。
Log2量化将指数运算引入线性量化过程:
均匀量化器
线性映射:
将数据范围划分为等间隔的区间。
每个区间的宽度相同,适用于大多数数值范围均匀分布的数据。
适用性:
对于数值变化幅度相对均匀的数据较为有效。
简单且计算成本低。
Log2量化器
对数映射:
使用对数尺度,将数据范围划分为不等间隔的区间。
每个区间的大小呈指数级变化,更适合处理数值跨度较大的数据。
适用性:
对于数据分布呈指数或对数规律的数据更为有效。
能够更好地保存小数值变化。
均匀量化器:适用于数据比较均匀且不需要关注小数值范围的情况。
Log2量化器:更适合处理动态范围大的数据,尤其是在低数值区域需要更高精度的情况下。
激活量化流程
我们在图3中展示了激活量化流程。虽然嵌入过程、输出模块和黄色高亮的非线性运算在模型推理中贡献较小,但我们保留其计算不变。我们的主要关注点是优化矩阵乘法操作,占据推理延迟的最大份额。
在我们的流程中,我们专注于加速自注意力和MLP模块中的计算,如蓝色阴影所示。特别是,我们主要使用8位整数进行激活量化。
然而,我们观察到自注意力机制后的特定激活可以使用4位整数量化,从而在保持任务性能标准的同时实现进一步加速。因此,我们提出了创新的4位乘法器以有效支持INT4矩阵乘法。
特定激活是指什么?
激活引导优化
基于前一部分对离群值和注意力范围的分析,我们直观地引入标记修剪进行优化。我们在图4中展示了标记修剪过程。标记修剪可以减少离群值,从而降低因其引起的量化误差。此外,它还能缩小注意标记之间的距离,帮助模型捕捉更多特征。
我们首先介绍用于改进激活量化的激活感知标记修剪方法。受到(Lin et al. 2022)的启发,我们提出了TRIP(Two Refine Improved by Pruning)方法来解决激活量化中的困难。
对于基于Transformer模型中的一个激活,我们假设为X∈R^m×d,其中m和d分别表示标记数量和维度。我们假设标记修剪函数为FP(·),根据标记的重要性依次修剪标记:
然后,TRIP因子α = {α1, α2, …, αd}应用于通过标记修剪减少离群值的不同通道。因子α为不同通道提供不同的因子,可以正则化量化参数,使用如下:
对于具有最大细化K的通道c∈[1,d],因子αc如下:
K取决于含有相对较多离群值的通道。通过标记修剪可以减少离群值。
标记修剪中,我们根据注意力图评估标记的重要性,并根据分析,仅采用它们对第一个起始标记的注意力进行重要性测量。我们在模型的不同深度逐步动态地级联修剪标记。
受到之前标记修剪工作的启发(Kim et al. 2022; Liang et al. 2022),我们通过将模型划分为具有不同冗余的多个阶段来设计修剪策略(Shen et al. 2023)。同时,从某些浅层甚至第一层修剪标记可能会影响模型的任务性能,因为在前几层中,标记的注意力仍然具有局部性,较多的标记数量可以帮助模型捕捉更多有利特征。因此,我们主要采用逐步从注意力图显示标记有足够特征捕获能力的层开始修剪标记的策略。此外,我们调节每层的修剪比例以平衡信息丢失和量化改进之间的权衡。
边缘优化
本节主要介绍我们Agile-Quant框架在边缘设备上的硬件实现。我们首先设计基于SIMD的4位乘法器以支持INT4乘法,然后介绍高效支持两次优化的矩阵乘法。
INT4乘法器:我们设计了一种基于SIMD架构的专用4位乘法器(如图5所示),旨在支持实际的INT4计算。工作流程如下:
- 点乘:在SIMD内核中,我们将相邻的两个权重值Wi,j和Wi+1,j与它们共享的激活值相乘。结果为INT16数据类型。我们为与Wi,j的乘积分配前8位,剩余8位用于Wi+1,j。此方法遵循SIMD内存机制。
- 加法:利用移位操作符,我们将步骤1中的16位输出扩展为32位。前8位设为0,接下来8位为Outputi,j,第三个8位为0,最后8位为OutputI+1,j。然后进行逐行求和。该过程可以处理多达28次加法而不溢出,足以用于多头注意力(头部维度=32/64)。每次加法占用32位内存。最后,我们将输出分成两个INT16值,并在数值级别将其量化回INT4,允许我们将其集成到GeMM内核中。
高效TRIP矩阵乘法:与通道量化不同,我们对离群值的激活矩阵进行层级量化。所有通道共享相同的量化参数,即缩放因子和零点。然而,预测的TRIP因子将适应离群通道的缩放因子。在实际实现中,这些TRIP因子将在对应权重上进行等效数学转换,如图6所示。
请注意,常见的推理引擎仅支持激活的层级量化和权重的每通道量化,例如GeMM和卷积操作符配置。例如,Arm Compute Library(ARM 2023)仅支持权重矩阵的每通道量化配置,而不支持输入激活。
Experiments and Results
本节介绍实验和结果,以验证我们方法的有效性和效率。
实验设置
激活引导量化设置:我们基于GPTQ(Frantar et al. 2022)的权重量化工作实现了激活量化,该方法在大语言模型的4位权重量化中达到了先进水平。我们主要使用4位和8位整数进行激活量化。在softmax激活量化中使用Log2量化,而在其他激活中使用我们的TRIP量化。我们在Wikitext-2(Merity et al. 2016)和C4(Raffel et al. 2020)数据集上实施了不同规模的LLaMA、OPT和BLOOM模型的实验。
硬件平台:我们在多个边缘设备上测试实际推理实现,包括搭载骁龙870处理器的Realme GT安卓手机和带有四核CPU及8GB内存的Raspberry 4 B。针对Arm处理器的推理引擎基于Arm Compute Library v22.05进行修改。推理延迟通过每次测试50次迭代的平均值来报告。
标记修剪的规制
我们调节标记修剪比例以优化大语言模型的任务性能。我们从浅层开始逐步应用修剪比例,以便标记修剪能够优化更深层的激活量化。假设模型有n层,表示为L=(l1,l2,…,ln),修剪操作添加到层Lp = (lp1,lp2,…,lpm)。我们在最后一层ln设置修剪比例β,并计算层li∈Lp的渐进比例γ为:
我们在推理中通过修剪的标记数量累积标记稀疏性s为:
其中r_i表示层li中剩余的标记数量。
然后,我们采用权重和激活都量化的LLaMA模型(包括7B、13B和30B)来搜索最佳修剪比例。我们在图7中可视化了结果。对于所有三种不同规模的LLaMA模型,我们通过标记修剪在红星点处实现了比密集模型更好的性能。此外,我们发现只有在标记稀疏性较小时,标记修剪才能帮助量化达到更好的结果,而当标记稀疏性过大时,标记修剪会对任务性能产生负面影响。在此,我们采用不同规模LLaMA模型的最佳标记稀疏性,并在表1中显示确切结果。同样,我们对OPT和BLOOM模型使用与LLaMA相同的策略调节标记修剪,最佳结果显示在表2和表3中。
量化结果与分析
我们首先在表1中展示了LLaMA的量化结果。根据权重量化工作的结果,我们的方法在任务性能上仅有轻微下降。表中还显示出,我们的方法在性能上优于大多数其他激活量化方法。最后一行的数据表示我们方法中通过标记修剪所获得的结果,验证了标记修剪可以优化量化。
同时,我们的方法在Wikitext-2数据集上使用W4A8实现了比MoFQ8(Zhang et al. 2023)更好的任务性能,MoFQ8主要使用FP8和INT8进行权重和激活量化的混合精度,但无法在边缘设备上实现推理加速。此外,我们的结果在7B和13B规模上优于ZeroQuant-FP(Wu, Yao, and He 2023),且不需要LoRC增强。低秩补偿(LoRC)增强会增加模型大小,并对量化误差矩阵进行低秩矩阵分解。注意,常见的推理引擎(如Arm Compute Library)并不完全支持低秩矩阵分解。
然后,我们展示了OPT和BLOOM在Wikitext-2和C4数据集上的量化结果(见表2和表3)。我们的方法在任务性能上优于那些激活量化方法,并且结果接近于权重专用量化工作。同时,标记修剪也帮助我们在激活量化中实现更好的任务性能。特别是对于OPT和BLOOM模型,我们的方法在C4数据集上甚至能实现比FP16模型更好的任务性能。
消融研究
输入序列的长度对评估过程有很大影响。我们通过不同的序列长度进行标记修剪,以进一步探索性能变化。在LLM评估中常用的默认输入序列长度是2048,这在相关工作中被广泛使用。因此,我们在Wikitext-2数据集上调节LLaMA-7B的输入序列长度,以探索其与标记稀疏性之间的关系。结果如图8所示。我们发现随着序列长度变短和标记稀疏性增加,任务性能变差,只有当序列长度足够长(即2048)时,标记修剪才有效。
端到端性能和分析
根据表4,可以得出以下结论:Agile-Quant可以根据模型带来2.3倍到2.6倍的总体加速,因为在边缘设备上的高计算工作负载可以利用量化算法更高效地使用有限的内存资源。具体来说,将激活量化到INT8精度的Agile-Quant-8相较于FP16在GeMM中可以实现大约1.8倍到1.9倍的加速。这对于大多数数学操作是矩阵操作(>80%计算量)的模型(如transformers)非常有利。因此,transformers可以获得比CNN更大的加速收益,因为CNN在每次卷积操作中,诸如权重重整、image2column和column2image等内存移动,会稀释GeMM上的高效量化加速。结合4位压缩和连接技术,Agile-Quant-4可以进一步提高这一优势,相较于INT8乘法实现大约1.75倍的加速。这是因为,虽然理论上的计算工作负载减半,但由于连接权重的内部移位和以INT8格式恢复存储结果引入了一些开销。
Conclusions and Limitations
在本文中,我们提出了Agile-Quant,一种面向流行大语言模型的激活引导量化框架,并设计了在多种边缘设备上的端到端加速器。考虑到硬件分析和激活分析,我们引入了对模型权重和激活的量化策略。我们还实现了激活感知的标记修剪以增强激活量化。最后,我们引入了基于SIMD的4位乘法器和高效的TRIP矩阵乘法,以在Android CPU和Raspberry Pi上实现对大语言模型的加速,速度提升可达2.55倍。我们的下一步是探索更低位的大语言模型,并在边缘处理器上设计多种低位乘法器(2位和3位),以推动AI的普及。
总结思考
1.量化怎么优化的?
2.矩阵乘法咋优化的?