跳转至

第七章 量化与稀疏化

导读

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:天然稀疏激活

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×;
  • 量化有质量成本,业务自建评测必跑。

练习题

  1. 7B 模型在 fp16 / INT8 / INT4 下各占多少显存?
  2. PTQ 与 QAT 的区别是什么?为什么 PTQ 更常用?
  3. AWQ 相对 GPTQ 的关键改进是什么?
  4. 为什么 per-group 量化比 per-tensor 误差更小?
  5. FP8 相对 INT8 的优势是什么?
  6. 解释 MoE 的"总参数大但激活小"特点,并说出至少一个代表模型。
  7. 2:4 结构化稀疏为什么需要训练时引入?
  8. 什么场景下不应该量化?

下一章:第八章 KV Cache与PagedAttention