大模型量化:三种思路
量化的核心逻辑其实很统一:LLM的权重和激活值分布不均匀,直接四舍五入到低比特会损失很大。把LLM想象成一个巨大的水库,里面水的深浅极不均匀:大部分地方很浅,但偶尔有几处极深。如果想把水库画成一张只有16级灰度的简笔画(4-bit量化,2⁴=16个离散值),直接用统一的色阶去画,那些极深和极浅的地方都会画歪。
下面几种算法,就是几种不同的画图技巧。
1. OmniQuant:精修水库的边界
OmniQuant的核心是Learnable Weight Clipping(LWC,可学习权重裁剪)。它不直接画,而是先给水库里那些极深和极浅的地方标定一个合理的范围,把超出范围的极端值裁剪掉,只保留最有代表性的部分再画。
它的特点是:裁剪的力度不是人工拍脑袋定的,而是通过少量数据学出来的。这比传统的固定裁剪方式更精准,能在4-bit甚至更低比特下保持不错的精度。
2. LWC + LAC:OmniQuant的完整形态
LWC负责修整权重,而LAC(Learnable Activation Clipping,可学习激活裁剪)和LET(Learnable Equivalent Transformation,可学习等价变换)负责处理激活值。这两者是不同的技术:LAC直接优化激活值的裁剪范围,LET则通过数学变换来降低激活值的量化难度。
简单说,LET在一个线性层 Y = XW 中引入可学习的缩放向量 s,把等式改写成 Y = (X ÷ s) · (s ⊙ W)。乘在一起结果完全不变,但此时 X ÷ s 的分布更均匀、更容易量化,而 s ⊙ W 虽然分布变差了,却可以交给LWC来精细处理。换句话说,LET并没有把激活值物理搬到权重上,而是通过一个数学上恒等的变换,把激活值上难量化的特征转嫁给权重去承担,权重那边恰好有LWC这把精修工具等着。这样双管齐下,量化误差就小多了。
3. FlatQuant:把水库压平
FlatQuant的思路更直接:与其修修补补,不如想办法把水库底部的坑洼填平,让水深分布更均匀,这样用简笔画画起来就更容易。
它使用一种可学习的仿射变换来压平权重和激活值的分布,把那些尖峰和离群值摊开。为了让这个变换不那么笨重,它用了Kronecker分解技术,把一个大矩阵拆成两个小矩阵,既减少了计算量,又保证了效果。
它的成绩很亮眼:在LLaMA-3-70B上做W4A4(权重和激活都是4-bit)量化,精度损失不到1%,同时推理速度还能比FP16快2.3倍。
4. AutoRound:自动找最佳取整点
AutoRound的切入点更微观:四舍五入的舍和入本身也可以学习。
传统的量化就是简单的round-to-nearest(就近取整)。但AutoRound为每个待量化的数值引入了可训练的偏移量,让模型自己学出每个数应该往哪边偏一点,才能让整层的输出误差最小。它本质上是联合优化取整方式和裁剪范围。
它的优势是零推理开销。学到的参数会融合进量化后的权重里,推理时完全感觉不到额外的计算。同时它由Intel推出,在CPU/XPU/CUDA上都有良好的优化和生态支持。
小结
| 算法 | 核心动作 | 一句话比喻 |
|---|---|---|
| OmniQuant (LWC+LAC) | 学裁剪边界 + 转移离群值 | 先修水库边界,再把离群值挪到好处理的地方 |
| FlatQuant | 可学习仿射变换压平分布 | 把水库底部的坑洼填平了再画 |
| AutoRound | 学取整偏移 + 裁剪 | 每个数该舍还是入,让模型自己学 |
- 点赞
- 收藏
- 关注作者
评论(0)