↓跳到主要内容
  1. 技术笔记/

AWQ 和 GPTQ 有什么区别?4-bit 权重量化怎么选

·294 字·2 分钟

English summary

系列导航: LLM 量化精读笔记总览(共 11 篇)|本文是把 05 RTN 与 GPTQ 和 06 AWQ 与 QuIP# 两章并起来看的对比篇。

先看一组诊断数字 #

OPT-13B 做到 INT3-g128,全量化后 WikiText-2 困惑度 46.04,FP16 基线是 10.13。只把 1% 的通道留成 FP16,如果按激活幅度挑,困惑度回到 10.51;按权重幅度挑是 48.96,随机挑是 42.00。AWQ 论文用这组数说明,低位宽下真正难保的是少数被激活反复打中的通道。GPTQ 走的是另一条路:它承认量化误差已经发生,然后用 Hessian 逆把误差摊到后面还没量化的列上。落到工程上,选择取决于你愿意付多少离线量化时间、能不能接受重建式流程,以及目标位宽。

它们到底在争什么? #

先把共同前提摆清楚。两者都只压权重,激活和 KV Cache 仍留在 FP16,所以它们解决的是权重显存和权重带宽,不解决长上下文下 KV Cache 的占用;真正难压的激活量化是另一条线,见 激活量化为什么比权重量化难。两者都用 group 量化,常见 group_size=128,每 128 个权重共享一组 scale 和 zero,粒度选择见 量化粒度怎么选。两者都需要校准集,跑几百条文本拿到激活统计,不需要反向传播,也不需要原始训练数据。在这三个共同点上,它们的分歧只有一个:量化误差已经产生了,你怎么补?

GPTQ 的思路:把误差"扩散"到还没量化的权重上 #

GPTQ 的出发点是最小化层输出误差:

$$\min_{\hat{W}} \|WX - \hat{W}X\|^2$$

它逐列处理权重:量化第 $q$ 列产生误差后,立刻用 Hessian 逆矩阵把这个误差补偿到后面还没量化的列上,让整层的输出误差最小。补偿量就是经典的 OBS 公式

$$\delta F = -\frac{w_q - \hat{w}_q}{[H^{-1}]_{qq}} \cdot H^{-1}_{:,q}$$

工程上 GPTQ 靠三个观察把 OBQ 的 $O(d^3)$ 压到可跑:列顺序不影响结果、可以按行并行、用 Cholesky 分解避免反复求逆。完整推导和 2×2 手算例子在 05 章。代价有三条。慢是第一个:175B 要逐层前向再加线性代数,小时级;RTN 只要几秒。第二个是二次假设,目标函数只在最优点附近近似二次,4-bit 以下补偿公式不再最优。第三个是校准集依赖,Hessian 来自校准数据,分布偏了误差就偏。H 里含激活的二阶统计,但没有显式用一阶的幅度信息,这正是 AWQ 的切入点。

AWQ 的思路:不动权重,动 scale #

AWQ 先做了个诊断实验:INT3-g128 量化 OPT-13B 后,把一部分通道保留成 FP16(混合精度),看保留谁最有效。WikiText-2 困惑度如下,FP16 基线 10.13:

保留策略PPL
全量化(RTN)46.04
保留 1% 通道为 FP16(按激活幅度选)10.51
保留 1% 通道为 FP16(按权重幅度选)48.96
保留 1% 通道为 FP16(随机选)42.00

结论很直接:决定成败的显著通道只有约 1%,而且必须按输入激活的幅度识别,按权重本身的幅度挑几乎等于没挑。问题是混合精度在硬件上很难做,内存布局和 kernel 都要分支。AWQ 的替代方案是数学等效:把显著通道的权重放大 $s$ 倍、对应激活缩小 $s$ 倍,量化误差约缩小 $1/s$,效果上等于"保护",但权重依然是整齐的 INT4。缩放系数取

$$s_j = (\max |X_j|)^\alpha$$

再对 $\alpha$ 做网格搜索。在 OPT-6.7B INT3-g128 上扫出来的甜点是 $s \approx 2$:显著通道误差减半,同时只有约 8% 的组被"顶到新的 max"而伤到同组其他通道。代价是 $s$ 太大会反噬:$s=4$ 时 21.2% 的组被顶爆,PPL 反而从 11.92 回升到 12.36。

