60 秒回答模板

我会先把它说成对权重张量做对称均匀量化。给定一组 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 计算路径。

考点 核心公式
难度 真实面经题
回答目标 让候选人能从公式、范围、误差、scale 粒度和计算路径完整解释 INT8 权重量化,而不是只背一个 absmax 结论。

深入解析

01

先定义量化映射

FP16 权重量化成 INT8+FP32 scale,本质是把连续或高精度的权重值映射到有限个整数格点。对称量化里通常令 q = round(w / scale),再把 q clamp 到 INT8 可表示的范围;推理或计算时再用 w_hat = scale * q 近似恢复原权重。这个 scale 是整数值和真实浮点权重之间的比例尺。

02

scale 的常见计算公式

如果选择 signed INT8 的有效幅度 qmax = 127,并希望不裁剪权重,则先统计 max_abs = max_i |w_i|,再取 scale = max_abs / qmax。这样最大绝对值权重会映射到约正负 127,其他权重按同一比例落到整数网格。实际实现中也会处理 max_abs 为 0 的特殊情况,避免 scale 为 0。

03

为什么用绝对值最大值

权重分布通常围绕 0 上下波动,对称量化希望正负两侧共享同一个 scale,并让 0 精确落在整数 0 上。absmax 给出了覆盖正负范围的对称边界:只要 |w| <= max_abs,量化前不会因为超出范围而被裁剪。它让公式简单、硬件路径友好,也避免为权重引入 zero point。

04

absmax 的代价是 outlier 敏感

absmax 定标保证不裁剪,但如果张量中有少数极大权重,scale 会被拉大,量化步长也变大。步长变大意味着大量普通权重被压到较粗的整数格点上,rounding error 变大。工程上会权衡是否接受少量 clipping,以换取主体分布更高的有效分辨率。

05

scale 粒度影响误差和开销

per-tensor scale 只给整个张量一个比例尺,元数据少、实现简单,但不同通道分布差异大时误差会增加。per-channel scale 通常按输出通道或矩阵某个维度分别统计 max_abs,可以显著降低权重量化误差,但需要存更多 scale,并在 GEMM epilogue 或反量化路径里处理不同通道比例。

06

回答要连到计算路径

权重量化不仅是存储格式转换。若是权重 only 量化,运行时可能把 INT8 权重按 scale 反量化后与 FP16 activation 计算;若 activation 也量化,则常见路径是 INT8 乘加、INT32 累加,再乘以 activation scale 和 weight scale 得到浮点结果。具体路径依赖框架和硬件,面试中应把这些作为通用工程原理,而不是声称某家公司内部一定这样实现。

易错点

  • 只说 scale 等于最大值,没有除以 INT8 的有效整数上限,导致映射范围讲错。
  • 把对称量化和非对称量化混在一起,在权重量化公式里无端加入 zero point,却不解释原因。
  • 认为按 absmax 定标一定最优,忽略 outlier 会拉大 scale、降低主体权重分辨率。
  • 只讲压缩存储,不讲反量化、INT32 累加或 GEMM epilogue 里 scale 如何参与计算。
  • 忽略 per-tensor 和 per-channel 的差异,把所有权重都默认只能共享一个 scale。
  • 声称来源公司使用了某种具体内部量化实现;source 只支持通用 INT8+FP32 scale 问题。

面试官追问

为什么公式里常用 127,而不是 128?

signed INT8 的取值通常是 -128 到 127,但对称量化为了让正负范围对称,常使用 -127 到 127 的有效范围,避免正负幅度不一致。也有实现会利用 -128,但要处理对应的映射细节。

如果 max_abs 是 0 怎么办?

说明这组权重全是 0,不能直接用 scale = 0。实现上通常给一个很小的 epsilon 或把量化结果全置 0,并在元数据里保证反量化不会除零。

per-channel scale 为什么常用于权重量化?

不同输出通道的权重幅度可能差异很大。每个通道单独定标可以让各通道都充分使用 INT8 动态范围,降低某个大通道拖累全部权重分辨率的问题。

absmax 和 percentile calibration 的取舍是什么?

absmax 基本不裁剪权重,但对 outlier 敏感;percentile 或 MSE calibration 可能裁掉少数极端值,让主体分布的量化步长更细。选择要看模型精度回归和部署路径。

FP32 scale 会不会抵消 INT8 的性能收益?

通常不会,因为 scale 是很小的元数据,权重主体从 FP16 变成 INT8 后存储和带宽明显降低。真正的额外成本在于反量化或 epilogue 缩放是否高效融合。