第 16 章 后训练量化:GPTQ、AWQ 与 SmoothQuant¶
开场问题:同样量化到 4 bit,为什么有的方法困惑度几乎不变,有的直接胡言乱语?
16.1 误差从哪来:离群值¶
把连续的权重映射到 16 个刻度(INT4),误差的主要来源不是"刻度不够密",而是少数极端值把刻度撑开了。
假设一组权重里 99% 都在 ±0.1 之间,但有一个值是 5.0。为了表示得下这个 5.0,整个网格的范围必须拉到 ±5.0,于是那 99% 的正常值全都挤在中间一两个刻度里,信息基本全丢。
大模型的激活里这种离群值特别多,而且集中在固定的少数几个通道上。几乎所有量化算法都是在处理这一个问题,区别只在处理方式。
16.2 最朴素的 RTN 和它的问题¶
RTN(round-to-nearest)就是直接四舍五入到最近的刻度。配合 per-group 粒度,在 INT8 上基本够用,在 INT4 上通常会掉点明显。它的问题是逐个权重独立处理,完全不考虑这个权重对模型输出的影响有多大。
后面三个算法各自从不同角度修正这一点。
16.3 GPTQ:量化完一列,用剩下的列补偿误差¶
思路是把量化看成一个优化问题:不要求每个权重都量化得准,而要求这一层的输出尽量不变。
具体做法是逐列处理权重矩阵:量化第一列,算出这一列因为量化产生的输出误差,然后调整尚未量化的那些列的数值来抵消这个误差,再量化第二列,如此往下。调整的依据来自输入激活的二阶信息(Hessian 的近似),也就是"哪些输入方向更重要"。
它需要一批校准数据来估计这个二阶信息,量化过程本身要跑一会儿(几十分钟到几小时,取决于模型大小),但不需要重新训练。它是 INT4 weight-only 场景下的经典方案。
16.4 AWQ:保护重要通道,而不是补偿¶
AWQ 的出发点更简单:不是所有权重同等重要。用激活的统计量判断哪些输入通道重要(激活幅度大的通道对应的权重更关键),然后在量化前给这些通道的权重乘一个放大系数,让它们在量化网格里占更多刻度;推理时在激活侧除回去,数学上等价。
它不需要二阶信息,量化速度比 GPTQ 快得多,部署生态也很成熟。核心洞察是"重要性由激活决定,不是由权重自身的大小决定"——只看权重大小来挑重要参数是错的。
16.5 SmoothQuant:把激活的难题搬给权重¶
前两个是 weight-only。想做 W8A8 就必须面对激活量化,而激活的离群值比权重严重得多。
SmoothQuant 的做法很巧:对每个通道,给激活除以一个系数 s、给对应的权重乘上 s。矩阵乘的结果完全不变(因为 (X/s) @ (s·W) = X @ W),但激活的离群程度被削平了,代价是权重的动态范围变大了一点。因为权重本来就好量化(分布规整、可以离线处理),这笔交换非常划算。
系数 s 按通道计算,由激活和权重各自的幅度共同决定,可以用一个超参控制"迁移多少"。
16.6 校准数据怎么选¶
PTQ 方法都需要一小批校准样本来统计激活分布。三个常见错误:
分布不匹配——用通用网页文本校准一个代码模型,代码任务上会明显掉点。校准集应该覆盖真实的任务、语言和格式。
长度不匹配——只用短文本校准,长上下文场景的激活分布没被覆盖。
过度追求数量——几百到几千条通常就够了,代表性远比数量重要。
16.7 混合精度:不要一刀切¶
实践中从不把整个模型量化到同一精度。通常保持较高精度的部分包括:embedding 和 lm_head(直接影响输出分布)、所有 norm 层的参数、MoE 的 router(它的输出决定离散的专家选择,一点误差就可能改变路由结果)、以及实测下来特别敏感的少数层。
MoE 还有个专属问题:专家粒度的量化误差分布不均,冷门专家的校准数据天然更少,容易量化得更差。
16.8 验收:困惑度不够用¶
困惑度几乎不变,业务效果掉一大截是量化上线最常见的翻车方式。因为困惑度是全体 token 的平均值,而量化的伤害往往集中在少数关键能力上。
一份能用的验收清单:分任务评测(代码、数学、多语言、指令遵循各自单独看)、长上下文专项、格式化输出的稳定性(JSON、工具调用)、以及最终的线上 A/B。先塌的总是代码、数学和长上下文,这三项应该作为量化质量的哨兵指标。
16.9 先看有没有 kernel,再挑算法¶
这是本章最实用的一条。一个量化方案能不能落地,第一决定因素是目标硬件和推理引擎有没有对应的高效实现。
算法上更漂亮、压缩率更高,但运行时需要频繁反量化、或者退回通用算子执行,结果往往是"文件小了,服务慢了"。正确的选型顺序是:目标硬件与引擎支持 → 目标工作点上的实测性能 → 任务质量 → 最后才是算法名字。
核心问答¶
Q:GPTQ 和 AWQ 的核心区别? GPTQ 是事后补偿(量化一列,调整后面的列来抵消误差),AWQ 是事前保护(按激活重要性给关键通道放大,让它们量化得更准)。AWQ 更快,GPTQ 在某些场景精度略好,实际选择主要看引擎支持。
Q:SmoothQuant 为什么能"凭空"改善量化? 它没有凭空改善,而是把难量化的激活的动态范围转移了一部分给好量化的权重。总难度守恒,但分配得更合理。
Q:为什么 router 必须保高精度? 它的输出经过 top-k 变成离散选择,微小的数值误差可能让 token 路由到完全不同的专家,误差被放大成结构性改变。
Q:只测困惑度会漏掉什么? 几乎所有集中性的能力损伤——代码生成、多步数学、长上下文召回、结构化输出。这些恰恰是业务最依赖的。