SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

这是一篇做大模型训练后量化(PTQ)的文章,简单总结一下文章内容吧。
论文地址: https://arxiv.org/abs/2211.10438
Github: https://github.com/mit-han-lab/smoothquant

1、量化概念

首先介绍一下三种量化方式:

  1. per-tensor量化:每个tensor使用同一步长
  2. per-token量化:tensor中的同一token使用同一步长
  3. per-channel量化:tensor中的同一channel使用同一步长
    在这里插入图片描述
  • 从结果来看,只有per-channel量化保持了较高的精度。
  • 然而,per-channel量化不能很好地映射到硬件加速的GEMM内核(硬件不能高效执行,从而增加了计算时间),因此先前的工作对激活都采用了per-token量化。
    在这里插入图片描述

2、动机和思路

在这里插入图片描述
这幅图很清晰地阐释了LLM量化的几个难点:

  1. 激活层比权重难量化,权重通常来说方差很小,比较好量化
  2. 激活层异常值与大多数值相差过大,导致有效量化水平较低。
  3. 激活层异常值具有(在每个token)持续出现和每个通道内方差小的特点,因此per-channel量化效果优于per-token量化。

因此作者的核心思想就是:

  • 将量化难度从激活层迁移到权重,即缩小激活层,放大权重层,保持线性层的数学等价性。使得激活层方差减小,权重方差增大。
    在这里插入图片描述

3、具体方法

  • 为了使激活层每个通道的最大幅值达到相同水平,取 s j = m a x ( ∣ X j ∣ ) , j = 1 , 2 , . . . , s_j=max(|X_j|), j=1,2,..., sj=max(Xj),j=1,2,..., C i C_i Ci对激活层各个通道进行平滑。
  • 但是这样没有考虑权重的方差分布,使得权重量化变得困难,因此引入一个超参数迁移强度α,使得平滑系数s同时兼顾激活层和权重。
    在这里插入图片描述在这里插入图片描述

超参数设计

  • 作者通过消融实验发现: α =0.4-0.6,才能获得较小的权重和激活的量化误差,并在量化后保持模型性能。
  • 一般设置为0.5(图5是一个α =0.5的例子,介绍了SmoothQuant的计算流程),对于激活层异常值更显著的大模型(如GLM-130B),应设置更大的α,如0.75。
    在这里插入图片描述

4、结果

  • SmoothQuant平滑激活层和权重后,再使用per-tensor或per-token量化,实现W8A8。
  • 根据量化方式不同,作者提出三种策略O1、O2、O3,计算延迟依次降低。与其他量化方法相比,该方法可以保持较高的精度。
  • 此外,作者将SmoothQuant集成到PyTorch和FasterTransformer中,获得高达1.56倍的推理加速,并将内存占用减半,并且模型越大,加速效果越明显。

(下表是我把三个表整合到一起了)
在这里插入图片描述

5、应用

SmoothQuant应用于Transformer

  • 线性层占据了LLM模型的大部分参数和计算。对自注意层和前馈层的输入激活执行比例平滑,并使用W8A8量化所有线性层。
  • 在注意力计算中量化BMM算子。首先用INT8对线性层和注意力层中的BMM(batched matrix multiplications)等计算量大的运算符的输入和权重进行量化,而对其他轻量级元素的运算,如Softmax和LayerNorm,保持激活为FP16,这样的设计有助于平衡准确性和推理效率。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LoveJSH/article/details/132114469