Prhub

#32616 [JIT] Restore the previous division behavior in per-token group quantization

原始 PR 作者 1e4ves 合并时间 2026-07-28 17:56 文件变更 1 提交数 2 评论 3 代码增减 +1 / -1

执行摘要

修复 per-token 量化除法精度问题

Issue #32582 报告 GLM-5.2 decode 性能从 30 token/s 降至 10 token/s。通过二分法定位到 commit 4f45d011(来自 PR #30924),该提交将 kMaxValue / amax 改为 kMaxValue * __frcp_rn(amax),引入 FP8 舍入差异。本 PR 恢复除法以修复回归。

该 PR 是典型回归修复,变更极小但影响显著。建议阅读 per_token_group_quant.cuh 中的 QuantTrait 结构体以理解量化缩放逻辑,以及关联的 #30924 和 #32582 理解完整背景。

讨论亮点

无 review 讨论。作者在 PR body 中说明动机和验证结果,获得 DarkSharpness 批准。

实现拆解

  1. 定位问题:在 python/sglang/kernels/jit/csrc/gemm/per_token_group_quant.cuh 第 308 行,PR #30924 将 kMaxValue / amax 替换为 kMaxValue * __frcp_rn(amax)
  2. 恢复除法:将第 308 行的乘法改回直接除法 kMaxValue / amax,恢复之前 v2 内核的 FP32 缩放行为。
  3. 测试验证:H20 上 8 项 FP32 量化 CUDA 测试通过,与 v2 内核位级比较无误差,DeepSeek-V3.2 MTP L3 接受长度从 2.462 恢复至 3.368。
文件 模块 状态 重要度
python/sglang/kernels/jit/csrc/gemm/per_token_group_quant.cuh JIT 内核 modified 3.29

关键源码片段

python/sglang/kernels/jit/csrc/gemm/per_token_group_quant.cuh core-logic

唯一修改的文件,恢复除法操作以修复 FP32 量化缩放精度回归。

// python/sglang/kernels/jit/csrc/gemm/per_token_group_quant.cuh
// QuantTrait 结构体内的 per-token-group 量化缩放计算
// 第 305-308 行:FP32 scale 分支
} else {
    // fp32 scale: multiply in fp32 (hmul2 brings too much precision loss)
    scale_inv = raw_scale;
    // 恢复直接除法以避免 __frcp_rn 引入的舍入差异
    // 参见 PR #32582 和 #32616
    const float quant_scale = kMaxValue / amax;
    const float2 quant_scale2 = {quant_scale, quant_scale};
    #pragma unroll
    for (uint32_t i = 0; i < kVecSize / 2; ++i) {
        ...
    }
}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险低:仅恢复单行除法,且经过位级比较和性能验证。但需确认其他模型(非 GLM-5.2)是否依赖倒数乘法的行为。作者提到“exact mechanism is still unclear”,在极端数值条件下可能存在未发现的舍入问题。

直接影响 Hopper GPU 上使用 per-token-group 量化的模型(如 GLM-5.2)的 decode 性能。预期回归到 PR #30924 之前的行为。不影响非量化路径或其他架构。

核心量化路径变更 已知回归已修复 缺少其他模型验证

关联 Issue

#32582 [Bug] Glm5.2 Decode's Perf decrease a lot

完整报告

参与讨论