第七章 量化与稀疏化¶
导读¶
LLM 越大越准,但也越大越贵——70B 模型 fp16 要 140GB 显存,单卡装不下。量化(Quantization)通过降低数值精度来压缩显存与加速推理;稀疏化(Sparsification)通过让部分参数为 0 或激活稀疏来减少计算。本章解释主流方案与权衡。
7.1 为什么需要量化¶
| 模型 | fp16 显存 | INT8 显存 | INT4 显存 |
|---|---|---|---|
| 7B | 14 GB | 7 GB | 3.5 GB |
| 13B | 26 GB | 13 GB | 6.5 GB |
| 70B | 140 GB | 70 GB | 35 GB |
| 405B | 810 GB | 405 GB | 203 GB |
效果:
- 显存压缩 2-4× → 单卡能跑的模型变大;
- 算力提升 1.5-3× → INT8/INT4 的 tensor core 比 fp16 快;
- KV Cache 也压缩 → 长上下文更友好。
代价:精度损失。INT4 通常损失 1-3% benchmark,但实际使用体感可能更明显(特别是数学、代码)。
7.2 量化精度对比¶
| 精度 | 字节 | 范围 | 用途 |
|---|---|---|---|
| FP32 | 4 | ±10^38 | 训练主力(部分场景) |
| TF32 | 4(结构特殊) | 同 FP32 但精度低 | A100 训练中间 |
| FP16 | 2 | ±65504 | 训练 / 推理基线 |
| BF16 | 2 | 同 FP32 范围 | 现代训练主流 |
| FP8 (E4M3/E5M2) | 1 | 不同范围 | H100 训练 / 推理 |
| INT8 | 1 | [-128, 127] | 推理量化主流 |
| INT4 | 0.5 | [-8, 7] | 推理极致压缩 |
7.3 量化方法分类¶
量化时机¶
| 类型 | 说明 |
|---|---|
| PTQ(Post-Training Quantization) | 训练后量化,最常用 |
| QAT(Quantization-Aware Training) | 训练时模拟量化,质量好但成本高 |
量化粒度¶
| 粒度 | 说明 |
|---|---|
| per-tensor | 整张量一个 scale,最粗,误差大 |
| per-channel | 每个输出通道一个 scale |
| per-group | 每 N 个连续元素一组,INT4 主流(如 group=128) |
分组越细,误差越小但 metadata 占比上升。
7.4 主流 PTQ 方法¶
GPTQ¶
基于 Hessian 信息的逐层量化:
- 一层一层处理,每层在校准集上前向得到 Hessian;
- 用 Hessian 引导量化顺序,最小化输出误差;
- INT4 后质量好,4bit 量化早期主流。
AWQ(Activation-aware Weight Quantization)¶
洞察:不是所有权重都重要——激活幅度大的对应权重更敏感。
- 用校准集统计激活分布;
- 对"显著权重"用更高有效位(per-channel scaling);
- 保护关键权重,INT4 质量与速度兼顾;
- vLLM 等推理引擎默认支持。
GGUF(llama.cpp)¶
- 文件格式 + 量化方案统一;
- K-quants:Q4_K_M、Q5_K_M、Q8_0 等,混合精度;
- 消费级 CPU/GPU 友好,单机推理首选;
- Q4_K_M 是"质量与速度平衡"的最常用档。
SmoothQuant¶
针对激活的离群值问题:把激活的难度"转移"到权重,使两者都易量化。
FP8(H100 起)¶
- 不需复杂校准,直接 cast 即可;
- 质量接近 fp16;
- 是 H100+ 上的"无脑量化"——只要有 H100,应该默认开。
7.5 KV Cache 量化¶
KV Cache 是长上下文显存大头(第 8 章),也可量化:
- FP8 KV:质量几乎无损,2× 压缩;
- INT4 KV:4× 压缩,质量略降,长上下文场景常用;
- vLLM / SGLang 都支持。
7.6 量化实战表¶
| 场景 | 推荐方案 |
|---|---|
| H100 部署 70B | FP8(直接 cast) |
| A100 部署 70B | AWQ INT4 + GQA |
| 消费级 4090 部署 13B | AWQ INT4 或 GGUF Q4_K_M |
| 笔记本 CPU 部署 7B | llama.cpp Q4_K_M |
| 极致延迟(边缘设备) | INT4 + 算子融合 |
7.7 稀疏化¶
稀疏化 = 让部分参数或激活为 0,跳过计算。
结构化 vs 非结构化¶
| 类型 | 说明 | 硬件支持 |
|---|---|---|
| 非结构化 | 任意位置 0 | GPU 不友好,难加速 |
| 2:4 结构化 | 每 4 个连续元素恰好 2 个 0 | Ampere+ 原生支持 2× |
| 通道剪枝 | 整个通道置 0 | 通用,但质量损失大 |
NVIDIA 2:4 sparse 是硬件级支持:A100/H100 有专门单元,理论 2× 加速,质量损失小——但需要训练时引入稀疏约束,不是 PTQ 能达成的。
MoE:天然稀疏激活¶
Mixture of Experts(MoE) 是另一种稀疏化思路:
- 多个独立 FFN("专家");
- 一个 router 决定每个 token 走哪几个专家(Top-K);
- 总参数大但每 token 激活少——相对 dense 模型,同等算力下参数量翻几倍。
代表:
- Mixtral 8×7B:总 47B,激活 13B;
- DeepSeek-V3:256 个 expert,总 671B,激活 37B;
- 传闻 GPT-4 也是 MoE。
MoE 挑战:
- 显存仍要装全部 expert(总参数多);
- 负载均衡:避免热门 expert 过载;
- 通信:Expert Parallelism 跨 GPU 路由,工程复杂;
- 推理引擎支持:vLLM、SGLang、TensorRT-LLM 都已支持但配置复杂。
7.8 量化的真实成本¶
| 成本 | 说明 |
|---|---|
| 精度损失 | INT4 通常 1-3% benchmark,但长尾任务可能更明显 |
| 部署复杂度 | 需校准集、需匹配推理引擎支持 |
| 算子融合 | INT4 matmul 需要专门 kernel,否则反而更慢 |
| 硬件依赖 | INT4 主要 NVIDIA 卡友好;AMD/CPU 支持参差 |
| 调试难度 | 数值问题难定位(NaN / 精度突然崩溃) |
7.9 何时不要量化¶
- 训练 / 微调:量化是为推理设计的;训练仍用 bf16/fp32;
- 高质量要求:数学、代码任务 INT4 可能掉点;
- 小模型:1B 以下模型量化收益小,损失占比大;
- 不支持 INT4 kernel 的硬件:会变慢。
工程实战要点¶
- H100 优先 FP8:几乎无损、无需校准、推理引擎原生支持;
- A100 70B 推荐 AWQ INT4:质量与显存平衡;
- 消费级 GPU / CPU 用 llama.cpp:Q4_K_M 是社区共识;
- KV Cache 也量化:长上下文场景收益巨大;
- MoE 是另一条路:性价比高但工程复杂;
- 2:4 sparse 需要专门训练:PTQ 难达成;
- 不要盲信 benchmark:业务自建评测集必跑。
小结¶
- 量化把 fp16 压到 INT8/INT4,显存 2-4× 压缩、算力 1.5-3× 提升;
- PTQ 是主流,方法包括 GPTQ、AWQ、GGUF、FP8;
- AWQ INT4 是 A100 上 70B 的事实标准;
- FP8 在 H100 上"无脑"启用;
- KV Cache 量化对长上下文至关重要;
- MoE 是稀疏激活路线,性价比高但工程复杂;
- 2:4 结构化稀疏需要训练时引入,硬件原生 2×;
- 量化有质量成本,业务自建评测必跑。
练习题¶
- 7B 模型在 fp16 / INT8 / INT4 下各占多少显存?
- PTQ 与 QAT 的区别是什么?为什么 PTQ 更常用?
- AWQ 相对 GPTQ 的关键改进是什么?
- 为什么 per-group 量化比 per-tensor 误差更小?
- FP8 相对 INT8 的优势是什么?
- 解释 MoE 的"总参数大但激活小"特点,并说出至少一个代表模型。
- 2:4 结构化稀疏为什么需要训练时引入?
- 什么场景下不应该量化?