输入“/”快速插入内容

(9)LLM模型量化世界观(下)

⏰ 发布时间:2024-06-06 12:51:29 (UTC+8)
公式部分因格式转化困难,建议访问上述知乎链接查看
更新记录
更新时间
更新内容
2024.04.09
完成正式版第一版
开篇
大家好,我是小A。围绕LLM模型量化的7个问题,我们在上一篇 《LLM模型量化世界观(上)》 中介绍了前面3个,这一篇开始我们讨论剩余的4个问题
问题1:浮点数和定点数本质区别是什么?
问题2:QAT是如何学习scale的?
问题3:Weight-only常规比特量化有什么常见方法,二阶导方法如何推导?
问题4:Weight-only极低比特量化有什么开脑洞的方法?
问题5:Activation+Weight量化中交叉维的均衡化都有哪些玩法?
问题6:FP8 量化效果究竟怎么样?
问题7:KV Cache量化都有哪些方法?
Weight-Only极低比特量化
常用的OBS/OBQ/GPTQ/OWQ/AWQ等方法一般用作不小于4bit的量化场景,当比特数进一步下降到小于4bit的时候,往往需要重新审视量化问题,回归压缩存储的初衷。本小节将介绍3种方法
SpQR用分治方法分离出敏感权重,然后对非敏感权重采用二级压缩方法,转化为3bit存储
SqueezeLLM也是先把极端值分离出来,对剩余的权重用加权的k-means聚类的非均匀量化方法
AQLM直接借鉴了近似搜索的方案,利用码本和码字来重新建模量化过程
SpQR
SpQR主要采取分治方法,分成两步
第一步,把敏感的权重挑选出来,用FP16高精度存储
第二步,对剩余权重用二级压缩方式,转换成3bit存储
挑选敏感权重
敏感权重的计算参照了OBS里面的结论,即
\begin{aligned}\Delta_E=\frac{(\text{quant}(w_k)-w_k)^2}{2(H^{-1})_{kk}}\end{aligned}
这里使用了逐层的重建误差,因此 H 相对容易得到。按误差从大到小排,选取前1%认为是敏感值,使用fp16的方式存储
二级压缩
对于剩下的非敏感值,SpQR对输入采用了group-wise量化,其中 \beta_1 \in[8,16] ,远小于常用的128。这导致保存scales和zeros本身的大小不可忽略,因此作者进一步把scales和zeros做了量化,形成二级压缩。具体来说,选择 \beta_2=16 个连续的一阶scales和zeros,用3bit表示;他们共享二阶scales和zeros,用半精度表示。
走Llama上的结果如下
SqueezeLLM
SqueezeLLM尝试解决内存墙访存问题,认为权重加载是性能瓶颈,因此将权重压缩到极低比特比较重要,具体策略为
用加权的k-mean方法做聚类,使用非均匀量化
用分治法把outlier识别出来转为高精度存储
作者首先测试了不同比特权重的端到端性能,如下所示,计算部分保持fp16。可见随着比特位数下降,执行速度近似线性提高