量化简介
PTQ 三大方法(GPTQ / AWQ / SmoothQuant)及 INT8 / FP8 / INT4 的精度与加速权衡
核心要点:
- 推理才量化 (训练精度敏感,推理可降)
- Weight-only INT4 让 70B 模型从 140 GB 降到 35 GB (省 4×)
- GPTQ (二阶信息) / AWQ (activation-aware) / SmoothQuant (迁移 outlier) 三大 PTQ
- LLM.int8() 用 outlier 双流分解,显存 ×2 无损但无加速
- FP8 e4m3 H100 原生,TRT-LLM 默认;FP8 比 INT8 精度更优
- Llama 3.1 70B FP8 H100 throughput 1.87×, MMLU 仅 -0.3%
- llama.cpp Q4_K_M: 70B 模型 38-40 GB, MMLU 损 < 1.5%
名词定义
本篇共享名词在 8.1 总览 已定义 (INT8 / FP8 / INT4 / GPTQ / AWQ / SmoothQuant)。本篇新引入:
| 名词 | 定义 |
|---|---|
| PTQ (Post-Training Quantization) | 训练完成后做量化,不需重训;主流方案 |
| QAT (Quantization-Aware Training) | 训练时插入伪量化算子,让模型适应低精度;不展开 |
| Weight-only quantization | 仅量化权重,激活保持高精度 (FP16/BF16); decode memory-bound 受益大 |
| Activation quantization | 也量化激活,INT8 W + INT8 A;工程难度大 (outlier 敏感) |
| Outlier | 激活中少数维度的极端值,量化时迫使 scale 扩大让其他维度精度损失 |
| GGUF | llama.cpp 的量化文件格式,支持 Q4_K_M / Q5_K_M / Q8_0 等多档 |
| W4A16 | INT4 weight + FP16 activation,主流推理量化配置 |
| W8A8 | INT8 weight + INT8 activation,需要 SmoothQuant 类方法处理 outlier |
@tbl-quant-glossary 本篇新引入名词
为什么推理才量化?
核心问题:训练用 BF16,推理用 INT8 / FP8 / INT4——为什么不在训练阶段就用低精度?
训练梯度量级跨越大且对精度敏感 (一个梯度错就训不出来),推理仅前向不需要梯度精度,可激进降低。
训练 vs 推理的精度需求差异
| 维度 | 训练 | 推理 |
|---|---|---|
| 主要计算 | forward + backward + optimizer | 仅 forward |
| 梯度量级跨度 | $10^{-10}$ 到 $10^{10}$ | 无梯度 |
| 累积错误 | step → step 累积影响最终模型 | 单次 forward,无累积 |
| 对量化敏感性 | 高 (一个量化错训练崩) | 低 (PPL 可控) |
@tbl-quant-train-vs-infer 训练 vs 推理对量化敏感性
训练能用的最低精度:BF16 (混合精度) 或 FP8 (06-预训练/03-训练循环 已展开)。推理可降到 INT4。
量化在 decode memory-bound 上收益最大
Decode arithmetic intensity ≈ 1, memory-bound。量化让权重从 BF16 (2 bytes) 降到 INT4 (0.5 bytes),直接把内存带宽需求降 4×, throughput 提升 2-4×。
这是 weight-only quantization 主导业界的根本原因:仅量化权重 (decode 主瓶颈),激活保持 BF16 (精度不丢)。
数据格式:INT8 / FP8 / INT4
核心问题:三种主流低精度格式的设计取舍是什么?各自适合什么?
INT8 范围窄但分布均匀,FP8 动态范围大适合宽分布激活,INT4 16 级最激进需要精细方法。
INT8
- 256 个均匀离散值,对称 [-127, 127] 或非对称 (引入 zero-point)
- 核心障碍:激活 outlier 迫使 scale 扩大,压缩非 outlier 精度
FP8 (e4m3 / e5m2)
NVIDIA/Arm/Intel 2022 FP8 标准[1]:
| 格式 | 指数位 | 尾数位 | 最大值 | 适用 |
|---|---|---|---|---|
| FP8 e4m3 | 4 | 3 | ±448 | 前向推理 (权重 + 激活) |
| FP8 e5m2 | 5 | 2 | ±57,344 | 训练反向 (梯度动态范围大) |
@tbl-quant-fp8-formats FP8 两种格式
H100 原生支持 FP8,推理精度损失 < 0.5% (Llama-3 70B),对宽动态范围比 INT8 更鲁棒。
INT4
- 仅 16 级 (-7 到 +7 或 -8 到 +7)
- 直接 round-to-nearest (RTN) 不可用:OPT-175B PPL 从 8.34 跌到 10.54
- 必须配合 GPTQ / AWQ + group quantization (每 64 或 128 个 weight 共享一个 scale)
- W4A16 让 70B 模型从 ~140 GB 降到 ~35 GB
主流 PTQ 方法
核心问题:GPTQ / AWQ / SmoothQuant 各自解决什么?业界用哪个?
GPTQ 用 Hessian 信息逐列优化,AWQ 保护 1% salient 通道,SmoothQuant 把 outlier 迁移到 weight 实现 W8A8——各自有最优场景。
LLM.int8() (Dettmers NeurIPS 2022): outlier 双流分解
Dettmers et al.[2] 第一篇 LLM 量化:
- 发现 LLM 激活在少数固定 feature 维度出现 emergent outlier
- 双流分解:outlier 走 FP16,其余 > 99.9% 走 INT8 向量量化
- OPT-175B 无精度损失,内存降 50%
- 缺陷:有 FP16 分支,不能充分利用 INT8 算术,无推理提速
GPTQ (Frantar ICLR 2023):二阶信息逐列优化
Frantar et al.[3]:
- 基于 OBS (Optimal Brain Surgeon) + Hessian 框架
- 按列顺序量化,同时用 Hessian 信息补偿前面量化引入的误差
- Cholesky 预分解保数值稳定
- Lazy Batch Updates 提升 GPU 效率
实测 (OPT-175B INT4):
- WikiText PPL 仅升 0.03 (8.34 → 8.37)
- 量化 175B 耗时 4.2 小时 (单 A100)
- 推理加速 3.25× (A100) / 4.5× (A6000)
AWQ (Lin MLSys 2024):保护 salient 通道
Lin et al.[4] 核心观察:
- LLM 中仅 1% 的 channel 是 "salient" (对模型表现关键)
- Salient channel 由 激活幅值 标识 (大激活的 channel 对量化误差敏感)
- 对 salient channel per-channel scale up 权重 后量化,然后 scale down 折叠进前一层
- 零运行时开销 (scale 融合到前一层 weight)
实测:
- LLaMA-2 70B INT4 比 GPTQ 高 ~3% MMLU
- TinyChat 框架 3×+ 加速
- 支持 70B 在移动 GPU 运行
SmoothQuant (Xiao ICML 2023): outlier 迁移到 weight
Xiao et al.[5] 解决 W8A8 (INT8 weight + INT8 activation):
- 关键观察:activation outlier 是 W8A8 的核心障碍,weight 容易量化
- 用等价变换 $s_j = \max(|X_j|)^\alpha / \max(|W_j|)^{1-\alpha}$ (典型 $\alpha = 0.5$)
- 把激活 outlier 难度迁移到 weight,让两者都好量化
实测:
- OPT-175B / LLaMA W8A8 无损
- 1.56× 推理加速 + 2× 内存节省
- 单节点可服务 530B 模型
三方法对比
| 方法 | 精度 | 推理加速 | 复杂度 | 推荐场景 |
|---|---|---|---|---|
| LLM.int8() | 无损 | 无 (有 FP16 分支) | 低 | 显存省 |
| GPTQ | INT4 OPT-175B +0.03 PPL | 3-4.5× | 中 | INT4 主流 |
| AWQ | INT4 比 GPTQ +3% MMLU | 3×+ | 中 | INT4 高精度 |
| SmoothQuant | W8A8 无损 | 1.56× | 低 | INT8 主流 |
@tbl-quant-ptq-compare 主流 PTQ 方法对比
业界部署:TRT-LLM / vLLM / llama.cpp / SGLang
核心问题:几个推理框架实际用什么量化?性能数字什么样?
TRT-LLM 主推 FP8 + AWQ, vLLM 多种支持但 H100 GPTQ 有 bug, llama.cpp Q4_K_M 是边缘部署主流,SGLang 离线吞吐最高。
TensorRT-LLM (NVIDIA)
Llama 3.1 70B FP8 on H100:
- 吞吐 ~1,400 tok/s (vs FP16 ~750, 1.87×)
- 显存 70 GB (FP16 140 GB,省 50%)
- MMLU 损失仅 -0.3%
- 成本降 47% ($0.62 vs $1.16 per M tokens)
- batch=16 时 FP8 vs FP16 speedup 达 2.3×
INT4 AWQ:
- 吞吐 ~1,100 tok/s
- 显存 ~35 GB (省 75%)
- MMLU -1.8%
KV FP8 可使 batch 扩大 2-3×。
vLLM
FP8 Static on H100:
- 吞吐 16,453 tok/s (+26.7% vs FP16)
- 显存省 50%
AWQ INT4 on H100:
- 9,756 tok/s
- 显存 ~40 GB (省 71%)
H100 上 GPTQ 实现有 bug,生产暂用 AWQ。精度 AWQ 比 GPTQ 高 1-2%, AWQ 推荐 A100 及以下 GPU。
llama.cpp GGUF
| 量化 | Llama 70B 显存 | MMLU 损失 | 速度 |
|---|---|---|---|
| FP16 | 140 GB | 0 | baseline |
| Q8_0 (8-bit 近无损) | 70 GB | < 0.5% | 接近 FP16 |
| Q5_K_M (5-bit 高质量) | 50 GB | < 1.0% | 中 |
| Q4_K_M (4-bit 主流) | 38-40 GB (3.7×) | < 1.5% | 12.5 tok/s (M4 Max) |
@tbl-quant-gguf llama.cpp GGUF 量化档位 (Llama 2/3 70B)
学术实测 (arXiv 2601.14277): 8B 模型 Q4_K_M PPL 7.56, MMLU 62.43% (FP16 63.7%,损失 1.27%)。
Q4_K_M 是边缘部署 (Mac / PC) 主流,llama.cpp / Ollama 默认。
SGLang
- 支持 20+ 量化方案 (AWQ / GPTQ / FP8 / FP4 / GGUF)
- 高并发批量推理优势明显,Llama 70B 离线吞吐最高达 vLLM 的 3.1×
- 单请求 TTFT 340 ms (慢于 vLLM 123 ms),但 batch=64 峰值 460 tok/s
- 推荐离线量化优于在线动态量化
总结:业界量化路线
主流配置:
| 部署场景 | 推荐量化 |
|---|---|
| H100 / H200 (生产) | FP8 (TRT-LLM 默认),KV FP8 |
| A100 / A6000 (生产) | INT4 AWQ (W4A16), KV INT8 |
| 边缘 (Mac / PC) | GGUF Q4_K_M (llama.cpp) |
| 极致精度 (代码 / 数学) | INT8 SmoothQuant / FP8 |
| 极致显存 (大 batch) | INT4 + KV INT4 (KIVI) |
@tbl-quant-recommendations 不同场景的量化推荐
业界趋势:
- H100/H200 时代 FP8 全面替代 INT8
- INT4 weight-only 仍是显存极致压缩的主流 (AWQ / GPTQ)
- KV cache 量化与 weight 量化协同优化
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 为何推理才量化 | 训练梯度量级跨度大且累积错误致命,推理仅 forward 容忍精度损失 |
| Weight-only 主导 | decode memory-bound,量化权重直接降带宽需求 |
| FP8 e4m3 | H100 原生,±448,适合推理权重 + 激活 |
| FP8 e5m2 | ±57,344,训练梯度 |
| INT4 W4A16 | 70B 模型 140 GB → 35 GB,必须用 GPTQ/AWQ |
| LLM.int8() | outlier 双流,无损但无加速 |
| GPTQ | Hessian 信息 + 列序量化,OPT-175B INT4 PPL +0.03 |
| AWQ | 1% salient channel 用 scale 保护,MMLU 比 GPTQ 高 3% |
| SmoothQuant | activation outlier 迁移到 weight, W8A8 无损 |
| TRT-LLM | Llama 70B FP8 H100: throughput +87%, MMLU -0.3% |
| llama.cpp Q4_K_M | 70B 38-40 GB, MMLU < 1.5%, M4 Max 12.5 tok/s |
| 业界主推 | H100 FP8, A100 INT4 AWQ,边缘 Q4_K_M |
开放问题
- FP4 / Binary 量化的可行性:NVIDIA Blackwell 引入 FP4, weight INT2 仍在研究;是否会有"INT4 是终点" 的反弹
- 量化对 reasoning 任务的影响:数学 / 代码任务对量化更敏感,FP8 是否仍够用还待验证
- QAT 是否会回归:当前 PTQ 主导,但 reasoning 模型可能需要 QAT
- KV cache 量化 + 权重量化的联合优化:当前各自做,联合优化 (e.g., outlier 协同处理) 仍是开放问题
- 混合精度 inference (不同层不同精度) 是否值得:已有研究但未成熟
本章结束:推理走完一遍
走完 08 章 (5 篇),读者拿到 LLM 推理的完整工程主线:
- prefill / decode 计算特征 (02): roofline / MFU / MBU / PD 分离
- KV cache 管理 (03):显存 / PagedAttention / chunked prefill / 量化 / streaming
- 采样算法 (04): greedy / temperature / top-p / speculative
- 量化 (05): INT8 / FP8 / INT4 / GPTQ / AWQ / SmoothQuant
至此,06-大模型解构 整章节系列完整覆盖了 LLM 从 token 输入到 token 输出的全部内部数据流与工程主线。
延伸阅读
- 上一篇:采样与解码 → 8.4 采样与解码
- KV cache 量化 → 8.3 KV cache 的 KV 量化节
- 训练阶段精度选择 (BF16) → 06-预训练/03-训练循环与数据 的 BF16 节
- TensorRT-LLM 完整文档 → https://nvidia.github.io/TensorRT-LLM/
- llama.cpp GGUF 格式 → https://github.com/ggerganov/llama.cpp
参考资料
- Micikevicius et al. FP8 Formats for Deep Learning. NVIDIA/Arm/Intel, 2022. https://arxiv.org/abs/2209.05433
- Dettmers et al. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale. NeurIPS 2022. https://arxiv.org/abs/2208.07339
- Frantar et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers. ICLR 2023. https://arxiv.org/abs/2210.17323
- Lin et al. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration. MLSys 2024. https://arxiv.org/abs/2306.00978
- Xiao et al. SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models. ICML 2023. https://arxiv.org/abs/2211.10438