AWQ 的原理是什么?它和 GPTQ 有什么区别?
简化版
AWQ 是一种训练后、仅权重量化方法:它用校准激活识别对输出更敏感的权重通道,再搜索逐通道缩放,使这些权重落到更合适的低比特量化网格上。GPTQ 则利用近似二阶信息逐块量化并补偿已产生的误差;二者都要校准,但重要性依据和求解过程不同。
详细版
- AWQ 的出发点是权重误差对输出的影响还取决于输入激活;只按权重绝对值判断敏感性不够。
- 它从少量代表性校准样本收集激活统计,并搜索逐输入通道 scale。缩放在浮点域保持线性层等价,却改变随后舍入时各通道承担的误差。
- GPTQ 常以层输出重构误差为目标,利用输入近似 Hessian 的逆逐列或逐块更新未量化权重;AWQ 不做这种逐列二阶补偿。
- 两者常用于 4 bit weight-only 部署,真实速度由 group size、零点、打包格式和目标运行时 kernel 决定,不能只比较算法名称。
完整版教学
记忆钩子:AWQ 是“用激活找敏感通道,再搜索缩放”;GPTQ 是“用二阶重构误差决定如何逐块舍入并补偿”。
一、为什么仅看权重大小不够
线性层输出是 Y=XW,某个权重的舍入误差最终要与对应输入激活相乘。一个绝对值不大的权重若经常乘上幅值很大的激活,仍可能显著扰动输出;反过来,大权重所在通道若很少被激活,影响未必最大。因此 AWQ 用校准激活辅助判断敏感性,而不是把每个权重一视同仁。
二、核心机制怎么工作
AWQ 的经验观察是:每层通常只有一小部分权重通道尤其敏感,优先保护它们往往比统一提高所有权重精度更划算。这里的“小部分”是模型和校准分布相关的经验现象,并不是固定的 1%。实现会根据激活统计和权重分布搜索缩放指数或缩放因子,使量化后的层输出误差更小。
缩放并没有改变浮点线性层的函数,因为 Y=XW=(XS)(S^-1W);变化发生在随后对 S^-1W 舍入到低比特网格时。合适的 S 能让高激活通道对应的关键权重少受舍入影响,但过强缩放会把动态范围压力转移到其他通道。
三、一个缩放为何能改变量化误差
设两条输入通道的激活峰值分别为 8 和 0.5,量化前某列权重为 [0.20, 0.80]。若量化后误差分别是 0.02 和 0.04,它们对输出误差的量级约为 8×0.02=0.16 与 0.5×0.04=0.02;第一通道虽然权重更小,却敏感得多。选择对角缩放矩阵后,可把第一通道对应权重放大后再量化,从而相对减小它的舍入误差。
Y = XW = (X S^-1)(S W) # S 为正的逐输入通道对角矩阵
Y_hat = (X S^-1) Q(S W) # 量化后不再严格等价
目标:搜索 S,使 ||XW - (X S^-1)Q(SW)|| 尽可能小
缩放不能凭空消除误差:权重侧更容易量化时,激活幅值和其他通道的权重动态范围会变化。AWQ 的关键正是搜索这个折中,而不是简单地把“重要权重”永久保留为浮点数。
四、从校准到部署的完整流程
先取能代表线上语言、长度和任务类型的校准样本,对目标线性层收集输入激活统计。随后在候选缩放参数中评估量化层输出或模型质量,选出 scale,再按 group size、对称/非对称策略执行低比特打包。最后必须用目标运行时加载,因为转换器与 kernel 对 scale、zero point 和张量布局的约定必须一致。
校准样本前向
|
统计激活通道重要性
|
搜索缩放因子
|
保护关键权重通道
|
执行低比特量化
|
使用匹配 kernel 推理
五、AWQ 与 GPTQ 到底差在哪里
| 维度 | AWQ | GPTQ |
|---|---|---|
| 核心思想 | 保护激活重要通道 | 二阶误差补偿 |
| 误差处理 | 先搜索通道缩放,再统一量化 | 量化一部分后更新剩余权重以补偿误差 |
| 二阶信息 | 不依赖 GPTQ 式 Hessian 逆更新 | 用输入统计近似 Hessian,并做逐块求解 |
| 校准数据 | 用于激活统计与 scale 搜索 | 用于估计层输入协方差/重构误差 |
| 常见旋钮 | 缩放搜索、group size、zero point | group size、列顺序、damping |
| 部署前提 | 量化布局必须有匹配 kernel | 同样依赖格式和 kernel 支持 |
六、校准集怎样影响结果
AWQ 学到的是校准分布下的激活敏感性。如果校准集只有短英文对话,线上却主要是中文代码和长上下文,通道排序与缩放可能失配。校准不只看样本条数,还要覆盖实际 Prompt 模板、主要语言、长度区间和高风险任务;选择 scale 的数据与最终回归集也应分开,避免把校准误差当成泛化质量。
七、性能收益为何不能由“4 bit”直接推出
4 bit 通常能明显减少权重字节,但推理时仍可能把权重解包或反量化到更高精度参与矩阵乘。若目标 GPU/CPU 没有匹配的 fused kernel,转换开销、内核启动和不合适的 batch 可能抵消带宽收益。验收要同时测文件大小、峰值显存、Prefill 吞吐、TPOT 和业务正确率,并与同运行时的 FP16/BF16 基线比较。
八、常见误区与追问
- 误区:AWQ 和 GPTQ 只是文件格式不同。 AWQ 依据激活幅值保护显著通道;GPTQ 用二阶近似逐块补偿量化误差,优化依据和转换过程都不同。
- 误区:保护少数通道会让其他通道完全不重要。 AWQ 仍会量化全部目标权重,只是通过缩放降低敏感通道的误差;普通通道的累计误差仍需评测。
- 误区:AWQ 不需要校准数据。 它必须用代表性输入统计激活,校准分布偏离线上请求时,所谓“重要通道”也会选偏。
- 追问:AWQ 为什么叫 activation-aware? 权重重要性不是只看权重绝对值,而是结合输入激活估计该权重误差会怎样传到层输出。
- 追问:AWQ 适合和 LoRA 合并后的模型一起用吗? 可以先把 LoRA 合并到浮点基座再重新校准和量化;若运行时动态切换 Adapter,则需确认量化基座与 Adapter kernel 的兼容性。
- 追问:如何在 AWQ 和 FP16 之间做质量验收? 除困惑度外,要对代码、长上下文、结构化输出和业务集做逐项回归,并在目标卡型测真实吞吐、显存和尾延迟。
九、加强记忆
把 AWQ 串成“激活统计 → 敏感通道 → 等价缩放 → 低比特打包 → 目标 kernel 验收”。它不是把少数权重永远留在高精度,也不是 GPTQ 的另一种文件后缀;二者的共同点是 PTQ,分界线是 AWQ 搜索激活感知的 scale,GPTQ 做二阶重构误差补偿。最后牢记:算法决定误差怎么分配,校准集决定它看见什么,kernel 才决定压缩能否变成真实加速。