两者差别,落在取舍上 #

补偿机制上,GPTQ 用 Hessian 二阶信息做逐列更新,AWQ 用激活幅度做 per-channel 缩放;前者需要重建,后者不需要。量化时间因此差一个量级:175B 的 GPTQ 是小时级,AWQ 是分钟级。甜点位宽也不一样,GPTQ 在 3–4 bit 都能用,AWQ 的主力是 4 bit;到 2-bit,两者都会崩,得换 QuIP# 这类方法。校准集偏移时,AWQ 只用到激活的 max,抗偏一点;GPTQ 的 Hessian 对校准分布更敏感。AWQ 的盲区在另一头:它只保护幅度大的通道,不看通道之间的相关性。硬件上,AWQ 的 scale 可以折进相邻层,推理图里不新增算子;GPTQ 的 kernel 要为列重排和 group 元数据做特殊处理,部署前得确认引擎版本支持。

生态方面,两边在 vLLM、TensorRT-LLM 和 Hugging Face 上都有产物;AWQ 还多 LMDeploy 和 TinyChat 两条路径。这个差别在选型里不是决定性的,真正要先定的是部署面:跑在什么硬件和引擎上,引擎支持哪些格式,再回头选算法。反过来的顺序经常要在格式转换上再付一次工程成本。

那 GGUF 是哪一层的东西? #

GGUF 经常和这两个算法被放在一起搜,但它回答的是另一个问题。GPTQ 和 AWQ 是量化算法,决定权重用什么方法压到 4-bit;GGUF 是文件格式和运行时容器,主要服务 llama.cpp,里面装的通常是 Q4_K_M 这类 k-quant 方案,而不是 GPTQ/AWQ 的产物。所以正确的比较方式是先定推理引擎:想上 vLLM / TensorRT-LLM 的高吞吐服务,就走 GPTQ 或 AWQ;想在 Mac、CPU 或 llama.cpp 上跑,就走 GGUF。这两条路服务的是不同部署面,算不上竞品。

我该选哪个? #

通用生产服务、目标是 W4A16,AWQ 是默认选项:几分钟跑完,校准集过拟合风险低。已经有 GPTQ 权重产物、流水线依赖它,继续用,迁移的收益通常抵不过重新验收的成本。要压到 3-bit 还保质量,先看 SqueezeLLM、QuIP#;GPTQ 在 3-bit 比 AWQ 更稳,2-bit 则要看 QuIP# 那一类方法。指令微调或多模态模型上,AWQ 的泛化优势更明显;这是论文里的观察,落到你的任务仍要用下游指标验收。

量化完要上服务,先看 量化模型怎么部署到 vLLM。算法好不等于端到端快:同样的 4-bit 权重,kernel 版本、batch 和并行方式不同,P95 能差出一截。

几个容易踩的坑 #

别只看困惑度。PPL 掉 0.1 不代表下游任务没问题,验收协议见 量化后精度掉了怎么定位。校准集要接近线上分布,代码、长上下文这类场景要单独校准,不能直接复用通用语料。group_size 也别随手改,128 是生态默认值,kernel 是按它调的,改小可能换精度但掉进慢路径。

量化对象不只是权重。长上下文场景下 KV Cache 往往才是显存大头,见 KV Cache 量化怎么做。另外,只量化目标模型、不量化草稿模型,会让推测解码的收益被稀释,这点在 推测解码上线怎么验收 里有量化分析。

参考 #

原始论文是 GPTQ(arXiv:2210.17323) 和 AWQ(arXiv:2306.00978);OBS 的推导见 OBQ(Frantar & Alistarh, NeurIPS 2022)。GGUF 的格式说明在 llama.cpp 仓库。

常见问题

AWQ 和 GPTQ 有什么区别?4-bit 权重量化怎么选

低位宽下真正难保的是少数被激活反复打中的通道。AWQ 按激活幅度保护大约 1% 的显著通道,不改权重数值;GPTQ 承认误差已经发生,再用 Hessian 把误差摊到后面还没量化的列上。选型取决于离线量化时间,以及能不能接受重建。