跳到主要内容

量化简介

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 扩大让其他维度精度损失
GGUFllama.cpp 的量化文件格式,支持 Q4_K_M / Q5_K_M / Q8_0 等多档
W4A16INT4 weight + FP16 activation,主流推理量化配置
W8A8INT8 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 e4m343±448前向推理 (权重 + 激活)
FP8 e5m252±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 分支)显存省
GPTQINT4 OPT-175B +0.03 PPL3-4.5×INT4 主流
AWQINT4 比 GPTQ +3% MMLU3×+INT4 高精度
SmoothQuantW8A8 无损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 损失速度
FP16140 GB0baseline
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 e4m3H100 原生,±448,适合推理权重 + 激活
FP8 e5m2±57,344,训练梯度
INT4 W4A1670B 模型 140 GB → 35 GB,必须用 GPTQ/AWQ
LLM.int8()outlier 双流,无损但无加速
GPTQHessian 信息 + 列序量化,OPT-175B INT4 PPL +0.03
AWQ1% salient channel 用 scale 保护,MMLU 比 GPTQ 高 3%
SmoothQuantactivation outlier 迁移到 weight, W8A8 无损
TRT-LLMLlama 70B FP8 H100: throughput +87%, MMLU -0.3%
llama.cpp Q4_K_M70B 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 输出的全部内部数据流与工程主线。

延伸阅读

参考资料

  1. Micikevicius et al. FP8 Formats for Deep Learning. NVIDIA/Arm/Intel, 2022. https://arxiv.org/abs/2209.05433
  2. Dettmers et al. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale. NeurIPS 2022. https://arxiv.org/abs/2208.07339
  3. Frantar et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers. ICLR 2023. https://arxiv.org/abs/2210.17323
  4. Lin et al. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration. MLSys 2024. https://arxiv.org/abs/2306.00978
  5. Xiao et al. SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models. ICML 2023. https://arxiv.org/abs/2211.10438