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

> AWQ 和 GPTQ 都是 4-bit weight-only 量化，区别在怎么补偿误差：GPTQ 用 Hessian 二阶信息逐列校正权重，需要重建、小时级；AWQ 不改权重数值，只按激活幅度做 per-channel 缩放保护约 1% 的显著通道，无重建、分钟级。本文给出选型判据。

Canonical: https://zzszmyf.github.io/notes/awq%E5%92%8Cgptq%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB-4bit%E6%9D%83%E9%87%8D%E9%87%8F%E5%8C%96%E6%80%8E%E4%B9%88%E9%80%89/


> 系列导航：[LLM 量化精读笔记总览](/notes/llm量化精读笔记-00-总览与学习地图/)（共 11 篇）｜本文是把 [05 RTN 与 GPTQ](/notes/llm量化精读笔记-05-权重量化i-rtn与gptq/) 和 [06 AWQ 与 QuIP#](/notes/llm量化精读笔记-06-权重量化ii-awq-squeezellm-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 的占用；真正难压的激活量化是另一条线，见 [激活量化为什么比权重量化难](/notes/llm量化精读笔记-07-激活量化-llm-int8与smoothquant/)。两者都用 group 量化，常见 `group_size=128`，每 128 个权重共享一组 scale 和 zero，粒度选择见 [量化粒度怎么选](/notes/llm量化精读笔记-04-量化粒度校准与离群值/)。两者都需要校准集，跑几百条文本拿到激活统计，不需要反向传播，也不需要原始训练数据。在这三个共同点上，它们的分歧只有一个：量化误差已经产生了，你怎么补？

## 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 章](/notes/llm量化精读笔记-05-权重量化i-rtn与gptq/)。代价有三条。慢是第一个：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#](/notes/llm量化精读笔记-06-权重量化ii-awq-squeezellm-quip/)；GPTQ 在 3-bit 比 AWQ 更稳，2-bit 则要看 QuIP# 那一类方法。指令微调或多模态模型上，AWQ 的泛化优势更明显；这是论文里的观察，落到你的任务仍要用下游指标验收。

量化完要上服务，先看 [量化模型怎么部署到 vLLM](/notes/llm量化精读笔记-11-系统协同与部署/)。算法好不等于端到端快：同样的 4-bit 权重，kernel 版本、batch 和并行方式不同，P95 能差出一截。

## 几个容易踩的坑

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

量化对象不只是权重。长上下文场景下 KV Cache 往往才是显存大头，见 [KV Cache 量化怎么做](/notes/llm量化精读笔记-08-kv-cache量化与kivi/)。另外，只量化目标模型、不量化草稿模型，会让推测解码的收益被稀释，这点在 [推测解码上线怎么验收](/notes/llm推测解码精读笔记-06-系统集成与生产验收/) 里有量化分析。

## 参考

原始论文是 [GPTQ（arXiv:2210.17323）](https://arxiv.org/abs/2210.17323) 和 [AWQ（arXiv:2306.00978）](https://arxiv.org/abs/2306.00978)；OBS 的推导见 [OBQ（Frantar & Alistarh, NeurIPS 2022）](https://arxiv.org/abs/2208.11580)。GGUF 的格式说明在 [llama.cpp 仓库](https://github.com/ggml-org/ggml/blob/master/docs/gguf.md)。

