写在前面:近来大模型十分火爆,所以最近开启了一波对大模型推理优化论文的阅读,下面是自己的阅读笔记,里面对文章的理解并不全面,只将自己认为比较重要的部分摘了出来,详读的大家可以参看原文
原论文地址:https://arxiv.org/pdf/2306.00978
摘要
在本文中,提出了激活感知权重量化(AWQ),这是一种面向硬件的LLM低比特权重量化方法。猜想基于这样一种观察结果:权重不是等同重要的,仅保护1%的显著权重就能大大的减少量化误差。然后我们提出了通过观察激活来搜索最优的每个通道的缩放因子,以保护这些显著的权重的AWQ量化方法。
1.介绍
QAT因为高训练成本效率低,PTQ在低精度的时候精确度下降的多,最接近的工作是GPTQ,这种方法采用二阶信息来进行误差补偿,但是,它在重构的过程会过拟合校准集。
在本文中,我们提出了激活感知权重量化(AWQ),我们观察到,对于LLMs的性能来说,权重并非等同重要,存在一小部分(0.1%-1%)显著权重;跳过这些显著权重的量化将显著降低量化损失。为了去找在权重中重要的那些权重参数,做了以下的实验,根据激活特征来找,根据weigt的特征来找,随机找,实验数据如下:
通过观察发现,尽管我们现在正在做weight的量化,但是激活值分布比权重的分布更具有参考价值,对应更大激活幅度的权重通道更为显著。显著的权重找到了,我们怎么来在量化的过程中保护他们呢,假如一部分使用int4,一部分使用fp16这种混合的精度实现有难度,而且在硬件上效率很低。基于这些经验,我们设计一种通道缩放的方法,就是自动搜索适合不同通道的缩放参数,在量化的过程中来保护显著权重的量化损失。从而在全权重量化下最小量化误差。AWQ不依赖于任务反向传播或者重构过程,因此可以保持良好的泛化性,不会过拟合于校准集。
3.AWQ 激活感知量化
将浮点数映射量化到更低比特,这是减少LLMs模型大小和推理成本的有效方法,在本节中,我们首先提出了一种仅基于权重量化的方法,通过保护更重要的权重来提高精度,无需训练和回归。我们开发一种data-driver的方法,搜索减少量化误差的最佳缩放。
3.1保存1%显著权重提升LLMs量化精度
上面说到LLMs权重不同等重要,保护一部分显著权重就可以帮助弥补由于量化损失而导致的性能下降。为了验证这个猜想,做了一些对比试验:
在figure2中,对跳过了部分权重通道的量化LLMs模型进行基准测试,其中确定权重重要性的方法采用的是查看其大小或者L2范数,我们发现,跳过较大范数的L2权重通道并没有显著的改善性能,有趣的是,基于激活值选择权重,可以很显著的提高性能。
局限性:尽管保留0.1%的权重为FP16可以在不明显增加模型大小(以总比特数计)的情况下提高量化性能,但这种混合精度数据类型会使系统实现变得困难。因此,我们需要提出一种方法来保护重要权重,而不必实际将它们保留为FP16。
3.2 通过基于激活感知缩放来保护显著权重
我们提出了一种替代方法,通过通道级别的缩放来减少显著权重的量化误差,这种方法不会受到硬件效率问题的影响。
分析量化误差
我们从weight only量化来分析误差,考虑到一组group/block的权重 w w w,量化运算可以写成 y = w x y=\bf wx y=wx,量化的对应项是 y = Q ( w ) x y=Q(\bf w)x y=Q(w)x,具体的量化函数如下: Q ( w ) = Δ ⋅ R o u n d ( w Δ ) , Δ = m a x ( ∣ w ∣ ) 2 N − 1 Q(\bf w)=\Delta \cdot Round(\frac{w}{\Delta}),\Delta=\frac{max(|w|)}{2^{N-1}} Q(w)=Δ⋅Round(Δw),Δ=2N−1max(∣w∣) 其中,N是量化位数, Δ \Delta Δ为由最大绝对值决定的量化放缩参数,现在考虑到属于 w ∈ w w \in\bf w w∈w,如果我们将 w w w与 s > 1 s>1 s>1相乘,然后将 1 w ∗ x \frac{1}{w}*x w1∗x,则得到: Q ( w ⋅ s ) ⋅ x s = Δ ′ ⋅ R o u n d ( w s Δ ) ⋅ x ⋅ 1 s Q(w \cdot s)\cdot \frac{x}{s}=\Delta^{'}\cdot Round(\frac{ws}{\Delta})\cdot x \cdot \frac{1}{s} Q(w⋅s)⋅sx=Δ′⋅Round(Δws)⋅x⋅s1 Δ ′ \Delta^{'} Δ′是应用s后的新的缩放参数,分析上述公式, R o u n d ( w s Δ ′ ) Round(\frac{ws}{\Delta^{'} }) Round(Δ′ws)和 R o u n d ( w Δ ) Round(\frac{w}{\Delta }) Round(Δw)的预期误差没有变化,因为都是四舍五入映射为整数,误差大致分布在0-0.5之间,平均误差在0.25,;(2)放大单个元素w通常不会改变这一组w的最大值,所以我们可以得到: Δ ′ ≈ Δ \Delta^{'}\approx \Delta Δ′≈Δ,(3) 当 Δ \Delta Δ和 x x x都用fp16表示,则没有量化误差,式1和式2和的误差比率为 Δ ′ Δ ⋅ 1 s \frac{\Delta^{'}}{\Delta}·\frac{1}{s} ΔΔ′⋅s1。给定 Δ ′ ≈ Δ \Delta^{'}\approx \Delta Δ′≈Δ,且s>1.显著权重w的相对误差较低。
(其实为什么说放大单个元素w通常不会改变这一组w的最大值,其实这里我是不太理解的。在我看来其实好像是影响的,当s>1的时候,这一组的最大值可能会因此而改变)
为了验证这个猜想,在OPT-6.7B中将1%的显著通道应用了大于1的放缩参数s,记录不同 Δ \Delta Δ的实验值:
可以看到缩放显著通道十分有效,OPT的困惑度由23.54下降到了12.87,随着s的增大,可以看到其中被改动的 Δ \Delta Δ占比也在增大,但是当s<2的时候,这个占比仍然不是很多,小于5%,显著通道的relative error随着s的增大变化不大,其中最佳性能出现在s=2的时候,当s再增大的时候,困惑度会升高,这是因为当 Δ \Delta Δ升高,其中非显著通道的权重会破坏模型的精度。所以我们在保护显著权重的时候也应该顾忌到非显著权重的量化误差。(其实在这个地方我理解是作者没有区分显著权重与非显著权重,而是所有的通道都给了相同的缩放参数,当缩放参数比较小的时候,对显著权重的保护产生的精度收益高于对非显著权重影响造成的精度损伤,这个有个临界值,在文章测试s=2,这这个附近,可以取得最好的净精度收益,后续应该是针对不同的权重给予不同的缩放因子)。
搜索最佳量化参数
为了同时兼顾到显著通道权重和非显著通道权重,我们选择通过自动搜索来搜索每个输入通道所对应的缩放参数来最小化量化后的输出误差,用了下面这个公式:
因为这个函数不可微,所有不能通过求导的方式来求值,所以定义了一个搜索空间来搜索这个取值,这里使用了一个比较简单的搜索空间:
其中 s x s_{\bf x} sx是每个输入通道x的平均值,用了一个很简单的超参数 α \alpha α来平衡对显著通道的保护和对非显著通道的影响,我们发现最好的应用范围是[0,1],其中当为0的时候,相当于s为1,没有做放缩,当为1的时候,相当于是在我们搜索空间中进行最极端的放缩,我们也将应用权重切片来最小化量化的MSE,在表5中,我们对INT3-g128量化下对OPT进行了研究,AWQ的效果优于RTN,并且与混精(1%的FP16)有差不多的精度表现,并且它更加硬件友好。
优势
我们的方法不依赖于回归和反向传播,这是很多量化感知训练都需要的。我们的方法对校准集依赖最小,因为我们只测量每个通道的平均幅度,从而防止过拟合,我们的方法在量化过程中需要更少的数据,并且可以保留大型语言模型在校准集分布之外的其他信息。
4.TINYCHAT:边缘端AWQ的量化应用
AWQ可以减少大语言模型的大小,W4A16量化在内存访问和计算过程采用了不同的数据类型,因此为了实现最佳性能,其反量化必须融入主要计算循环。这给实现带来了困难,为了解决这个问题,我们推出了tinychat.
4.1为什么AWQ会加速设备端的LLM
Context vs generation latency
decoding生成20个tokens消耗了310ms,(感觉可以理解为profill阶段)但是summarizing 有200tokens的prompt只花了10ms,生成阶段明显比上下文阶段更慢,尤其是在设别断的互动应用中.
生成阶段是内存受限的
为了加速生成阶段,我们在上图中进行了分析,4090 GPU的峰值计算吞吐量为165TFLOPs,内存带宽为1TB/s。因此在4090上,任何计算强度低于165的工作负载都是内存受限的。值得注意的是,在FP16执行时,设备端LLM生成阶段算术强度约为1,这凸显了工作负载的内存受限特性。由于给定模型的FLOPs是固定的,提高峰值性能是唯一方法减少总的内存流量,AWQ将权重内存减少了四倍。
4.2使用TinyChat部署AWQ
为了证实权重Int4量化可能会带来4倍的理论峰值表现,我们设计了tintchat来加速,在GPU上,我们只关注了实现基本组件。性能表现:在GPU上,使用AWQ的tinychat与huggingface的fp16对比,在大语言各个家族的模型中实现了3倍以上的加速。在CPU上,将计算下降到c++,以达到最低化开销。
即时权重反量化
应该注意,需要将反量化内核与矩阵乘的内核融合,避免将反量化权重写入到DRAM中。
SIMD的感知权重打包
即时权重反量化减少中间DRAM访问,但仍然很耗时。例如,对一个4位权重进行反量化设计到一次移位,1次位与和一次FMA操作,而反量化后的权重只经过一次FMA计算,在支持向量化指令的SIMD构建CPU上,这个过程尤其昂贵。为了缓解这一问题,我们呢建议根据设备SIMD单位看度定制了一种权重打包方式。如图4所示:
图4展示了我们对具有128位SIMD寄存器的ARM CPU的策略,可提供高达1.2倍的加速。在这里,每个寄存器保存32个4位权重,按w0、w16、w1、w17、…、w15、w31的顺序排列。这种方法只需要三条SIMD指令就可以解包所有32个权重,而传统的打包方式(w0、w1、…、w31)中,每个权重需要3条标量指令。一般来说,对于2^n位SIMD寄存器,相邻权重的索引将相差1/8 × 2^n,因为每个寄存器可以保存1/8 × 2^n个8位整数。在GPU上,我们发现按照(Kim等人,2022)的方法,将每8个权重打包为w{0,2,4,6,1,3,5,7}更为高效。
5. 实验
5.1 设置
量化
在本文中专注于仅针对权重的分组量化,从pile数据集中使用了一个很小的校准集,来避免过拟合到特性的下游应用领域。使用了网格大小为20的搜索空间来搜索最佳量化参数。
模型
在llama 和opt系列模型上进行了基准测试,在Bllom上也做了测试,但是他们通常在质量上不太好,所以研究中没有包含对他们的研究。对指令调优模型vicuna模型以及视觉语言模型openflaminggo-9b以及llava-13b都进行了基准测试。
评估
主要研究了量化模型在wikiText-2数据集上的困惑度评估。
Baseline
我们主要的基准是最近邻量化(RTN)。当使用小的组时,比如128的时候,他的表现非常强劲。我们还与一种最先进的方法GPTQ进行比较,用于语言模型的权重量化,对于GPTQ,我们还采用了一种使用了“重新排序”技巧的更新版本进行了比较(标记为GPTQ-Reorder或者GPTQ-R)。其他技术比如ZeroQuant,AdaRound和BRECQ依赖于反向传播来更新量化后的权重,这可能不容易扩展到大型模型尺寸;它们没有超过GPTQ,所以没有纳入研究范围。
5.2 评估
Llama模型的结果
我们在表4中评估了量化前后的困惑度。在不同模型规模(7B-70B)和生成中,AWQ始终优于最近邻量化(RTN)和GPTQ(Frantar等,2022年)(无论是否重新排序)。
Mistral/Mixtral模型的结果
我们还评估了AWQ在Mistral和Mixtral模型上,这些模型分别属于最受欢迎的开源语言模型和Mixtureof-Experts (MoE) 模型(Jiang等,2023年;2024年)。结果表明,AWQ在Mistral和Mixtral模型上均取得了优越的性能。这表明AWQ在各种模型架构上都非常有效。
微调指令模型的量化
指令调整可以显著提高模型的性能和可用性。我们在图5中对一个流行的指令调整模型Vicuna评估了我们方法在其性能上的表现。我们使用了GPT-4评分来评估量化模型在80个样本问题(Chiang等,2023年)上与FP16对应模型的表现。我们比较了两种顺序(量化-FP16,FP16-量化)的响应,以消除排序效应(我们发现GPT-4倾向于增加第一个输入的评分),共进行了160次试验。在两个规模(7B和13B)下,AWQ持续改善了INT3-g128量化的Vicuna模型,优于RTN和GPTQ,展示了对指令调整模型的普适性。
多模态语言模型的量化
视觉模型推理
相比于RTN,AWQ效果更好
在数学或者编程任务上表现
极限低比特量化
我们进一步将LLM量化到INT2,以适应有限的设备内存(表9)。RTN完全失败,而AWQ在GPTQ的基础上显著提高了困惑度。我们的方法与GPTQ是正交的。我们可以将我们的方法与GPTQ结合,进一步改善INT2量化性能,使其成为更实用的设置。
5.3 数据效率与泛化能力
效率更高的校准集
我们的方法不依赖于回归和反向传播,我们的方法只需要更小的校准集。AWQ只需要更小的校准集来达到良好的量化性能。与GPTQ相比,它可以使用10倍以下更小的数据集来获得更好的困惑度。
对校准集分布稳健性
5.4 速度评估
设置:优化了线性层和不含有量化权重的层,在RTX4090和Orin进行了基准测试,用bs=1 有4个token的固定prompt,生成200个token,将中位数延迟计算为最终结果。
结果:结果。如图9(a)所示,与Huggingface的FP16实现相比,TinyChat在4090上为三个语言模型家族(Llama-2、MPT和Falcon)带来了2.7-3.9倍的加速。对于Llama-2-7B,我们通过FP16内核融合将推理速度从52个标记/秒提高到62个标记/秒。在更强大的FP16基线的基础上,我们通过快速的量化线性内核进一步获得了3.1倍的额外加速。对于Falcon-7B,官方实现在推理期间没有正确支持KV缓存,因此它比其他模型慢得多。在这种情况下,我们的FP16优化带来了更大的1.6倍加速。在只有8GB内存的笔记本电脑4070 GPU上,我们仍然能够以33个标记/秒的速度运行Llama-2-13B模型,而FP16实现无法适应7B模型。我们还展示了视觉语言模型(Lin等,2024)的加速结果,如表10所示。TinyChat在NVIDIA Jetson Orin上为VILA-7B和VILA-13B带来了约3倍的加速。值得注意的是,我们使用原生PyTorch API实现了所有AWQ模型的前向传递,此代码可在各种GPU架构上重复使用。因此,TinyChat提供了出色的可扩展性。
和其他系统的比较
6 结论
在这项工作中,我们提出了一种称为激活感知权重量化(AWQ)的简单而有效的方法,用于低位权重的语言模型压缩。基于权重在语言模型中的重要性不同的观察,AWQ执行每通道缩放以减少显著权重的量化损失。AWQ不会过度适配校准集,并保留语言模型在各种领域和模态中的通用能力。它在语言建模方面表现优于现有的方法,并适用于指令调整的语言模型和多模态语言模型。我们的TinyChat系统进一步将AWQ实现的理论内存节省转化为相对于Huggingface在台式机和移动GPU上的FP16实现的3.2-3.3倍速度加速,使语言模型在边缘上的部署更好。