经典的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,最后把它们累加起来作为最终结果输出。
优点: 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优化目标
GPTQ优化目标求解
代表最先进行量化的weight, 代表对剩下权重的更新,H是二阶的Hessian matrix。
GPTQ对每个weight进行逐步量化,每组参数量化后调整未量化参数,从而弥补量化引入的误差,弥补的数值需要参考上述公式最优解结果。
实现算法如下:
详细算法代码解读可参考: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场景 Int8量化(A8W8),而AWQ关注低比特weight量化(A16W4)。
量化思路:
(1)论文发现只有1% weight主导模型量化过程中的误差,只需要保护1%的权重即可显著降低量化误差。不同于LLM.int8()混合精度方式对硬件不友好,论文发现伸缩重要权重channel即可。
(2)离线分析激活分布,确定哪些是重要权重;
(3)保护重要权重:对weight per-channel量化,对激活除以scale;
(4)使用grid search方式确定最优scale,最优scale使量化误差最小。
优化目标:
scale搜索空间:
4 HQQ
github地址:github.com/mobiusml/hq…
量化规格:A16W8
量化思路: HQQ的量化思路不同于上述方案,HQQ提出一种鲁棒的寻找最优量化参数(scale、zp)的公式,公式如下:
是量化算子,是反量化算子。
为了简化计算,引入参数,固定scale并优化zp参数:
关键步骤:
第1步:固定其他参数,找到使loss最低;
第2步:固定,找到最优的z。
HQQ通过对零点量化的公式转换,将目标问题分解为两个子问题,找到最优zp。不需要校准集。
参考:
zhuanlan.zhihu.com/p/695267503
mobiusml.github.io/hqq_blog/