AWQ
权重并不同等重要,仅有小部分显著权重对推理结果影响较大
作者指出,模型的权重并不同等重要,**仅有0.1%1%的小部分显著权重对模型输出精度影响较大**。因此如果能有办法只对0.1%1%这一小部分权重保持原来的精度(FP16),对其他权重进行低比特量化,就可以在保持精度几乎不变的情况下,大幅降低模型内存占用,并提升推理速度。这就涉及到一个问题,如何鉴别显著权重,常用的方法有三种
-
随机挑选 随机选出0.1%~1%的权重作为显著权重,当然这种方法很不科学。
-
基于权重分布挑选:对权重矩阵(比如自注意力中的 W_q,W_k ,W_v )中的元素按绝对值大小由大到小排序,绝对值越大越显著,选择前0.1%~1%的元素作为显著权重。
-
基于激活值分布挑选: 激活值就是与权重矩阵作matmul运算的输入值. 按激活值绝对值大小由大到小排序,绝对值越大越显著,选择前0.1%~1%的元素作为显著权重。
Q = W_q X , K = W_KX, V = W_vX ,O = W_o[softmax(KQ^T)V], X 就是W_q ,W_k , W_v的激活值,[softmax(KQ^T)V] 是W_o的激活值。 按照激活值绝对值大小排序,绝对值越大越显著,0.1%~1%的元素作为显著权重
通过实验发现基于激活值分布挑选显著权重是最为合理的方式。只要把这部分权重保持FP16精度,对其他权重进行低比特量化,就可以在保持精度几乎不变的情况下,大幅降低模型内存占用,并提升推理速度。但是将一部分权重转化为FP16,一部分转化为INT4,会导致kernel不太好写。于是引出下一个观点。
量化时对显著权重进行放大可以降低量化误差
对于普通的量化可以由一下公式得出
Q({w}) = \Delta \cdot \text{Round}(\frac{{w}}{\Delta}), \quad \Delta = \frac{\max(|{w}|)}{2^{N-1}} \tag{1}
w*x \approx Q(w)*x \tag{2}
其中Q(\mathbf{w}) 是对权重进行量化和反量, 如果我们对权重w 乘以s ,对输入x 除以s .
Q(w\cdot s)\cdot \frac{x}{s} = \Delta^{'} \cdot \text{Round}(\frac{ws}{\Delta^{'}}) \cdot x \cdot \frac{1}{s} \tag{3}
w*x = (w*s)*(\frac{x}{s} ) \approx Q(w*s)*(\frac{x}{s} ) \tag{4}
通过分析我们可以得出量化误差来自于round函数。(2)和(4)如果不量化float精度一样但是量化后误差是不一致的 。
因为一个量化的是w 一个是w*s, 其实乘以s的是w 是显著权重也就是要保护的0.1%~1%。那么,误差如下:
Err(Q(w) x) =(\Delta\cdot (\frac{w}{\Delta})- \Delta \cdot \text{Round}(\frac{{w}}{\Delta}))*x \\ = \Delta\cdot( (\frac{w}{\Delta})- \text{Round}(\frac{{w}}{\Delta}))*x \\ = \Delta\cdot {RoundErr}(\frac{w}{\Delta})\cdot x \tag{5}
对于
\texttt{Err}(Q(w \cdot s)(\frac{x}{s})) = \Delta^{'}\cdot \texttt{RoundErr}(\frac{ws}{\Delta^{'}})\cdot x\cdot \frac{1}{s} \tag{6}
假设1: w*s 这一部权重不影响整体权重的最大值最小值,根据公式1,\Delta^{'} = \Delta, 而RoundErt 是一个四舍五入函数,可以认为是一个常量0.25。 那么对比公式(5) 和(6)
显著权重(w*s)误差是不显著权重w 误差的\frac{1}{s}. 这样就保护了显著权重。 理论上s 越大,误差越小,但是建立在假设上1上(w*s 不影响整体最大值),但是随着s > 1 的变大,w*s 也在变大,那么假设1就会越不成立。 实验表明s <2 之前概率还是很低的5 \%. 所以对所有权重进行低bit量化,对显著权重乘以s
求缩放因子S
求最佳的s^* ,需要最小化损失函数 \mathcal{L}(s)
\mathbf{s}^* = \mathop{\arg\min}_{\mathbf{s}} \mathcal{L}(\mathbf{s}) \tag{7}
但是Q(\cdot ) 不可导
\mathcal{L}(\mathbf{s}) = \lVert Q(\mathbf{W}\cdot \text{di}\text{ag}(\mathbf{s})) (\mathbf{\text{diag}(s)^{-1}} \cdot \mathbf{X}) - \mathbf{W}\mathbf{X} \lVert
为了使过程更稳定,首先按通道求各通道的平均激活值\mathbf{s_X},那么目标\mathbf{s}=\mathbf{s_X}^{\alpha} , 这样最佳s 就关于\alpha的函数
\mathbf{s}=\mathbf{s_X}^{\alpha}, \quad \alpha^*=\mathop{\arg\min}_{\alpha}\mathcal{L}(\mathbf{s_X}^{\alpha})
为了求解\alpha ,在[0,1]区间平均取20个数,0, 0.05, 0.10, 0.15 然后计算损失。得到最佳\alpha