量化
从 scale 与舍入走到算法
核心解释
量化用有限的可表示值近似原来的张量。位宽决定可用多少种编码,格式决定这些编码表示什么数。先看均匀整数仿射量化:步长 决定格点间距,整数零点 决定哪个编码表示实数零。[1]
这里 是舍入规则,clip 把结果限制在整数范围内。选 scale 时,要在范围覆盖与格点间距之间取舍。Min-max 覆盖观测范围,裁剪方法允许损失部分尾部值,换取更细的步长。按通道、token 或 group 共享参数,会改变这个取舍。[2]
舍入也需要精确定义。最近值舍入要处理恰好位于中点的情况,ONNX 的整数量化使用 nearest-even。随机舍入按距离分配概率。AdaRound 则根据层输出误差学习舍入方向。三者解决的问题不同。[3] [4]
量化算法关心误差怎样进入模型。GPTQ 补偿逐步量化产生的误差,AWQ 搜索权重通道缩放,SmoothQuant 平衡激活与权重的范围。省略偏置,只量化权重时,可以用下面的层输出重建目标理解这些选择,其中 受所选量化表示约束。[5] [6]
训练还要处理不可导的舍入与持续变化的张量分布。QAT 在前向模拟量化,反向使用近似梯度。FP8、FP4 训练则需要选择实际数值格式、scale 粒度与更新时机。推理部署时,还要检查累加精度、重新量化和后端支持,才能把存储节省转化为运行收益。[7] [8] [9]
资料
PyTorch 图解:先看范围、粒度与校准 ↗
用分布图理解对称与非对称量化、per-tensor 与 per-channel。重点读原理部分,运行代码时再对照当前 TorchAO 接口。
整数推理论文:scale 怎样进入矩阵乘法 ↗
从仿射映射走到整数累加、bias 和输出重新量化。第 2 节把公式与实际计算串起来,第 3 节讨论训练时模拟量化。
ONNX:舍入、饱和与 zero-point 的精确定义 ↗
核对 QuantizeLinear 24 的运算顺序、nearest-even、整数上下界,以及 scale 的形状与计算精度。适合排查跨框架的边界差异。
TorchAO 源码:直接追 scale 和 zero-point ↗
从 MappingType、choose_qparams_affine 与 quantize_affine 读起。重点看对称映射、避免截断的变体、零值保护,以及整数域和浮点域 zero-point 的差别。
AdaRound:为什么最近的量化值未必最好 ↗
从层输出误差推导向上或向下舍入的选择。第 3 节用连续松弛优化离散决定,适合接在普通 round-to-nearest 后读。
LSQ:让训练直接学习量化步长 ↗
重点读第 2 节的步长梯度与梯度缩放。理解 scale 怎样变成可学习参数,以及 straight-through estimator 在哪里起作用。
GPTQ:量化一部分,再补偿剩余权重 ↗
结合算法 1 与作者的 gptq.py 阅读。重点区分普通舍入、输入二阶信息、误差补偿,以及计算分块和量化 group size。
AWQ:用激活信息选择权重通道缩放 ↗
先看项目图解,再读论文第 3 节与 auto_scale.py。弄清重要通道如何识别,以及通道变换系数为什么不同于最终量化步长。
SmoothQuant:把激活的量化难度移到权重 ↗
从 README 图解进入论文与 smooth.py。沿输入特征维跟踪等价缩放,观察迁移强度如何同时改变激活和权重的范围。
AutoRound:联合调整舍入与裁剪 ↗
先读仓库链接的 SignRound 论文方法部分,再看当前实现。它把舍入选择和裁剪参数放进块输出重建,而不是只换一个 round 函数。
GSQ:联合学习网格选择与 group scale ↗
沿第 3 节理解 Gumbel-Softmax 如何松弛离散选择,再与 AdaRound、GPTQ 对照阅读。这条较新的路线把量化值选择与缩放一起优化。
随机舍入:概率、偏差与小更新消失 ↗
第 2 节给出按距离计算概率的定义,后文解释误差积累与 stagnation。把单次误差、期望误差和训练结果分开理解。
Transformer Engine:从 amax 计算 FP8 scale ↗
先用图解走完 amax、缩放、类型转换,再沿文档进入 delayed scaling、MXFP8 与 NVFP4。关注 scale 的方向、更新时间和分块。
TensorRT:INT8、INT4、FP8 与 FP4 的落地规则 ↗
对照不同格式的转换公式、饱和范围、scale 类型和粒度。算法生成的量化表示还要匹配执行后端的约束。
QA
为什么有的实现除以 scale,有的却乘以 scale?
先看反量化公式。若 , 表示一个整数间隔对应的实数步长,量化时除以它。若代码保存 ,量化时就乘以 。
Transformer Engine 的 FP8 文档同时展示了这两个方向:反量化乘以 ,转换前乘以 。只对照变量名,容易把比例看反。
Min-max 的 scale 和 zero-point 到底怎么算?
对于保留精确零值的整数仿射量化,先令 、。整数范围是 。区间非退化时,用下面的公式计算步长与整数零点。
把零纳入范围,可以避免全正或全负输入得到范围外的零点。零点取整后,两端通常不能同时精确对齐。全零张量需要实现规定的正 scale 回退值,不能直接除以零。TorchAO 还会用 eps 限制最小 scale。
对称 INT8 的 scale 应该除以 127、128,还是 127.5?
先确定实际使用的整数集合。若使用 ,以 覆盖两侧。INT8 的完整集合是 ,它在零的两侧并不对称。
TorchAO 的 SYMMETRIC 映射按区间宽度的一半计算,此时分母为 127.5。SYMMETRIC_NO_CLIPPING_ERR 则分别检查正负端点后取较大步长。在 且正负极值都为 时,单用 会让正端点超出范围。
覆盖所有极值,为什么不一定误差最小?
一个很大的离群值会拉大步长,让大量小值落到同一个量化格点。收窄范围会损失尾部,却可能降低其余元素的舍入误差。Min-max、百分位、MSE 和基于直方图的校准,选择范围时优化的目标不同。
还要区分权重重建误差与层输出误差。输入分布会放大某些方向上的权重误差。GPTQ 使用输入二阶信息,OmniQuant 则学习裁剪与等价变换。
“四舍五入”能准确描述 round 吗?负数怎么办?
不能只写四舍五入。Round-to-nearest 还要指定中点规则。Nearest-even 把恰好位于中间的值舍入到偶数:、、,负数对应为 、、。
向零截断、向下取整和中点远离零是不同规则。例如 向零得到 ,向下得到 。ONNX 的整数 QuantizeLinear 24 规定 nearest-even,复现时应明确写出该规则。
AWQ 和 SmoothQuant 中的 scale,都是量化步长吗?
它们的通道变换系数先改变浮点张量的分布。令 为输入特征维上的正对角矩阵,省略偏置时,有下面的等价关系。随后,量化器再为变换后的张量计算自己的 scale。
SmoothQuant 用激活与权重的通道极值平衡 W8A8 的量化难度。AWQ 用激活统计搜索权重通道缩放,目标是改善低比特权重量化。AWQ 的“保护重要权重”通过缩放实现,并不要求把这部分权重继续保存为 FP16。
INT4、FP4 和 NF4 都是 4 bit,可以共用量化公式吗?
INT4 配合固定 scale,得到等间隔的整数仿射网格。FP4 E2M1 是浮点格式,可表示值的间距并不均匀,转换要选最近的可表示浮点值。NF4 使用为近似正态权重设计的非均匀码本。
同样的位宽不代表相同的取值集合、缩放方式或 kernel。QLoRA 中的 double quantization 还会压缩量化常数,不能把 NF4 当成普通 INT4 加一个相同的 scale。
Current scaling 和 delayed scaling 到底差在哪一步?
Current scaling 先求当前张量的 amax,再计算缩放并转换。Delayed scaling 用历史 amax 决定这次缩放,同时记录本次 amax 供以后使用。
这个选择影响数据读取次数,也影响分布突然变化时的溢出或分辨率损失。Delayed 的历史长度、取最大值还是最近值、是否留 margin,都属于数值配方。按 token 或 block 计算 scale,则是另一个关于共享粒度的选择。
校准数据只是在找最大值吗?权重与 KV cache 可以照搬吗?
校准可能用于统计范围,也可能用于估计层输入、优化舍入或最小化块输出误差。换数据会改变这些估计,所以应覆盖实际语言、任务和长度,并用独立样本检查效果。
权重是固定的,激活和 KV cache 随请求变化。KIVI 分别研究 key 与 value 的统计结构,采用不同的共享方向。不能仅因为权重量化表现好,就沿用同一粒度和参数处理所有缓存。
4 bit 为什么不是四倍省显存、四倍快?
权重还需要 scale、零点和布局信息。例如每 128 个 4-bit 权重共享一个 FP16 scale,不存零点且忽略对齐时,平均是 bit/weight。更小的 group 会增加这部分开销。
执行速度还取决于解包、反量化、累加精度和 kernel。Decode 与 prefill 的矩阵形状不同,收益也可能不同。评估时把精度、总显存、prefill 延迟和 decode 吞吐放在同一配置下测量。
同一组量化参数,在不同后端的边界值上能否逐位一致?
待解
准备固定 scale、零点和分组,覆盖正负中点、饱和边界、极小值,再对照 PyTorch、ONNX 与实际 GPU kernel。记录乘倒数与直接除法、scale 存储精度,以及融合计算带来的差异。