LLM量化工具包

今天用一天时间整理一下当前对大型语言模型(LLM)各个主流量化方法的思路,看看能不能得到启发。

[1] I-BERT [ICML 2021]

I-BERT应该是将INT型量化引入Transformer模型的开山之作。其目的主要是为了去除浮点数逻辑的巨大开销,原文中提到:

除了完成了各个Non-linear Function (GeLU, Softmax,LayerNorm)的量化外。I-BERT实现了所有矩阵运算都量化至8bit,听起来似乎十分激进,但根据实验,它在RoBERTa-Base/Large上的GLUE分数比浮点模型还要分别高0.3和0.5。

[2] ZeroQuant [NIPS 2022]

ZeroQuant介绍了一种训练后量化:Post Training Quantization (PTQ) 的方法。之所以不采用以往的量化感知训练: quantization aware training(QAT)的方法,是因为对于LLM而言,受限于发布者的保护性策略,往往无法获得其训练集。
它采用了以下方法:

  1. group-wise quantization for weight, token-wise quantization for activation。
    将weight一组一组分别进行量化,每个token单独进行量化——分别计算scale。
  2. 引入了知识蒸馏(Knowledge distillation)的方法
    本质上,这个work就是一个group-wise quantization,。之所以叫ZeroQuant,是因为他们不需要提前经过一个calibration来搜索activation的scale。weight的scale提前搜好,activation的scale用kernal fusion解决

[3] LLM.int8() [NIPS 2022]

这篇文章将outliers定义为highly systematic emergent features,

这篇文章的主要思路是把outlier所处了一列(feature)与其余的channel分开量化,outlier采用16bit浮点数,其余用Int8类型。Outliers feature仅仅占0.1%的总feature数。
文章提出的寻找outlier的方法为:对于Transformer的一个hidden state(Q,K,V,output,FC1)而言,其某一列如果至少有一个值大于6.0,那么就对这一列进行跟踪。如果后续这一列在25%的Transformer hidden state都有值大于6.0,并且覆盖到了25%以上的token数目,那么这一列将被标记为Outlier feature。(attention layer与FC2不进行分析)

之所以用上面寻找outlier的方法基于下面这个发现:outlier的出现是系统化的(systematic)—— 对于一个Transformer的feature,要么一直出现outlier,要么从来不出现outlier。

该work成功将拥有175B参数的GPT3量化到了INT8 (其中0.1%是FP16)

[4] OPTQ [ICLR 2023]

第一次将拥有100B以上的大模型量化到了3/4bit,它基于Optimal Brain Quantization (OBQ)的方法:
量化的目标可以写作下式:

或者可以写成如下形式:

OBQ每次量化一个weight。量化之后,对这个weight所在的那一行中其他weight进行更新,权重更新矩阵为

其中$H_F=2X_FX_F^T$为Hessian Matrix。

[5] BRECQ [ICLR 2021]

BRECQ希望在层与层之间量化误差(quantization error)的传递(cross-layer dependency)与泛化误差(generalization error)之间取得一个平衡。
该量化方案的优化目标并不是最小化损失函数,而是最小化feature map的变化。这样的话,我们量化后的模型就可以每一层每一层得到。
首先计算loss关于weigth的Hessian matrix

由于预训练后的模型,其gradient会收敛到一个接近于0的值,我们可以认为loss的Hessian matrix是半正定的——Hessian matrix为半正定的函数是一个凸函数(loss在其邻域内为最小值)
所以上式的第一项趋近于0。
所以就变成了下面这个式子

这个Hessian matrix提供了各个层之间的依赖(dependency)信息
训练的目标为:

每次量化当前block的weight并更新剩余的weight,直到整个模型完成量化。

[6] Bit-Split [ICML 2020]

这篇文章提出了传统量化算法存在的三个问题:1. 对神经网络的每一层的量化独立进行,本层的量化误差最小化不代表整个模型的量化误差最小化。2. 量化过程仅仅优化如clipping value与quantization scales之类的量化参数,而量化后的weight是被动地被舍入操作(rounding operation)调节,实际上量化参数与最终的计算结果并没有直接的相关性。3. 对weight的量化和对input的量化分开进行。
所以这篇文章的主要思路是把INT类型的数拆分为一个一个的bit,之后从MSB开始依次对每一个bit搜索其与浮点模型误差最小的取值,最后再把各个bit缝合(stitching)起来。由于低位的bit考虑了高位bit的量化误差,所以实现了量化参数与weight同时优化。

[7] AICQ [ICML 2019]

该论文主要创新点是run-time dynamic quantization, 量化相关的参数(clipping value,quantization scales)在inference的过程中得到,它们是动态调整的,极大程度提高了量化后模型的表现。

[8] Power-aware Quantization [ICLR 2020]

该论文创新点为power-aware quantization

Reference


[1] S. Kim, A. Gholami, Z. Yao, M. W. Mahoney, and K. Keutzer, “I-BERT:Integer-only BERT quantization,” in Proc. Int. conf. mach. learn. (ICML), 2021, pp. 5506–5518.
[2] Z. Yao, et al., “Zeroquant: Efficient and affordable post-training quantization for large-scale transformers,” in Proc. Int. Conf. Neural Inf. Process. Syst. (NIPS), 2022. pp 27168-27183.
[3] T. Dettmers, M. Lewis, Y. Belkada, and L. Zettlemoyer, “Gpt3. int8 (): 8-bit matrix multiplication for transformers at scale,” in Proc. Int. Conf. Neural Inf. Process. Syst. (NIPS), 2022. pp. 30318-30332.
[4] E. Frantar, et al., “OPTQ: Accurate quantization for generative pre-trained transformers,” in Proc. Int. Conf. Learn. Represent. (ICLR), Oct. 2022.
[5] Y. Li, et al., “BRECQ: Pushing the Limit of Post-Training Quantization by Block Reconstruction,” in Proc. Int. Conf. Learn. Represent. (ICLR), Oct. 2021.
[6] P. Wang, et al., “Towards accurate post-training network quantization via bit-split and stitching,” in Proc. Int. conf. mach. learn. (ICML), 2020, pp. 9847-9856.
[7] Banner, Y. Nahshan, and D. Soudry, “Post training 4-bit quantization of convolutional networks for rapid-deployment,” in Proc. Int. Conf. Neural Inf. Process. Syst. (NIPS), 2019, pp. 7948–7956.
[8] Alizadeh, Milad, et al. “Gradient $\ell_1 $ Regularization for Quantization Robustness.” International Conference on Learning Representations.