01. Quantization Objects, Representation, and Error | 量化对象、表示与误差
学习问题
本节回答两个问题:
- 量化到底在压什么,压的是权重、激活、训练状态,还是 KV Cache?
- 为什么量化的核心不是“位宽更小”,而是“误差能不能被系统接受”?
读完后应能写出一份量化问题定义:对象、表示、目标工作负载、误差来源、质量下限和证据等级,并据此选择后续验证路径。
核心机制
量化最容易被误解成“把 fp16 改成 int8”。但真正决定量化效果的,不只是位宽,而是三件事:
- 你压缩的是哪一类对象;
- 你用什么缩放因子 / 零点 / 粒度去表示它;
- 量化误差会不会落在系统最敏感的位置。
如果这三件事没分清,后面的 PTQ、QAT、GPTQ、AWQ、FP8 都会变成名词堆叠。
开始量化前,先确认:
- 当前要压的是权重、激活、梯度/优化器状态,还是 KV Cache。
- 你的目标是省显存、降带宽,还是配合硬件执行栈。
- 误差更敏感的是训练稳定性、任务质量,还是运行时容量和速度。
量化的核心矛盾是:低比特表示能显著降低存储和带宽成本,但也会引入表示误差。量化专题的主线,就是在“压缩率”和“误差可接受性”之间找平衡。
量化映射
对一个浮点值 x 做线性量化时,常见形式是:
text
q = clamp(round(x / scale) + zero_point, q_min, q_max)
x_hat = (q - zero_point) * scalescale 决定数值范围映射到多少个离散等级,zero_point 负责非对称范围的平移,clamp 处理超出范围的值。误差不只来自位宽,还来自校准样本、分组或通道粒度、异常值处理以及反量化发生的位置。量化公式只能解释数值偏差;训练稳定性、任务质量和运行速度还取决于对象生命周期、模型结构、执行路径与工作负载。
| 决策变量 | 改变什么 | 需要观察的结果 |
|---|---|---|
| 位宽 | 可表示等级数量和存储大小 | 量化误差、模型大小、加载显存 |
| 缩放因子 / 零点 | 浮点范围到整数范围的映射 | 饱和比例、均方误差、输出偏差 |
| 粒度 | 一组数值共享一套量化参数的范围 | 参数开销、误差分布、计算内核适配 |
| 校准数据 | 量化参数覆盖的输入分布 | 代表性变化时的质量稳定性 |
选择条件与验证证据
按“对象 → 粒度 → 敏感性 → 介入时机”判断路线,并为下一阶段保留对应证据。权重量化首先影响驻留大小和带宽;激活量化更容易遇到执行路径和数值稳定性问题;KV Cache 量化更偏推理容量,不应与权重量化混为一谈。
CPU 或纯 PyTorch 实验可以验证量化公式、舍入、截断、误差统计和不同粒度的差异;训练稳定性、推理执行路径和性能收益还需要分别在对应工作负载中验证。完成对象与误差定义后,进入 02 校准协议与 PTQ/QAT 分流,判断量化应发生在训练之后,还是需要把误差带回训练过程。
| 先观察什么 | 更可能进入的路线 | 下一步要留下的证据 |
|---|---|---|
| 权重驻留是显存主因 | W8A16、GPTQ / AWQ | 量化配置、校准数据版本、权重误差和产物清单 |
| PTQ 后任务质量不足,但仍有训练预算 | QLoRA、QAT 或量化微调 | 适配器 / 合并模型、验证集质量和训练配置 |
| 矩阵乘执行路径或带宽是主因 | 激活量化、FP8 | 缩放因子、数据类型、硬件能力和计算内核 / 执行后端证据 |
| 长上下文或高并发使缓存成为主因 | KV Cache 量化 | 缓存数据类型、上下文工作负载、显存和 TPOT |
