今天小编分享的科学经验:50s完成7B模型量化,4bit达到新SOTA,大模型低比特量化有新招了,欢迎阅读。
消除激活值 ( outliers ) ,大语言模型低比特量化有新招了——
自动化所、清华、港城大团队最近有一篇论文入选了NeurIPS 2024(Oral Presentation),他们针对 LLM 权重激活量化提出了两种正交变换,有效降低了 outliers 现象,达到了 4-bit 的新 SOTA。
简单理解,在大语言模型(LLM)中,有一些中间层输出的数值(激活值 Activation)会变得非常大,它们被称为 "outliers(离群值)",这些 outliers 给模型量化带来了挑战。
补充一下,量化可以将模型中的数值从浮点数转换为整数,以减少模型的大小和计算需求。
而一旦在量化过程中存在大量 outliers,会导致量化后的模型性能下降。
明白了这层道理 , 我们再来看他们团队的一项名为 DuQuant 的新研究。
首先 , 他们发现在 LLM 的前馈网络 ( FFN ) 模块中的down_proj 层, 存在明显的Massive Outliers ( 非常大的激活值 ) 。
这种 outliers 不同于以往发现的 Normal Outliers,表现为大于绝对值几百的异常值并局限于个别的 tokens 中——
它们导致现有的量化算法(如 SmoothQuant 和 OmniQuant)在将模型的权重和激活值量化为 4 位二进制数时表现不佳。
对此,团队提出了一种新的量化方法,叫做DuQuant。
DuQuant 通过学习旋转和置换变换矩阵,在 Activation 矩阵内部将 outliers 转移到其他通道,最终得到平滑的激活矩阵,从而大幅降低了量化难度。
实验显示,使用 DuQuant 方法,在 4 位权重和激活量化的設定下,模型达到了 SOTA。
同时,DuQuant 的训练非常快速,可以在50s 内完成 7B 模型的量化过程,即插即用。
背景
在每个 Transformer 块的常见模块中,多头自注意力(MSA)和前馈网络(FFN)基本上都由线性层组成,将其表示为:
其中是激活输入,表示权重矩阵。
模型量化通过将浮点数(FP16, BF16)表示的模型权重或激活值转换为低位的浮点数或整数来减少内存占用,权重激活量化可以通过使用低比特乘法的算子进一步加快模型推理的速度。
该工作重点关注低比特整型量化,目标是获得更好的硬體支持。
具体来说, 位量化过程将 FP16 张量映射为低位整数 :
符号⎣ · ⎤表示最接近的舍入操作, ∆是量化步长, 表示零点。
遵循主流量化方法,作者对激活采用逐 token 量化,对权重采用逐通道量化,这意味着为的每个 token 分配不同的步长( ∆ ∊ ℝ x1),为的每个输出通道分配不同的步长。
动机(Motivation)
据作者介绍,他们首次在实验中发现,LLM FFN 模块中的down_proj layer存在明显的 Massive Outliers(非常大的激活值),表现为绝对值大于几百的异常值并局限于个别的 token 中。
PS:先前工作发现 Massive Outliers 存在于每个 transformer block 的输出中,DuQuant 的作者进一步将其定位在 FFN 模块中。
论文:https://link.zhihu.com/?target=https%3A//eric-mingjie.github.io/massive-activations/index.html
这些 Massive Outliers 造成 SmoothQuant 和 OmniQuant 等算法在 4bit WA 量化中表现较差。
△图 1:Massive outliers 显著加大了低比特权重激活量化的难度
图 1 ( a ) ( b ) 对比了普遍常见的 Normal Outliers,和在 FFN 中出现的 Massive Outliers。
SmoothQuant通过将激活值除以每通道平滑因子并将其乘回权重矩阵,尝试将量化难度从激活值转移到权重。
具体来说,SmoothQuant 使用逐通道的平滑对角矩阵,记为 ,将原始线性层重新表达为:= · =( ·)(-1 · ),对角矩阵中的元素 的计算方式为:
其中 α 是一个超参数,表示迁移强度。
然而,作者观察到在输入端进行这种转移可能会导致权重矩阵也出现明显的难以量化的 outliers(如图 1 ( d ) 所示),这一问题的根源在于 Massive Outliers 使平滑因子 变得异常大。
此外,极大的 outliers 还可能导致基于优化的方法出现梯度爆炸的问题,所以基于梯度优化的 OmniQuant 和 AffineQuant 等工作会直接跳过 down_proj layer,直接退化为 SmoothQuant 的处理方式。
这些 preliminary experiments 都表明需要一种更新更好的方式处理两种 outliers,特别是平滑掉 down_proj 输入侧的 Massive Outliers。
方法
DuQuant 提出通过学习旋转和置换变换矩阵,在 Activation 矩阵内部将 outliers 转移到其他通道,最终得到平滑的激活矩阵,从而大幅度降低了量化难度。
( a ) 逐步展示了 DuQuant 算法对 Normal outlier 的处理过程, ( b ) DuQuant 显著降低了 Massive outlier, ( c)一个 Tony Example 说明 DuQuant 有效降低了激活矩阵的量化难度。
△图 2:DuQuant 算法说明
简单来说,DuQuant 算法包含三个步骤:
1)旋转矩阵的构造有效利用了特定 outlier channel 的位置索引,作者使用了分块对角的旋转矩阵,在每个 block 内部通过贪心算法将 outlier 平摊到其他的 channels 中。
2)由于 block size 的限制,可能导致某些 block 在旋转之后组内的平均值大于其他 blocks,因此作者进一步使用通道置换技术重新分配 activation channel,使用 zigzag 顺序排列使各组均值的方差大幅减小。
3) 进一步执行一次旋转变换达到更均匀的 activation 分布,从而大幅降低了量化难度。
旋转矩阵:作者希望应用旋转矩阵进行行或列变换,减轻 Normal Outliers 和 Massive Outliers 的影响。
由于 Massive Outliers 通常随机分布在激活空间中,直接找到能够通过单次旋转变换减轻 outliers 的最优旋转矩阵是具有挑战性的。
为了解决这一问题,作者采用带有先验知识的贪心搜索方法来计算旋转矩阵,从而近似理想的旋转矩阵。
具体来说,的计算包括以下步骤:
1、识别 outliers 主要集中的特征维度 ,即:,其中, 表示中第行和第列的元素。
2、基于搜索到的维度,构建旋转矩阵如下:
是用于交换激活值的第 1 列和第 d ( 1 ) 列的交换矩阵,表示一个正交初始化的旋转矩阵,其第一行均匀分布。
这样做的目的是通过变换后减轻第 1 列中的 outliers。
为了进一步增加随机性,保留减轻 outliers 后的第 1 列,并通过与随机正交矩阵’相乘,随机旋转其他列。
3、设 N 为贪心搜索的步数,则近似的旋转矩阵,其中。每个 根据公式 ( 2 ) 和识别到的特征维度 d ( ) 构建。
通过这种构建方式,可以确保近似的最优旋转矩阵能够有效减轻具有较大幅度的 outliers,而不仅仅是使用随机选择的正交旋转矩阵。
然而,直接构建整个旋转矩阵非常耗时,并且会导致大量的内存开销。
为了实现快速矩阵乘法,参考 Training Transformer with 4ibts ,作者选择以分块的方式近似旋转矩阵。
其中,表示第个块的方阵,该矩阵按照上述三步构建。块的数量 K 通过 K=Cn/2n 计算得出。
通道置换矩阵:尽管采用了块对角旋转矩阵来提高时间和存储效率,但其专注于局部信息的特性带来了进一步减少 outliers 的潜在限制。
由于在每个小块内进行的旋转变换无法整合跨不同块的信息,一个块中可能有相对较大的 outliers,而另一个块中则有较小的 outliers,导致不同块之间存在较高的方差。
因此,作者提出利用通道置换矩阵平衡不同 blocks 之间 outliers 的幅度。
具体来说,在每个小块中,将维度 d 中最大的 outlier 记为 O。
同时, Mb 表示第个块中所有 O 的平均值,其中 =1,2,……,K ,各个块之间激活幅度的方差可以表示为:
作者引入了之字形置换矩阵P 。
具体来说,通过生成一个之字形序列,首先将激活值最高的通道分配给第一个块,接着,将激活值次高的通道按递减顺序分配到后续的块,直到第 K 个块。
在到达最后一个块后,顺序反转,从下一个激活值最高的通道开始,按递增顺序分配。
这个往复模式贯穿所有块,确保没有单个块持续接收最高或最低激活值的通道。
通过使用之字形置换,DuQuant 实现了不同块之间 outliers 的均衡分布,从而能够使用额外的旋转变换进一步平滑 outliers,如图 2 所示。
需要注意的是:
1、通道置换其实是非常重要的一步,也很简单快速(对于推理效率的影响很小,可见后面实验部分),既可以避免像 SpinQuant 那样复杂的训练流程,也比 QuaRot 的 Hadamard 旋转性能表现更好。
2、旋转矩阵和置换变换矩阵都是正交矩阵,保证了输出的不变性,作者还通过严谨的理论推导了证明了两种变换有效降低了量化误差,具体证明可以阅读 Paper 里面的 Appendix。
实验
在 4-bit setting 下达到了 SOTA 的效果,DuQuant 验证了 LLaMA、Vicuna、Mistral 系列模型,在 PPL、QA、MMLU 和 MT-Bench 等任务上都明显提升了量化模型的性能。
此外作者还在 LongBench 评测了量化模型长文本生成的能力,DuQuant 同样大幅超过了 baselines。
△DuQuant 在 LLaMA3-8B 的低比特量化中显著超过了基线方法
上面是 DuQuant 在 LLaMA3 模型的量化效果,更多的模型和 task 上的表现可以参见论文。
硬體测速也证明了 DuQuant 在 pre-filing 阶段可以达到 2.08 倍的加速比,在 decoding 阶段有效降低了 3.50 倍内存开销。
同时如右图所示,DuQuant 相比 INT4 推理带来额外的 10% 左右速度开销,微高于 QuaRot,但带来更多性能提升。
此外,DuQuant 与使用 Hadamard 旋转矩阵的QuaRot主要有以下两点不同:
1、DuQuant 构造的旋转矩阵利用了先验知识(具体的 outlier channel 索引),因此它可以比 QuaRot 更好地平滑激活空间,如下图展示了 DuQuant 单次旋转和 Hadamard 旋转对 LLaMA2-7B Attention Key_proj 输入的变换效果。
2、QuaRot 依赖于耗时的 GPTQ 算法来提升性能,而作者引入的通道置换矩阵可以帮助 DuQuant 在极短时间内进一步平衡 outliers 的分布,两种正交变换可以同时平滑权重矩阵的空间,降低权重矩阵的量化难度,从而取得更好效果。
小结一下,DuQuant 通过两种正交变换,利用 activation 激活值的先验知识达到了比 QuaRot 中 Hadamard 旋转更好的量化效果。
该工作获得了审稿人一致的高度评价,并最终被选为 Oral Presentation,录取率 0.4%。
更多细节欢迎查阅原论文。
项目主页:
https://duquant.github.io/
论文:
https://arxiv.org/abs/2406.01721
代码:
https://github.com/Hsu1023/DuQuant
— 完 —
投稿请发邮件到:
标题注明【投稿】,告诉我们:
你是谁,从哪来,投稿内容
附上论文 / 项目主页链接,以及联系方式哦
我们会(尽量)及时回复你
点这里关注我,记得标星哦~
一键三连「分享」、「点赞」和「在看」
科技前沿进展日日相见 ~
>