模型量化怎么选:GGUF、AWQ、GPTQ 对比与选型指南
量化是在有限显存上跑更大模型的核心手段。把一个 70B FP16 模型从 140GB 压缩到 35GB,就可以在两张 A100 而非四张上运行,成本直接减半。但量化方案不止一种——GGUF、AWQ、GPTQ 各有适用场景,选错方案会导致推理变慢、精度损失超预期,或者根本跑不起来。
我见过最常见的翻车场景是这样的:团队看别人博客说”INT4 量化省 70% 显存”,兴冲冲下了个 GPTQ 模型丢进 vLLM,结果启动报错 AssertionError: desc_act must be False for marlin kernel 或者干脆吞吐量比 FP16 还低。根子在于没搞清楚量化格式和推理框架、GPU 架构之间的匹配关系——量化不是”随便选一个压缩比最高的”,而是要按你的部署环境反推。这篇就把三种主流方案的底层差异、真实踩过的坑、怎么自查落地一次讲透。
三大量化方案速览
| 维度 | GGUF(llama.cpp) | AWQ | GPTQ |
|---|---|---|---|
| 格式来源 | llama.cpp 项目 | 论文 AWQ(MIT) | 论文 GPTQ(微软) |
| 主要推理框架 | Ollama、llama.cpp | vLLM、LMDeploy、TGI | vLLM、TGI、AutoGPTQ |
| CPU 推理 | 原生支持 | 基本不支持 | 基本不支持 |
| 精度损失(vs FP16) | 中(取决于量化级别) | 小 | 中 |
| 量化速度 | 快(本地转换) | 慢(需校准数据集) | 慢(需校准数据集) |
| 推理速度 | CPU 快,GPU 中 | GPU 快 | GPU 中,略慢于 AWQ |
| HuggingFace Hub 支持 | 有(TheBloke 等社区发布) | 有 | 有 |
GGUF:CPU 友好的本地量化格式
GGUF 是 llama.cpp 使用的权重格式,最大优势是支持 CPU 推理,在没有 GPU 或 GPU 显存不足时可以自动把部分权重放到内存(RAM)里推理——速度慢但能跑。
量化级别对照(以 7B 模型为例):
| 级别 | 文件大小(约) | 精度 | 推荐程度 |
|---|---|---|---|
| Q2_K | ~2.5 GB | 损失明显 | 不推荐,仅极限场景 |
| Q4_K_M | ~4.1 GB | 损失轻微 | 日常首选 |
| Q5_K_M | ~4.8 GB | 损失极小 | 显存稍宽裕时选 |
| Q6_K | ~5.5 GB | 接近无损 | 追求精度时选 |
| Q8_0 | ~7 GB | 基本无损 | 显存充裕时选 |
Q4_K_M 是 GGUF 生态下的事实标准推荐,在显存节省和精度之间取得最好平衡。
这里顺便说清楚 GGUF 命名里那串字母到底是什么意思,很多人一直没搞明白就在瞎选。Q4_K_M 拆开看:Q4 是基础量化位宽(4 bit),K 表示用的是”K-quant”分块量化方案(不是老版本的线性量化,精度更好),M 表示 medium——同一个 K 位宽下还分 S(small,压得更狠精度更低)、M(medium,均衡)、L(large,精度更高文件更大)。所以你会看到 Q4_K_S、Q4_K_M、Q4_K_L 这种变体,选型时只要记住:“先定 Q4 还是 Q5,再在同位宽里选 M 档打底,显存吃紧降 S,精度要求高升 L”,不用去纠结每一档具体差多少个百分点的困惑度(perplexity),差异通常在 1% 以内,肉眼很难感知。
适合 GGUF 的场景:
- 用 Ollama 或 llama.cpp 本地跑模型
- 没有独立 GPU 或 GPU 显存不足
- 开发者个人测试,对速度要求不高
AWQ:GPU 推理首选量化方案
AWQ(Activation-aware Weight Quantization)的核心思想是:不是所有权重对精度的贡献都相等——找到”激活值较大”的权重通道保持更高精度,其余部分积极压缩。
展开讲讲为什么这么设计有效。传统量化(比如朴素的 per-tensor INT4)把一层里所有权重按同一套 scale 压缩,问题是:模型里有一小撮通道(业内叫 salient channel)的激活值明显偏大,这些通道哪怕只有轻微量化误差,传播到下一层也会被放大成明显的输出偏差。AWQ 的做法不是去精细量化这些通道本身(那样反而增加复杂度),而是反过来:先统计激活值分布找出这一小撮关键通道(通常占比不到 1%),给它们的权重乘以一个更大的 scale 因子再量化,等效于给这部分权重”腾出”更大的数值表示范围,从而把量化误差压下去;对应地,激活值也要除以同样的 scale 保持数学等价。整个过程只需要一小批校准数据统计激活值分布,不需要像 GPTQ 那样做逐层的二阶误差补偿计算,这也是 AWQ 量化速度通常比 GPTQ 略快、且不依赖具体校准样本内容的原因——换句话说,AWQ 对校准数据集的敏感度比 GPTQ 低,用什么通用语料校准结果都比较稳定。
主要优势:
- 精度损失是 INT4 方案中最小的,优于同等位宽的 GPTQ
- 推理速度快,GPU kernel 优化成熟
- vLLM、LMDeploy、TGI 均原生支持
量化需要校准数据集(通常用 Pile、WikiText 等),耗时数分钟到数十分钟不等。大量开发者已将量化好的模型发布到 HuggingFace Hub(搜索模型名 + AWQ 即可找到),不必每次自己量化。
适合 AWQ 的场景:
- 用 vLLM / LMDeploy 部署生产推理服务
- 显存不足以加载 FP16 权重,需要 INT4 节省
- 追求精度损失最小的 INT4 方案
GPTQ:老牌 GPU 量化方案
GPTQ 是最早流行的开源 INT4 量化方案,社区积累了大量预量化模型(TheBloke 在 Hub 上发布了数千个 GPTQ 模型)。
与 AWQ 的主要差异:
- 精度:AWQ 通常略好于 GPTQ,两者差距不大
- 速度:GPTQ 推理速度略慢于 AWQ(kernel 实现成熟度的差距)
- 历史资源:GPTQ 模型资源更多,部分模型只有 GPTQ 版本
适合 GPTQ 的场景:
- Hub 上找不到 AWQ 版本,只有 GPTQ 版本
- 已有 GPTQ 工作流不想迁移
- 用 AutoGPTQ 做量化实验
三个真实踩过的坑
选型只是第一步,真落地部署时下面这几个坑几乎人人都会撞一次,提前知道能省你几个小时排查时间。
坑一:GPU 架构不支持某些 kernel,报错却和量化本身无关。
在 T4、V100 这类较老的 GPU 上跑 AWQ 或 GPTQ 模型,vLLM 有时会报 RuntimeError: FP16 A matmul is not supported on GPUs with compute capability < 8.0 或者启动时卡在 marlin kernel 编译阶段半天没反应。根因是新版 AWQ/GPTQ 的高性能 kernel(marlin、exllama v2)依赖 Ampere 及以上架构(compute capability ≥ 8.0,也就是 A10/A100/RTX 30 系及以上),T4/V100 只能退回到较慢的 fallback kernel,甚至部分组合直接不支持。买卡或租卡前先确认 GPU 代际,别等模型下载量化完了才发现跑不起来。
坑二:量化模型的 tokenizer 版本和推理框架不匹配,输出乱码或截断。
有些 Hub 上的量化模型只上传了权重文件,配套的 tokenizer_config.json、special_tokens_map.json 版本和原始 FP16 模型对不上,加载后输出会出现重复 token、提前截断,或者中文输出变成一堆问号。排查方法很简单:始终从原始 FP16 模型仓库里拷贝 tokenizer 相关文件覆盖量化模型目录里的同名文件,而不是信任量化上传者打包的版本——这个坑在早期 GPTQ 模型上尤其常见。
坑三:显存”看起来”够但实际 OOM,是没算上 KV Cache 和激活值开销。
很多人算完权重显存刚好等于显卡容量就直接部署,结果并发请求一上来就 CUDA out of memory。量化只压缩了权重本身,推理时的 KV Cache(跟上下文长度和并发数成正比)、中间激活值这些开销并不会跟着等比例缩小。经验值是:权重显存之外,至少预留 20%–30% 作为 KV Cache 和运行时缓冲,长上下文或高并发场景要留得更多。具体怎么估算 KV Cache 占用,可以参考显存估算那篇的详细公式,这里不重复。
如何选量化方案
你用什么推理框架?
├── Ollama / llama.cpp → 选 GGUF(Q4_K_M 起步)
└── vLLM / LMDeploy / TGI(GPU)
├── 追求精度最优 → AWQ(首选)
└── Hub 上只有 GPTQ 版本 → GPTQ
显存节省对比(7B 模型):
| 精度 | 显存需求 | 相比 FP16 |
|---|---|---|
| FP16 | ~14 GB | 基准 |
| INT8(LLM.int8()) | ~7 GB | 节省 50% |
| AWQ/GPTQ INT4 | ~4 GB | 节省 70%+ |
| GGUF Q4_K_M | ~4 GB | 节省 70%+ |
常见问题
量化后对话质量会明显变差吗?
对大多数日常场景(对话、摘要、翻译、代码生成),INT4 量化的影响用户几乎感知不到。数学推理、复杂逻辑链等精度敏感任务可能有轻微下降。建议在你的实际业务数据上做评测后再决定。
AWQ 和 GPTQ 哪个量化速度更快?
两者都需要校准数据集,耗时相近(7B 模型通常 10–30 分钟)。如果 Hub 上已有现成的量化模型,直接下载远比自己量化省时间。
可以混合精度吗?比如部分层 FP16 部分层 INT4?
可以。bitsandbytes 的 LLM.int8() 就是混合精度的实现——对激活值较大的层保留 FP16,其余用 INT8,精度损失极低。但这种方案推理速度不如纯 AWQ/GPTQ 优化的 kernel。
显存充裕时有必要量化吗?
没有。FP16/BF16 精度最高,吞吐量通常也更好(不需要反量化开销)。量化是显存受限时的工具,不是追求更高吞吐的手段。
延伸阅读:
- 算力基础全景:大模型算力基础指南
- 显存估算方法:跑大模型要多少显存
- vLLM 量化部署:vLLM 部署高并发推理
- Ollama 本地使用:Ollama 本地快速跑模型
- 算力专题 Hub:算力专题
- 不想折腾量化格式?加入候补,直接调用托管 API