外观
模型量化基础
概念定义:用更少的位表示同样的信息
**量化(Quantization)**指把高精度浮点数(FP32/FP16/BF16)映射到低位定点数(INT8/INT4/FP8/FP4),推理时用低位计算,从而减少显存占用和带宽压力。它是 LLM 推理加速性价比最高的手段——没有之一。
理解量化的两个关键认知:
- 量化是"信息有损压缩"——从 16 bit 压到 4 bit 等于丢了 75% 的精度位,必然有精度损失;但模型权重分布通常集中在小范围(高斯分布),异常值少,所以"压得小但够用"是可行的;
- LLM 推理量化的核心价值是减带宽,不是减算力——decode 阶段 memory-bound,权重 INT4 比 FP16 少 4 倍字节,直接 4 倍加速;至于算力,Tensor Core INT8 比 FP16 还快。
量化的工程价值(典型数字):
| 量化方案 | 显存 | 速度 | 精度损失 | 详见 |
|---|---|---|---|---|
| FP16/BF16(基线) | 1× | 1× | 0 | — |
| W8A16(权重量化) | 2× | ~1.5× | <1% | 权重量化 |
| W4A16(权重量化) | 4× | ~3-4× | 1-3% | 权重量化 |
| W8A8(权重+激活量化) | 2× | ~2× | 1-5% | SmoothQuant |
| FP8(H100+) | 2× | ~2× | <1% | 本页 |
| FP4(B200+) | 4× | ~4× | 2-5% | 本页 |
一、线性量化:最基本的映射
公式
把 FP16 张量 x 量化到 INT8:
text
q = round(x / scale) + zero_point (量化)
x' = (q - zero_point) × scale (反量化)- scale:浮点缩放因子,决定"每个量化级代表多大的浮点区间";
- zero_point:定点数中"对应浮点 0"的那个值;
- q:量化后的整数,取值在 [0, 2^bit - 1] 范围。
对称 vs 非对称量化
| 类型 | zero_point | 公式 | 适用 |
|---|---|---|---|
| 对称量化 | =0(或中点) | q = round(x / scale),范围 [-127, 127] | 权重(分布通常关于 0 对称) |
| 非对称量化 | ≠0 | q = round(x / scale) + zp,范围 [0, 255] | 激活(常有偏移,如 ReLU 后非负) |
为什么权重用对称、激活用非对称
权重分布通常关于 0 对称(高斯),用对称量化省一个零点参数、且反量化时不用加 zp,计算更快。激活分布经常非对称(如 ReLU 后全正、Softmax 后范围 [0,1]),用非对称能更充分利用 INT8 的 256 个量化级。
精度损失的来源
- 量化误差:浮点值 round 到整数;
- 截断误差:超出 [-127, 127] 范围的值被 clip;
- 异常值(outliers):少数极大的权重把 scale 拉大,其他权重精度全被压缩;
- 激活分布漂移:在线推理时激活值范围比校准时大,scale 失效;
- 跨层累积误差:每层量化误差向后传播,深层网络放大。
二、量化粒度:scale 颗粒度
scale 是按多粗的颗粒度共享的?这是量化的核心旋钮:
| 粒度 | scale 数量 | 优势 | 劣势 |
|---|---|---|---|
| Per-tensor | 1 个 scale | 实现最简单,硬件友好 | 异常值放大误差,精度差 |
| Per-channel | 每行/列 1 个 | 精度好(精度敏感) | scale 参数多 |
| Per-group | 每 N 个连续值 1 个 | 精度最佳,INT4 标配 | 实现复杂、有 unpack 开销 |
| Per-token | 每个激活 token 1 个 | 适配激活分布变化 | 仅激活用 |
| Per-head | 每个 attention head 1 个 | 适配 head 间差异 | 多用于 KV cache 量化 |
INT4 权重量化几乎都用 per-group(group_size=128)——分组越细精度越好,但每多一个 scale 多 2 字节元数据开销。group_size=128 时元数据占比 2/128 = 1.5%,可以接受。
主流选择的工程权衡
- W8A16 权重:per-channel 即可(INT8 容差大);
- W4A16 权重:per-group=128(INT4 必须细分组才能保精度);
- W8A8 激活:per-token(激活分布随输入变化大,需要动态 scale);
- KV cache:per-token + per-head(长 context 精度敏感)。
三、PTQ vs QAT:要不要重训
训练后量化(Post-Training Quantization, PTQ)
训练完之后直接量化,不需要再训练。用校准数据(calibration set)跑一遍前向,统计各层激活分布,确定 scale。
- 优点:零训练成本,几小时搞定;
- 缺点:低比特(INT4)下精度损失可能很大;
- 主流算法:GPTQ、AWQ、SmoothQuant、ZeroQuant。
量化感知训练(Quantization-Aware Training, QAT)
训练时就模拟量化误差(forward 用量化后的伪权重,backward 用 STE 直通梯度),让模型学会"在量化下表现好"。
- 优点:低比特下精度更好(INT4 接近原精度);
- 缺点:要训练数据和算力,成本高;
- 主流算法:LLM-QAT、SmoothQuant-QAT。
LLM 时代 QAT 退场
传统 CV 时代 INT8 量化 QAT 是主流,但 LLM 体量大、训练贵、训练数据封闭——几乎所有 LLM 量化都是 PTQ。QAT 只在需要极致低比特(INT2、INT3)或极致精度时才考虑,且需要原始训练数据或大规模合成数据。
四、校准:找对 scale 的关键
PTQ 的核心步骤是校准(calibration)——用一组代表性输入跑前向,统计每层激活分布的 min/max 或更复杂的统计量,再决定 scale:
| 方法 | 原理 | 优势 | 劣势 |
|---|---|---|---|
| MinMax | 取激活绝对值 max | 简单 | 异常值放大误差 |
| Percentile | 取 99.9% 分位 | 抗异常值 | 超参需调 |
| MSE | 最小化量化前后 MSE | 通用 | 优化算法慢 |
| ACIQ | 假设高斯/拉普拉斯分布算最优阈值 | 解析解 | 假设可能不成立 |
| ZNWC | 零点+归一化加权聚类 | 适配多峰分布 | 实现复杂 |
校准数据要有代表性——线上典型 prompt 的样本集,500-2000 条通常够。校准集偏差(如纯英文校准中文模型)是 PTQ 精度翻车的主要原因之一。
五、主流算法族:LLM 量化的"四大金刚"
GPTQ(Generative Pre-trained Transformer Quantization)
- 思路:基于 Hessian 矩阵的二阶量化误差最小化;
- 关键贡献:按列顺序量化权重,每量化一列就用 Hessian 信息调整剩余列补偿误差;
- 优势:INT4 精度极佳(<1% loss);
- 工程实现:AutoGPTQ,vLLM 内置 GPTQ Marlin kernel;
- 详见 权重量化与混合精度。
AWQ(Activation-aware Weight Quantization)
- 思路:保护显著权重——观察激活幅度大的通道对应权重更重要,量化这些权重时保持高精度;
- 关键技巧:通过等价缩放(W' = W/s, x' = s·x)让显著权重 fall into 量化范围更友好区段;
- 优势:INT4 精度与 GPTQ 相当或更好,速度比 GPTQ 快(kernel 更高效);
- 工程实现:vLLM 的 AWQ kernel、TensorRT-LLM AWQ;
- 详见 权重量化与混合精度。
SmoothQuant
- 思路:解决激活异常值难题——LLM 激活有少数极端值,让 INT8 激活量化精度炸裂;
- 关键技巧:等价地把"激活的难度"转移到权重上(W' = W/s, x' = s·x 让激活变平滑、权重变陡,但权重本身好量化);
- 优势:让 W8A8 量化在 LLM 上首次达到可用精度;
- 用途:W8A8 模式(权重+激活都 INT8),适合 prefill 计算密集场景。
ZeroQuant 系列(DeepSpeed 出品)
- 思路:分层 PTQ + per-token 激活量化;
- ZeroQuant-Z:权重的零点对称量化;
- ZeroQuant-Infinity:扩展到 trillion 参数模型;
- 用途:DeepSpeed 生态集成,但社区生态不如 GPTQ/AWQ 广。
六、FP8 与 FP4:H100/B200 时代的新方向
FP8(H100/H200/H20 标配)
- 两种格式:E4M3(4 位指数+3 位尾数,精度高)和 E5M2(5 位指数+2 位尾数,动态范围大);
- Tensor Core 原生支持 → 推理速度接近 INT8 但精度远好于 INT8;
- 不需要校准(FP8 自带动态范围);
- NVIDIA Transformer Engine 已实现;
- 适合:H100+ 卡、追求精度无损场景。
FP4(Blackwell B200/B100 标配)
- 4 位浮点,搭配 microscaling(一组 16 个值共享一个 scale);
- 算力天花板 2.25 PFLOPS(FP4),是 FP16 的 ~4 倍;
- 仍需 PTQ 校准(microscaling 的 scale 选择);
- 适合:B200 + 极致吞吐场景。
为什么 FP8/FP4 是未来
- 浮点格式比整数格式精度更好——动态范围自带指数位,不需要 per-group scale;
- Tensor Core 原生加速——不需要 unpack(INT4 要 unpack 到 INT8 再算);
- 校准更轻量——基本只需选好格式和 microscaling 粒度;
- 局限:需要新一代硬件(H100 起 FP8、B200 起 FP4),A100 上跑不动。
七、量化精度损失:常见翻车现场
| 问题 | 现象 | 原因 | 对策 |
|---|---|---|---|
| 激活异常值 | INT8 激活量化精度崩 | LLM attention 输出有极端值 | 用 SmoothQuant 把难度转给权重 |
| 低比特权重 | INT4 精度差 | 异常权重主导 scale | 用 AWQ 保护显著权重 |
| KV cache 量化 | 长 context 精度退化 | KV 累积误差 | per-token per-head 量化 |
| 校准集偏移 | 线上效果差,离线好 | 校准数据分布与线上不符 | 用线上典型样本校准 |
| 混合精度层缺失 | 个别层精度崩 | 全局量化策略对敏感层不友好 | 关键层(softmax、final norm)保留 FP16 |
不要无脑 INT4 全量化
- W4A16(权重 INT4 + 激活 FP16):decode 阶段性价比最高,当前 LLM 量化首选;
- W4A4:算力极致但精度损失大,仅推荐 B200+;
- W8A8:精度好但 decode 阶段没省带宽(INT8 权重还是 2 倍压缩,但激活也压了不省访存);
- 混合精度:保留 attention softmax、final norm 等敏感层 FP16,其他层量化——几乎无损。
八、权衡与取舍
- PTQ vs QAT:99% LLM 场景用 PTQ(GPTQ/AWQ),QAT 留给极致低比特;
- INT8 vs FP8:H100+ 选 FP8(精度好、免校准);A100 选 INT8(AWQ/GPTQ);
- W4A16 vs W8A8:decode 密集(在线服务)选 W4A16;prefill 密集(离线)选 W8A8;
- 量化 vs 蒸馏:量化保留模型结构,便宜;蒸馏换模型大小,效果可以更极致但训练贵——通常先量化再考虑蒸馏;
- 量化 vs 剪枝:量化减字节,剪枝减参数数量——两者可叠加(稀疏 INT4 权重)。
延伸阅读
- 权重量化与混合精度——GPTQ/AWQ 的工程实现细节
- 算子融合与自定义核——Marlin kernel 把 W4A16 反量化+matmul 融合
- 显存层次与带宽墙——为什么减字节直接换速度
- 剪枝与稀疏化——另一种压缩方向
- 知识蒸馏——压缩的"训练侧"手段
- vLLM 案例研究——AWQ/GPTQ 在 vLLM 的工业实现
- TensorRT 案例研究——FP8/INT8 在 NVIDIA 栈的实现
- 核心论文清单——GPTQ、AWQ、SmoothQuant 原论文链接
参考资料
- Frantar et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers(ICLR 2023) —— GPTQ 原始论文
- Lin et al. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration(MLSys 2024) —— AWQ 原始论文
- Xiao et al. SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models(ICML 2023) —— SmoothQuant 原始论文
- Liu et al. ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers(NeurIPS 2022) —— ZeroQuant 原始论文
- NVIDIA Transformer Engine Documentation —— FP8/FP4 工程实现
- Jacob et al. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference(CVPR 2018) —— 经典 CV 量化(QAT)的奠基论文