Skip to content

模型量化基础

本页速览 量化是把 FP16/BF16 权重和激活压到 INT8/INT4/FP8/FP4 的核心技术——以少量精度损失换 2-8 倍推理速度与显存压缩。本文讲透线性量化公式、量化粒度、PTQ vs QAT、校准方法、GPTQ/AWQ/SmoothQuant/FP8/FP4 主流算法族。

模型量化基础

概念定义:用更少的位表示同样的信息

**量化(Quantization)**指把高精度浮点数(FP32/FP16/BF16)映射到低位定点数(INT8/INT4/FP8/FP4),推理时用低位计算,从而减少显存占用和带宽压力。它是 LLM 推理加速性价比最高的手段——没有之一。

理解量化的两个关键认知:

  1. 量化是"信息有损压缩"——从 16 bit 压到 4 bit 等于丢了 75% 的精度位,必然有精度损失;但模型权重分布通常集中在小范围(高斯分布),异常值少,所以"压得小但够用"是可行的;
  2. LLM 推理量化的核心价值是减带宽,不是减算力——decode 阶段 memory-bound,权重 INT4 比 FP16 少 4 倍字节,直接 4 倍加速;至于算力,Tensor Core INT8 比 FP16 还快。

量化的工程价值(典型数字):

量化方案显存速度精度损失详见
FP16/BF16(基线)0
W8A16(权重量化)~1.5×<1%权重量化
W4A16(权重量化)~3-4×1-3%权重量化
W8A8(权重+激活量化)~2×1-5%SmoothQuant
FP8(H100+)~2×<1%本页
FP4(B200+)~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 对称)
非对称量化≠0q = round(x / scale) + zp,范围 [0, 255]激活(常有偏移,如 ReLU 后非负)

为什么权重用对称、激活用非对称

权重分布通常关于 0 对称(高斯),用对称量化省一个零点参数、且反量化时不用加 zp,计算更快。激活分布经常非对称(如 ReLU 后全正、Softmax 后范围 [0,1]),用非对称能更充分利用 INT8 的 256 个量化级。

精度损失的来源

  1. 量化误差:浮点值 round 到整数;
  2. 截断误差:超出 [-127, 127] 范围的值被 clip;
  3. 异常值(outliers):少数极大的权重把 scale 拉大,其他权重精度全被压缩;
  4. 激活分布漂移:在线推理时激活值范围比校准时大,scale 失效;
  5. 跨层累积误差:每层量化误差向后传播,深层网络放大。

二、量化粒度:scale 颗粒度

scale 是按多粗的颗粒度共享的?这是量化的核心旋钮:

粒度scale 数量优势劣势
Per-tensor1 个 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 权重)。

延伸阅读

参考资料