LLM大语言模型量化方法介绍(一)

发布时间:2023-03-06 07:00

摘要

近年来,大语言模型蓬勃发展,已广泛应用于各个领域,例如使用BERT类模型的自然语言理解以及使用GPT类模型的生成任务等,都取得了不错的表现,尤其是最近火爆的ChatGPT,引起了大家的广泛关注。关于语言模型的介绍可以查看壁仞科技研究院往期文章:“语言模型的顶梁柱:Transformer,GPT,BERT”。

 

然而随着模型规模越来越大,对硬件的存储和计算要求也越来越高,比如GPT3-175B规模的模型当数据格式为FP16时,仅权重就需要350G的存储,难以在一张GPU卡上完成推理,因此需要考虑如何支持这些模型。采用量化的方法可以有效的减少存储和计算需求,但是也会带来一系列问题,本文将介绍几种已有的量化方法。

 

量化原理

我们首先了解下量化的数学原理,量化的目的在于将多bit高精度的数(FP32FP16等)量化为较少bit低精度的数值(INT8INT4等),即从浮点到定点数的转换,可以用公式1表示。

 

 

X是原始数值(张量),S表示缩放因子(max abs |X|),bit表示目标量化的bit位数,round函数用于近似取整,clamp函数用于截断,Xquantize是量化后的值。上述是对称量化的实现方式,即X0Xquantize也为0,如图1所示。

 

1 对称量化 [1]

图片来源:https://blog.csdn.net/Nichlson/article/details/121085747

 

从公式1不难看出,缩放因子S比较大时,量化域比较大,但是每一个整数值能表示的浮点数值范围也随之便大,导致量化误差增大;而当S比较小时,量化误差虽然减小了,但是量化域也缩小了,会有更多的数值被舍弃。另外由于浮点数的数据精度较高,大多数数值会分布在零点附近,越是靠近零点的浮点数表示越准确,越是远离原点的位置越有可能是噪声,因此缩放因子的选取会很大程度上影响量化的结果。

 

模型量化方法

