大模型量化:三种思路

举报
黄生 发表于 2026/09/26 20:07:40 2026/09/26
【摘要】 量化的核心逻辑其实很统一:LLM的权重和激活值分布不均匀,直接四舍五入到低比特会损失很大。把LLM想象成一个巨大的水库,里面水的深浅极不均匀:大部分地方很浅,但偶尔有几处极深。如果想把水库画成一张只有16级灰度的简笔画(4-bit量化,2⁴=16个离散值),直接用统一的色阶去画,那些极深和极浅的地方都会画歪。下面几种算法,就是几种不同的画图技巧。 1. OmniQuant:精修水库的边界Om...

量化的核心逻辑其实很统一: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 学取整偏移 + 裁剪 每个数该舍还是入,让模型自己学
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。