权重量化推理:从 FP16 到 INT8/INT4/FP8 的工程
说明:本篇为综述/无第一手实验数据,采用公开实践与量化文献路线。
实验目标
推理量化是"用显存和速度换精度"的生意:INT8 显存减半、INT4 减到 1/4,但量化损失从哪来、怎么控制、什么时候不值得——是推理工程的高频决策。本篇目标:拆解权重量化推理的完整框架——量化原理(PTQ/QAT)→ 校准数据与精度评估 → INT8/INT4/FP8 的选择矩阵 → 量化推理的显存/吞吐账本。读完能回答:我的模型该量化到几 bit、用什么方法、精度损失怎么验证。
代码逐段拆解
第一段:PTQ 校准与量化(以 INT8 为例)
python
# 训练后量化(PTQ):不需要重训,用校准数据定缩放因子
from transformers import AutoModelForCausalLM
import torch
model = AutoModelForCausalLM.from_pretrained("your-model")
# 校准:用少量代表数据(数百条)统计激活范围,确定每层缩放因子
calib_texts = load_calibration_set(n=512) # 代表训练分布,勿用测试集
# 实际接入量化库(GPTQ/AWQ 等),这里示意核心:
# 1) 逐层/逐张量统计 min/max 或百分位 → scale
# 2) 权重 round 到整数域:q = round(w / scale)
# 3) 反量化校验:重建误差 = ||w - q*scale|| 逐层检查要点:
- PTQ 是主流起点:不需要重训,用数百条校准数据确定量化参数;GPTQ/AWQ 等算法进一步用"误差最小化"(Hessian 加权)减少逐层损失。
- 校准数据必须代表训练分布:用测试集或偏差分布做校准,量化参数会偏——校准集质量直接决定量化精度。
- 逐层重建误差是快速体检:量化后逐层检查
||w - q*scale||,哪层误差大先定位(通常是少数敏感层,可保留高精度)。
第二段:INT4 与 FP8 的选择
python
# INT4(如 GPTQ/AWQ 4bit):显存减到 1/4,推理吞吐大幅提升
# 适用:大模型显存受限、长上下文、高并发(KV 显存占比上升时)
# FP8(E4M3):训练/推理同精度,量化损失小,但显存只减半
# 适用:新硬件(H100 等原生支持)、精度敏感场景
# 选择矩阵(经验):
# FP16 → 基线
# INT8 → 通用折中(损失小、收益明确)
# INT4 → 显存/并发优先(损失可接受时)
# FP8 → 新硬件 + 精度敏感要点:
- INT4 的收益在"并发"而不只是显存:显存减到 1/4 后,同卡能装更多请求/更长上下文(KV 显存占比问题,12 章 KV 篇衔接)——量化决策要与容量规划(12 章)联动。
- FP8 是精度与压缩的平衡点:原生支持的新硬件上损失小,但压缩率只有 2 倍(不如 INT4 的 4 倍)——精度敏感选 FP8,显存优先选 INT4。
- 量化后必须实测:perplexity/下游任务分数对比(量化 vs FP16),掉点超阈值(如 ppl +1)就不值得。
原理讲解
量化损失从哪来
| 来源 | 说明 | 缓解 |
|---|---|---|
| 舍入误差 | 权重取整的精度损失 | 更高 bit、误差最小化算法(GPTQ) |
| 激活范围 | 激活分布过宽,量化步长浪费 | 逐 token/逐通道量化、校准 |
| 敏感层 | 个别层对量化极敏感 | 敏感层保留高精度(混合量化) |
| 离群值 | 大值拉宽范围,小值精度丢失 | AWQ 按激活感知保护重要通道 |
核心认知:量化损失集中在"少数敏感层/敏感通道",所以"混合量化"(大部分层 INT4、敏感层 FP16)能以少量显存换大部分精度——别一刀切全量化,先定位敏感层。
训练后量化 vs 量化感知训练
| 方法 | 是否需要训练 | 精度 | 成本 |
|---|---|---|---|
| PTQ(GPTQ/AWQ) | 否 | 中-高(大模型可接受) | 低(小时级) |
| QAT(量化感知训练) | 是(微调/蒸馏) | 高 | 中-高 |
| 蒸馏到低精度小模型 | 是 | 高(但模型变小) | 高 |
工程判断:大模型(70B+)PTQ 通常够用(参数量大、冗余度高);小模型/精度敏感场景才考虑 QAT 或蒸馏。PTQ 先试,不够再上 QAT。
显存与吞吐账本(估算口径)
| 精度 | 权重显存(70B) | 相对吞吐 | 精度风险 |
|---|---|---|---|
| FP16 | ~140GB | 基线 | 无 |
| INT8 | ~70GB | 1.2-1.5× | 低 |
| INT4 | ~35GB | 1.5-2.5× | 中(可接受) |
| FP8 | ~70GB | 1.2-1.8× | 低 |
(注:实际收益受 KV 显存、batch 大小与硬件影响,须实测。)
实验结果
(估算口径,非实测)
| 方案 | 显存 | 吞吐 | ppl 变化(典型) |
|---|---|---|---|
| FP16 基线 | 100% | 1× | — |
| INT8 PTQ | ~50% | 1.2-1.5× | +0.1-0.3 |
| INT4 GPTQ | ~25% | 1.5-2.5× | +0.3-1.0 |
工程启示
- PTQ 先试:大模型 PTQ(GPTQ/AWQ)通常够用,小时级成本先验证;不够再 QAT/蒸馏。
- 校准集是精度的根:代表训练分布的校准集 + 逐层重建误差检查,量化质量一半在数据。
- 混合量化优于一刀切:先定位敏感层(重建误差/激活离群),敏感层留高精度——用少量显存换大部分精度。
- 量化决策与容量规划联动:INT4 的"同卡更多并发/更长上下文"要与 12 章容量公式一起算,别只看显存数字。
下一篇预告:推理侧量化讲完,回到网络基础——"InfiniBand 与 RoCE 选型:场景、成本与运维对比"。