通过上面的分析我们可以看到,量化可以直接减少存储量,同时INT4/8的计算也会快于FP16/32,但是也会带来一定的精度损失,最终导致模型结果准确率下降。目前已有的量化方法主要包括两类,训练时量化或量化感知训练(Quantization Aware Training QAT[2][3]等,这种量化方式需要重新训练来缓解量化带来的精度损失,而对于大模型来说,重新训练的时间损耗也是巨大的;另一种量化方法为训练后量化(Post-Training Quantization PTQ[4]等,这种直接对模型进行量化会导致准确率较低,但是不需要再重新训练,节约了时间成本,下面我们将介绍一些PTQ的量化方法。

 

1. “ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers”[5]

 

在这篇论文中,作者采用PTQ的量化方式,把激活值和权重均量化为INT8进行计算,可以带来5倍以上的效率提升。首先分析了直接量化为INT8为何会带来较大的精度损失,如图2所示,对于同一层的不同tokens,激活值的变化范围较大,以最后一层为例,最大的token值为35而最小为8,如果采用整体激活矩阵的行列式值作为量化缩放因子,会导致数值较小的token量化后丢失精度;对于权重同理,同一层不同行的权重范围相差较大,量化后精度损失,造成这些精度损失的根本原因是INT8的表达能力不能很好的表达这些数值差距较大的权重和激活矩阵。

 

2 不同层激活值和权重值变化范围 [5]

图片来源:https://arxiv.org/pdf/2206.01861.pdf

 

基于以上分析,作者提出了对权重进行group量化,将权重矩阵分为g groups,每个group分别进行量化,这样可以有效避免不同行矩阵之间数值差距较大而带来的精度损失;对于激活值采用token-wise量化,即每个token单独进行量化,也可以有效的避免不同token数值差距较大引入的精度损失。

 

但是这种方式也会引入额外的数据搬运操作,导致系统的推理时间变长,每次需要计算出当前token的最大值作为缩放因子,作者也做了kernel fuse来解决这些问题,如图3所示,通过把量化操作融入到前层的Layernorm/Gelu中,把反量化融入到GeMM中,避免了额外的从内存中读取数据。

 

3 将量化和反量化分别融合到前层 [5]

图片来源:https://arxiv.org/pdf/2206.01861.pdf

 

通过以上的量化操作,作者进行了多组对比试验,图4展示了部分结果,更详细的实验结果参考原文[5]。图4(a)是gpt3-1.5B的精度结果对比,可以看到ZeroQuant W8A8没有带来过多的精度损失,图4(b)是BERT模型的推理时间结果对比,可以看到ZeroQuant W8A8大大减少了计算延迟。另外在这片文章中,作者也提出了一种针对INT4/INT8混合精度量化的layer-by-layer蒸馏结构,下图可以看到对应的结果,由于文章篇幅有限,在此不做赘述,感兴趣的读者可以参考原文[5]。

 

4 部分对比实验结果 [5]

图片来源:https://arxiv.org/pdf/2206.01861.pdf

 

2. “SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models” [6]

 

与上一篇论文相似,这篇论文采用PTQ的量化方式,并且对ZeroQuant进行了分析,当模型规模进一步增加如OPT-175B时,ZeroQuant的量化效果会降低,作者进一步进行分析,如图5所示,当模型规模更大时,单个token的值变化范围较大,难以量化,相比之下权重的变化范围较小,作者提出一种smooth量化方式,核心思想是引入一个超参,减小激活值的变化范围,增大权重的变化范围,从而均衡两者的量化难度。

 

5 通过将激活值的量化难度转移到权重来均衡二者的量化难度 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

如图6所示,量化前的激活值变化范围较大,即使对于同一token,不同channel数值差异较大,对每个token的量化也会造成精度损失,但是不难看出较大值一般出现在同一channel,因此作者也分析了采用per-channel的量化方式,这种量化方式能很好的避免精度损失,但是硬件不能高效执行,增加了计算时间,因此大多数量化仍采用per-token及per-tensor的量化方式。从下图可以看出,量化前的激活矩阵在某些channel的数值较大,权重矩阵相对平缓,经过SmoothQuant之后,激活张量中数值较大的channel相对减小,对应权重张量的channel处数值增大,达到均衡二者量化难度的目的。

 

6  SmoothQuant量化过程分析 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

将激活的量化难度转移到权重上,引入平滑因子S,如公式2所示。为了减少激活的量化难度,可以让Sj = max(|Xj|), j = 1, 2, …, Cj,即第j个channel的最大值,但是这样权重的量化难度会变得难以量化,因此需要引入另一个超参转移强度α,对应Sj为公式3,其中α可以根据激活值和权重的量化难易程度进行调整,对于大多数模型α= 0.5,对于模型GLM-130B,由于其激活值更加难以量化,设置α= 0.75,可以更好地进行量化。具体的计算过程如图7所示,从结果可以看出,激活值较大的channel数值相对减小,量化难度降低,对应channel的权重量化难度增加。

 

7  SmoothQuant计算过程 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

得到smooth变换之后的激活和权重矩阵,可以再采用per-token或per-tensor的量化方式,又根据激活值是基于先验数据获得或者执行时获得分为动态量化和静态量化,作者提出了三个层次的量化方式,如图8、图9所示,其中O1~O3的计算延迟依次减少。

 

8  per-tensorper-token量化方式 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

9 三个层次的量化方式 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

作者将SmoothQuant应用到Transformer结构中,由于存储和计算开销大多在attention模块和前向模块,对应图中绿色部分均量化为W8A8进行计算。和上一篇文章类似,平滑因子S的计算也可以融合到前层Layernorm/Softmax中。

 

10  SmoothQuant应用在Transformer block中的量化结果 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

部分的量化结果如图和图所示,即使在100B+规模的模型下,SmoothQuant的精度损失并没有加剧,另外计算延迟相比FP16也有较大的提升。其余更多针对不同规模模型和量化方法的对比实验结果读者可以参考原文[6]。

 

11 部分精度和延迟实验结果 [6]

图片来源:https://arxiv.org/pdf/2211.10438.pdf

 

总结

本文介绍了两种PTQ量化方式,可以看到,两篇文章的思想都考虑到大语言模型下由于激活值变化范围较大导致量化的精度损失,从而寻求合理的量化方式来减缓这部分带来的误差,同时保证高效的硬件运行效率。除了上述介绍的量化方法,还有研究[7]提出的4bit VS-Quant per-vector scaled quantization,通过两级缩放,先对输入矩阵中的每个向量缩放,再对矩阵进行缩放,也能达到很好的量化效果,另外有研究[8][9]都提出了不同的量化及计算方式,并且有不错的效果,感兴趣的读者可以阅读参考。作者水平有限,文中若有任何纰漏之处,也请各位读者批评指正!谢谢!

 

引用

[1] https://blog.csdn.net/Nichlson/article/details/121085747.

[2] Zafrir O, Boudoukh G, Izsak P, et al. Q8bert: Quantized 8bit bert[C]//2019 Fifth Workshop on Energy Efficient Machine Learning and Cognitive Computing-NeurIPS Edition (EMC2-NIPS). IEEE, 2019: 36-39.

[3] Shen S, Dong Z, Ye J, et al. Q-bert: Hessian based ultra low precision quantization of bert[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(05): 8815-8821.

[4] Nagel M, Amjad R A, Van Baalen M, et al. Up or down? adaptive rounding for post-training quantization[C]//International Conference on Machine Learning. PMLR, 2020: 7197-7206.

[5] Yao Z, Aminabadi R Y, Zhang M, et al. Zeroquant: Efficient and affordable post-training quantization for large-scale transformers[J]. arXiv preprint arXiv:2206.01861, 2022.

[6] Xiao G, Lin J, Seznec M, et al. Smoothquant: Accurate and efficient post-training quantization for large language models[J]. arXiv preprint arXiv:2211.10438, 2022.

[7] Dai S, Venkatesan R, Ren M, et al. Vs-quant: Per-vector scaled quantization for accurate low-precision neural network inference[J]. Proceedings of Machine Learning and Systems, 2021, 3: 873-884.

[8] Dettmers T, Lewis M, Belkada Y, et al. Llm. int8 (): 8-bit matrix multiplication for transformers at scale[J]. arXiv preprint arXiv:2208.07339, 2022.

[9] Wei X, Zhang Y, Zhang X, et al. Outlier suppression: Pushing the limit of low-bit transformer language models[J]. arXiv preprint arXiv:2209.13325, 2022.

上一个: ChatGPT新玩法:Visual-ChatGPT开启GPT多模态交流范式

下一个: AI for Math:大语言模型精准定量推理

近期文章

AI 智能体:应用前景与对算力需求的影响

人工智能技术的迅猛发展,尤其是 AI 智能体这一核心部分。本文讨论了AI智能体的定义、应用前景和其对算力需求的影响。

2023-11-13

查看更多