LLM系列:PTQ经典量化-weight-only

761 阅读2分钟

经典的weight-only量化:
(1) data-free: bitsandbytes、HQQ;
(2) calibration-based: GPTQ、AWQ。

1 LLM.int8()

论文地址:arxiv.org/pdf/2208.07…
github:github.com/bitsandbyte…
量化规格:A8W8

量化思路:
Vector-wise quantization + mixed-precision decomposition
论文发现模型规模不超过2.7B参数量时,可使用vector-wise quantization,随着模型规模增大(例如模型参数量超过6.7B),会出现少量非常重要的离群点(outliers),离群点会对整个transformer layers计算产生影响,对包含离群点的大模型,论文提出使用LLM.int8()混合精度量化方案(mixed-precision decomposition)。

混合精度量化方案(mixed-precision decomposition)
离群检测后把输入X和权重W中包含异常值的行、列挑选出来直接做fp16的浮点矩阵乘法,然后剩下的正常点用Vector-wise量化方法(X每一行用absmax进行量化、W每一列用absmax进行量化)量化后进行int8乘法再反量化回fp16,最后把它们累加起来作为最终结果输出。

image.png

优点: 1 量化任何模型的最简单方法,开箱即用,不需要校准集(零样本量化) 2 量化精度高。

不足: 1 离群检测、拆分、合并有性能开销; 2 随着离群点增多,混合精度计算复杂度提升,量化性能提升收益会明显减小。混合精度对硬件不友好。

2 gptq

论文地址:arxiv.org/pdf/2210.17…
github:github.com/IST-DASLab/…
量化规格:A16W4

量化思路: GPTQ算法是逐步演变的(OBD->OBS->OBQ->GPTQ),简单说GPTQ试图最小化weight量化后和量化前的层函数误差。 对应的数学公式如下:
GPTQ优化目标

image.png

GPTQ优化目标求解

image.png

wqw_q代表最先进行量化的weight,δq\delta_q 代表对剩下权重的更新,H是二阶的Hessian matrix。

GPTQ对每个weight进行逐步量化,每组参数量化后调整未量化参数,从而弥补量化引入的误差,弥补的数值需要参考上述公式最优解结果。

实现算法如下:

image.png

详细算法代码解读可参考:GPTQ & SmoothQuant & AWQ 代码解析

GPTQ使用海森矩阵评估参数重要性以及更新量化后的参数,并利用GPU并行显著提高处理速度;GPTQ是一种非常有效权重优化量化方式,大多数开源社区模型都支持。 不足点:1 需要校准集;2 未解决激活量化。

3 AWQ

论文地址:arxiv.org/pdf/2306.00…
github: github.com/mit-han-lab…
量化规格:A16W8

AWQ量化提出论文是MLSys 2024的best paper,AWQ可以认为是W4A16的SOTA,广泛支持在大多数低比特量化框架:TensorRT-LLM、FastChat、vLLM、TGI、LMDeploy。

AWQ和SmoothQuant思路比较像,区别是SmoothQuant关注matrix multiplication场景WXW*X Int8量化(A8W8),而AWQ关注低比特weight量化(A16W4)。

量化思路:

image.png

(1)论文发现只有1% weight主导模型量化过程中的误差,只需要保护1%的权重即可显著降低量化误差。不同于LLM.int8()混合精度方式对硬件不友好,论文发现伸缩重要权重channel即可。
(2)离线分析激活分布,确定哪些是重要权重;
(3)保护重要权重:对weight per-channel量化,对激活除以scale;
(4)使用grid search方式确定最优scale,最优scale使量化误差最小。 优化目标: image.png

scale搜索空间: image.png

4 HQQ

github地址:github.com/mobiusml/hq…
量化规格:A16W8

量化思路: HQQ的量化思路不同于上述方案,HQQ提出一种鲁棒的寻找最优量化参数(scale、zp)的公式,公式如下:

image.png Qz,s()Q_{z,s}()是量化算子,Qz,s()1Q_{z,s}()^{-1}是反量化算子。 为了简化计算,引入参数WeW_e,固定scale并优化zp参数:

argminz,Weφ(We)+β2We(WQz1(Qz(W))22\underset{\mathrm{z}, \mathrm{W}{\mathrm{e}}}{\operatorname{argmin}} \varphi\left(\mathrm{W}{\mathrm{e}}\right)+\frac{\beta}{2} | \mathrm{W}{\mathrm{e}}-\left(\mathrm{W}-\mathrm{Q}{\mathrm{z}}^{-1}\left(\mathrm{Q}_{\mathrm{z}}(\mathrm{W})\right) |_2^2\right.

关键步骤:
第1步:固定其他参数,找到使loss最低;
第2步:固定WeW_e,找到最优的z。

HQQ通过对零点量化的公式转换,将目标问题分解为两个子问题,找到最优zp。不需要校准集。

参考:
zhuanlan.zhihu.com/p/695267503
mobiusml.github.io/hqq_blog/