量化:从 Scale 到 W4A8 的完整坐标
从第一性原理解释量化对象、数值格式、Scale 粒度、PTQ/QAT、运行时 Kernel 与性能验收边界
核心结论
量化是模型压缩与低精度执行技术,但它不是 zip 式无损压缩。它用更小的数值集合近似原始权重、激活或 KV Cache,并用 Scale 等元数据恢复数值范围。
只说“这是一个 FP4 模型”还不够。一个可复现的量化方案至少要写清六个坐标:
最常见的误解是把 W4A8 当成整个模型的完整描述。它只说明某次矩阵乘的权重是 4 bit、激活是 8 bit;没有说明使用 INT 还是 FP、Scale 粒度、累加精度、KV Cache 精度、具体 Kernel,以及质量和速度是否通过验收。
CPU 工程师入口:可以把量化先理解为“Scale/舍入 → packing/layout → VNNI/AMX 或 Tensor Core → 宽精度累加 → profiler 验证”。完整对应关系见从 AVX/AMX 到 Tensor Core。
1. 量化在近似什么
1.1 权重、激活和状态
| 对象 | 生命周期 | 常见写法 | 主要收益 | 主要风险 |
|---|---|---|---|---|
权重 W | Checkpoint 加载后长期驻留 | W4A16、W8A16 | 降低模型容量和权重读取流量 | 权重重构误差、Kernel fallback |
激活 A | 每次 Forward 动态产生 | W8A8、W4A8 | 降低矩阵乘输入流量并使用低精度计算单元 | Outlier、动态 Scale 成本 |
KV Cache State | 随序列长度持续增长 | KV8、FP8 KV | 降低长上下文容量和读取流量 | Scale 校准、敏感层和长上下文误差 |
| 累加与输出 | Kernel 内部或层间接口 | Acc=FP32、Out=BF16 | 稳定归约与层间连接 | 不能由 W/A 位宽自动推断 |
这三个对象可以独立选择精度。同一个模型里完全可能同时出现:
Linear: W=FP4, A=FP8, Acc=FP32, Out=BF16
Attention: Q/K/V=BF16, internal reduction higher precision
KV Cache: State=FP8, read and convert according to kernel contract
Norm/Router: BF16 or FP32-sensitive path
1.2 最基本的映射
以对称整数映射为例:
- 是原始高精度数值。
- 是量化后的有限离散值。
- 是 Scale,负责把有限编码映射到原始数值范围。
- 是反量化后的近似值。
非对称整数方案还会加入 zero-point。浮点量化的编码方式不同,但同样需要回答“低精度值如何覆盖当前数据范围”。
2. 位宽不是完整格式
| 格式 | 值本身 | 常见用途 | 必须额外确认 |
|---|---|---|---|
| BF16 | 1 sign + 8 exponent + 7 mantissa | 层间激活、Attention、输出 | Kernel 是否在内部提升累加精度 |
| FP8 E4M3 | 1 sign + 4 exponent + 3 mantissa | 权重或激活、部分 KV Cache | Current/Delayed/Block scaling、Scale dtype |
| FP8 E5M2 | 1 sign + 5 exponent + 2 mantissa | 更大动态范围的训练张量 | 推理引擎和硬件是否支持目标路径 |
| INT8 | 有符号整数 | W8A8、部分 CPU/GPU 路径 | 对称/非对称、per-tensor/per-channel |
| INT4 | 4 bit 整数 | GPTQ/AWQ 等 weight-only | group size、zero-point、packing、Kernel |
| FP4 E2M1 | 1 sign + 2 exponent + 1 mantissa | Blackwell NVFP4 等路径 | block/global Scale、动态量化与设备能力 |
INT4、FP4 只定义值域;GPTQ、AWQ、NVFP4 定义的是不同层次的算法或量化方案;Marlin 等名称则更接近运行时 Kernel。不要把这些层级放进同一列直接比较。
3. Scale 粒度与 Outlier
Scale 粒度回答的是:多少个值共用同一把尺子?
| 粒度 | Scale 数量 | 直觉 | 常见位置 |
|---|---|---|---|
| Per-tensor | 最少 | 一个 outlier 可能拉大整个张量的量化区间 | 简单 INT8/FP8 配方 |
| Per-channel | 按通道 | 每个输出通道独立适配范围 | 权重量化 |
| Per-token | 按 token | 动态适配当前激活 | Activation quantization |
| Per-group / block | 按固定小块 | 更贴近局部分布,但增加元数据和 layout 约束 | INT4、MXFP8、NVFP4 |
更细的粒度通常能降低局部量化误差,但不是越细越好。真实成本还包括:
其中 是参数量, 是低精度值的位宽。70B × 4 bit = 35 GB 只是裸权重下限,不是可运行实例的显存需求;运行时还需要 Scale、未量化层、KV Cache、activation、workspace 和通信缓冲。
Outlier 是激活量化尤其困难的原因。不同方法选择不同控制点:
- AWQ 根据激活统计识别重要权重通道,通过等价缩放降低 weight-only 误差。
- SmoothQuant 把激活量化难度离线迁移到权重,使 W8A8 更容易执行。
- Rotation 类方法通过等价旋转重新分布 outlier。
- 工程上还可以保留敏感层或特定 Attention 层为高精度。
4. 为什么量化可能加速,也可能不加速
4.1 三条独立收益路径
- 容量:权重或 KV 变小,模型能放入更少 GPU,或容纳更大 Batch/Context。
- 带宽:每步从 HBM 读取的权重和 KV 字节减少。
- 计算:硬件和 Kernel 支持时,低精度矩阵乘拥有更高峰值吞吐。
这三条路径不能合并成一个固定倍数。
4.2 Prefill 与 Decode 的差异
| 阶段 | 常见主瓶颈 | 更可能受益的方案 | 为什么不能预设倍数 |
|---|---|---|---|
| Prefill | 大矩阵计算、Attention IO | W8A8、FP8、W4A8 等低精度计算路径 | 取决于 Tensor Core、shape、fusion 和 Q/DQ 成本 |
| 小 Batch Decode | 权重与 KV 的 HBM 读取 | W4A16、W4A8、KV8 | Kernel 解包、Scale、访存效率和未量化算子会吃掉理论收益 |
| 大 Batch Decode | 逐步向 compute-bound 移动 | 低精度计算 + 调度 | Batch 改变 Roofline 位置,不能套用单请求结论 |
| 长上下文 | KV 容量与 Attention 读取 | KV8、GQA/MLA 等 | 质量对 Scale、层类型和上下文长度敏感 |
因此应把理论上限写成假设:
裸权重字节减少 4×
≠ 实例显存减少 4×
≠ TPOT 改善 4×
≠ 端到端吞吐改善 4×
只有在同一硬件、引擎版本、模型、并行配置、ISL/OSL、Batch 和 SLO 下实测,才能给出性能倍数。
5. PTQ、QAT 与动态量化
| 时机 | 做什么 | 优点 | 代价 |
|---|---|---|---|
| PTQ | 训练完成后,用权重和少量校准数据生成量化参数 | 成本低、适合已有模型 | 极低位或激活量化可能出现质量损失 |
| QAT | 训练或微调时模拟量化误差 | 模型可以适应低精度噪声 | 需要训练数据、算力和稳定训练配方 |
| Dynamic / online | 运行时根据当前激活计算 Scale | 能适应 token/block 的局部分布 | 引入 amax、Scale 计算、cast 和额外 Kernel |
典型方法的定位:
| 方法或方案 | 主要对象 | 典型精度 | 核心控制点 |
|---|---|---|---|
| GPTQ | Weight-only PTQ | W4A16 / W3A16 | 近似二阶信息与逐列误差补偿 |
| AWQ | Weight-only PTQ | W4A16 | 激活感知的重要通道保护 |
| SmoothQuant | Weight + activation PTQ | W8A8 | 把 activation outlier 难度迁移到权重 |
| FP8 recipe | Weight/activation | W8A8 | E4M3/E5M2、Scale 时机与粒度 |
| NVFP4 recipe | Weight/activation | FP4/FP8 mixed | E2M1、16-element block Scale 与全局 Scale |
没有稳定的 AWQ > GPTQ > 其他方法 总排序。结果会随模型、任务、位宽、group size、校准集、Kernel 和硬件变化。更完整的方法与实验设计见量化方法与评测。
6. 部署时真正要核对什么
配置合同
Model identity:
checkpoint + revision + model config
Quantization recipe:
object + format + granularity + calibration + excluded layers
Runtime identity:
engine version + kernel backend + hardware + TP/PP/EP
Workload identity:
ISL/OSL + batch/concurrency + KV hit + SLO
验收顺序
- 配置回读确认加载了预期 recipe。
- 引擎日志和 trace 确认 operand dtype、Q/DQ 边界与 Kernel,没有静默 fallback。
- 与高精度基线做质量验收。
- 分别核对权重、Scale、KV、activation 和 workspace 的容量账本。
- 再比较 TTFT、TPOT、TPS/TPM 与成本。
7. 关键认知
- 量化是一组近似和执行合同,不是单一 dtype。
W4A8只描述某次矩阵乘的两个 operand 位宽。- Scale 粒度、Scale dtype 与 outlier 处理共同决定误差。
- Checkpoint 更小不等于运行时一定使用低精度 Kernel。
- 理论字节下降不等于实测延迟或吞吐同比例改善。
- 质量、容量和性能是三个独立结果,必须分别验收。
相关页面
- CPU 工程师理解量化 — 从 INT8、AMX、Cache 和 perf/IBS 迁移到 Tensor Core、HBM 与 GPU trace
- 量化方法与评测 — PTQ/QAT 方法族、质量门禁和可复现实验矩阵
- FP4/FP8 量化 — FP8 scaling、NVFP4 与运行时能力边界
- GLM-5.2 量化执行图 — 一个模型内部的 W4A8、BMM、Attention 与 KV8
- Compute-bound vs Memory-bound — 用 Roofline 判断量化打在哪个瓶颈上
- KV Cache — KV 容量、数据布局与长上下文影响
- 推理框架对比 2026 — Engine、Kernel 和硬件支持的动态边界
参考资料
- GPTQ — 基于近似二阶信息的 weight-only PTQ。
- AWQ — 激活感知的重要权重通道保护。
- SmoothQuant — 面向 W8A8 的 activation smoothing。
- vLLM Quantization — 当前量化方法和硬件兼容矩阵;兼容性会随版本变化。
- TensorRT Quantization Schemes — INT8、FP8、MXFP8、INT4 与 NVFP4 的格式和粒度合同。
← 被以下页面引用(13)
- 量化方法与评测:从 PTQ/QAT 到可复现实验ai-systems · synthesis
- FP4/FP8 量化:值域、Scale 与运行时合同ai-systems · synthesis
- LLM 推理系统全栈综合分析ai-systems · synthesis
- 从 AVX/AMX 到 Tensor Core:CPU 工程师理解 LLM 量化ai-systems · comparison
- 推理引擎架构:vLLM / TensorRT-LLM / SGLangai-systems · comparison
修改历史7 次提交
- docs(wiki): bridge CPU and GPU quantizationxiaocheng··
a04dd83 - docs(wiki): deepen quantization researchxiaocheng··
98221ea - feat(wiki): enforce lifecycle metadata and search aliasesxiaocheng··
1dad7ef - feat(wiki): connect core topics and add reading seriesxiaocheng··
9fc9884 - fix(wiki): clean all lint errors to enable strict CI (PR-3)xiaocheng··
9acd1f2 - docs(ai-systems): add comprehensive LLM inference documentationxiaocheng··
dfe9ab1