真实面经题目 · 原创解析
把 FP16 权重量化为 INT8 并保留 FP32 scale 时,scale factor 如何计算,为什么常用绝对值最大值定标?
这题考权重量化的基础闭环:从 FP16 到 signed INT8 的映射、scale 的计算、absmax 定标的原因、反量化误差,以及 per-tensor/per-channel 和 outlier 取舍。
真实面经题目 · 原创解析
这题考权重量化的基础闭环:从 FP16 到 signed INT8 的映射、scale 的计算、absmax 定标的原因、反量化误差,以及 per-tensor/per-channel 和 outlier 取舍。
我会先把它说成对权重张量做对称均匀量化。给定一组 FP16 权重 w,如果使用 signed INT8 表示,通常选一个最大整数幅度 qmax,例如 127,然后统计这组权重的 max_abs = max(|w|)。scale 可以取 scale = max_abs / qmax。量化时 q = clamp(round(w / scale), -qmax, qmax),反量化时用 w_hat = scale * q;scale 本身保留 FP32,是为了让反量化比例更精确,也方便后续和累加结果结合。按绝对值最大值定标的原因是对称量化希望用同一个 scale 覆盖正负两侧范围,并让 0 能精确表示;absmax 给出了不裁剪任何权重时所需的最小对称范围。不过它不是永远最优:如果有 outlier,absmax 会把 scale 拉大,导致大多数普通权重的量化间隔变粗。工程上要进一步说明 per-tensor 和 per-channel scale 的区别,权重量化常按输出通道做 scale 以降低误差;也可以用 percentile、MSE calibration 或 outlier 单独处理来在 clipping 和分辨率之间折中。面试里不要只背公式,还要说明精度损失来自 round、clip 和 scale 粒度,性能收益来自权重存储变小、带宽降低和可能使用 INT8 计算路径。
FP16 权重量化成 INT8+FP32 scale,本质是把连续或高精度的权重值映射到有限个整数格点。对称量化里通常令 q = round(w / scale),再把 q clamp 到 INT8 可表示的范围;推理或计算时再用 w_hat = scale * q 近似恢复原权重。这个 scale 是整数值和真实浮点权重之间的比例尺。
如果选择 signed INT8 的有效幅度 qmax = 127,并希望不裁剪权重,则先统计 max_abs = max_i |w_i|,再取 scale = max_abs / qmax。这样最大绝对值权重会映射到约正负 127,其他权重按同一比例落到整数网格。实际实现中也会处理 max_abs 为 0 的特殊情况,避免 scale 为 0。
权重分布通常围绕 0 上下波动,对称量化希望正负两侧共享同一个 scale,并让 0 精确落在整数 0 上。absmax 给出了覆盖正负范围的对称边界:只要 |w| <= max_abs,量化前不会因为超出范围而被裁剪。它让公式简单、硬件路径友好,也避免为权重引入 zero point。
absmax 定标保证不裁剪,但如果张量中有少数极大权重,scale 会被拉大,量化步长也变大。步长变大意味着大量普通权重被压到较粗的整数格点上,rounding error 变大。工程上会权衡是否接受少量 clipping,以换取主体分布更高的有效分辨率。
per-tensor scale 只给整个张量一个比例尺,元数据少、实现简单,但不同通道分布差异大时误差会增加。per-channel scale 通常按输出通道或矩阵某个维度分别统计 max_abs,可以显著降低权重量化误差,但需要存更多 scale,并在 GEMM epilogue 或反量化路径里处理不同通道比例。
权重量化不仅是存储格式转换。若是权重 only 量化,运行时可能把 INT8 权重按 scale 反量化后与 FP16 activation 计算;若 activation 也量化,则常见路径是 INT8 乘加、INT32 累加,再乘以 activation scale 和 weight scale 得到浮点结果。具体路径依赖框架和硬件,面试中应把这些作为通用工程原理,而不是声称某家公司内部一定这样实现。
signed INT8 的取值通常是 -128 到 127,但对称量化为了让正负范围对称,常使用 -127 到 127 的有效范围,避免正负幅度不一致。也有实现会利用 -128,但要处理对应的映射细节。
说明这组权重全是 0,不能直接用 scale = 0。实现上通常给一个很小的 epsilon 或把量化结果全置 0,并在元数据里保证反量化不会除零。
不同输出通道的权重幅度可能差异很大。每个通道单独定标可以让各通道都充分使用 INT8 动态范围,降低某个大通道拖累全部权重分辨率的问题。
absmax 基本不裁剪权重,但对 outlier 敏感;percentile 或 MSE calibration 可能裁掉少数极端值,让主体分布的量化步长更细。选择要看模型精度回归和部署路径。
通常不会,因为 scale 是很小的元数据,权重主体从 FP16 变成 INT8 后存储和带宽明显降低。真正的额外成本在于反量化或 epilogue 缩放是否高效融合。