跳转到主要内容

GLM-5.2 量化执行图:W4A8、BMM 与 KV8

以 GLM-5.2 Prefill 的真实 kernel 路径解释 W4A8、E2M1/E4M3、低精度 BMM、BF16 Attention 与 FP8 KV Cache

· 约 3 分钟阅读

核心结论

同一个模型会按算子采用不同精度。描述一个算子的完整坐标系是:

Poperator=(W,A,Acc,Out,State)\mathcal{P}_{\text{operator}} = \left(W, A, \mathrm{Acc}, \mathrm{Out}, \mathrm{State}\right)

W4A8 表示一次 GEMM 使用 FP4 权重和 FP8 激活。Attention 没有常驻权重 W,KV Cache 属于状态 State,因此它们分别使用自己的精度描述。

GLM-5.2 同一层中的 W4A8、低精度 BMM、BF16 Attention 与 KV8 精度路径

主图先给出静态精度路径;需要逐节点查看 W / A / Acc / Out / State 时,可打开完整交互图

E2M1 与 E4M3

浮点数可以写成:

x=(1)s×m×2ex = (-1)^s \times m \times 2^e

其中 ss 是符号位,mm 是尾数,ee 是指数。

格式位宽组成作用
FP4 E2M11 位符号 + 2 位指数 + 1 位尾数表示 FP4 权重或低精度 BMM operand
FP8 E4M31 位符号 + 4 位指数 + 3 位尾数表示动态量化后的激活或 FP8 KV Cache
BF161 位符号 + 8 位指数 + 7 位尾数连接层间张量和 BF16 Attention

E2M1 的数值较粗,NVFP4 使用 block scale 表达每组数据的整体数值范围。可以把 E2M1 看作组内相对值,把 scale 看作整组的缩放倍率。

GEMM 与 BMM

GEMM 完成一组矩阵乘法:

AM×KWK×NYM×NA_{M \times K} W_{K \times N} \longrightarrow Y_{M \times N}

GLM-5.2 的一条实际执行路径是:

BF16 hidden
  → 动态量化为 FP8 E4M3
  → FP8 activation × FP4 E2M1 weight
  → FP32 accumulate
  → BF16 output

这条路径对应 W4A8

BMM 同时执行一批矩阵乘法:

XM×K(b)YK×N(b)ZM×N(b),b=1,2,,BX^{(b)}_{M \times K} Y^{(b)}_{K \times N} \longrightarrow Z^{(b)}_{M \times N}, \qquad b = 1, 2, \ldots, B

BMM 两侧经常都是运行时张量,因此直接写两个 operand 的精度更清晰。当前 trace 中可见 FP4 × FP4BF16 × FP4 路径。

GLM-5.2 的算子级精度

模块运行时精度主要目标
Linear / 部分 MoE GEMMW=FP4,A=FP8,Acc=FP32,Out=BF16降低权重容量与带宽,使用低精度 Tensor Core
部分 DSA / MLA BMMFP4×FP4 或 BF16×FP4按 BMM 的 operand 和 shape 选择 kernel
Sparse AttentionQ/K/V=BF16,Out=BF16支撑点积、归约和 Softmax 的数值范围
KV CacheState=FP8,读取后转换为 BF16降低长上下文 Cache 容量和读取流量

KVGatherUpconvert 连接 KV Cache 与 Attention:它从 FP8 Cache 聚合 K/V,并输出 BF16 K/V。该过程没有权重输入,属于状态读取和精度转换。

量化配方如何落到 Kernel

  1. 模型结构定义 Linear、BMM、Attention、KV Cache 和基础 BF16 接口。
  2. 量化配方定义各算子的权重、激活、scale 粒度、累加、输出和 Cache 精度。
  3. 推理引擎根据算子语义、shape 和设备能力选择实现路径。
  4. 运行时 Kernel给出最终执行证据;仿真按照实际 operand dtype 和转换边界建立成本模型。

相关页面

修改历史3 次提交