Prhub

#31107 [NPU] Determine the topk norm_type through scoring_func

原始 PR 作者 McZyWu 合并时间 2026-07-15 15:26 文件变更 2 提交数 13 评论 5 代码增减 +2 / -1

执行摘要

NPU MoE topk norm_type 根据 scoring_func 动态选择,修复精度

PR #29509 重构了 topk 逻辑,但将 NPU 端的 norm_type 固定为 1(sigmoid),这影响了使用 softmax 的模型(如 ds coder v2 lite instruct)的精度。需要根据每个模型的 scoring_func 正确设置 norm_type。

该 PR 为 pinpoint bugfix,改动虽小但修复了重要精度问题。建议相关开发者关注 NPU MoE topk 路径对 scoring_func 的依赖,并在新增模型时显式指定 scoring_func。值得阅读以了解 NPU topk 的配置方式。

讨论亮点

PR 的 review 讨论较少,主要来自 bot 和合并者。关键点:

  • sglang-npu-bot 请求 zRzRzRzRzRzRzR 确认模型的修改符合预期,指出目前已知的 GLM5.1、GLM5.2、Flash 等模型 scoring_func 均为 sigmoid。
  • CI 不稳定导致 glm 测试失败,后来通过 PR #31289 调整了测试阈值,最终合并。

实现拆解

  1. 修改 NPU topk kernel 的 norm_type 逻辑:在 python/sglang/srt/hardware_backend/npu/moe/topk.pyfused_topk_npu 函数中,将第 100 行的 norm_type=1 改为 norm_type=(0 if topk_config.scoring_func == "softmax" else 1)。这样,当 scoring_func 为 softmax 时 norm_type 为 0,否则为 1(sigmoid),与模型配置对齐。
  2. 在 GLM4 MoE Lite 模型中明确 scoring_func:在 python/sglang/srt/models/glm4_moe_lite.py__init__ 方法中,构造专家模块时传入 scoring_func="sigmoid"(原为硬编码缺失),确保该模型的 topk 行为与之前一致。
  3. 无测试/配置/部署配套变更:本次改动仅涉及两行源码,未新增测试,依赖已有 CI 验证精度。
文件 模块 状态 重要度
python/sglang/srt/hardware_backend/npu/moe/topk.py NPU 内核 modified 5.46
python/sglang/srt/models/glm4_moe_lite.py 模型定义 modified 4.79

关键符号

fused_topk_npu __init__

关键源码片段

python/sglang/srt/models/glm4_moe_lite.py data-contract

模型配置修复:在构造专家模块时显式传入 scoring_func='sigmoid',确保该模型(默认使用 sigmoid)行为不变。

# python/sglang/srt/models/glm4_moe_lite.py ( 行 228)
self.experts = get_moe_impl_class(quant_config)(
    ...
    routed_scaling_factor=self.routed_scaling_factor,
    prefix=add_prefix("experts", prefix),
    **({"scoring_func": "sigmoid"}), # 显式指定 scoring_func 为 sigmoid
)

评论区精华

GLM 模型 scoring_func 确认 question

sglang-npu-bot 请求 zRzRzRzRzRzRzR 确认 GLM5.1/5.2/Flash 模型的 scoring_func 是否为 sigmoid,因为 PR 中对这些模型的修改可能影响精度。

结论:确认这些模型 scoring_func 均为 sigmoid,因此只需在 GLM4 MoE Lite 中显式传入 sigmoid 即可。 · 已解决

CI 测试稳定性 测试

GLM 测试用例不稳定导致 CI 失败,已通过 PR #31289 调整测试阈值。

结论:CI 已通过并合并。 · 已解决

风险与影响

  1. 回归风险:修改仅影响 NPU 后端 MoE topk 路径,且只改变 norm_type 的赋值方式,逻辑清晰,回归风险低。但若未来新增其他 scoring_func 类型(如 relu),需要同步扩展此判断逻辑。
  2. 模型精度风险:对于未在 PR 中明确指定 scoring_func 的模型,其默认行为取决于 TopKConfig 的初始化值。当前修改保证了 scoring_func 为 softmax 时正确使用 0,否则使用 1,与原有硬编码 1(sigmoid)的兼容性需额外验证。已在 GLM4 MoE Lite 中显式传入 sigmoid,但其他 sigmoid 模型(如 GLM5.x)未显式传入,依赖默认配置,建议追踪确认。
  3. 性能风险:无,仅改变一个参数值。
  • 用户影响:修复了 NPU 上 ds coder v2 lite instruct 的精度问题(准确率提升至 81%)。所有使用 NPU MoE 且 scoring_func 为 softmax 的模型都将受益。
  • 系统影响:无。
  • 团队影响:维护者需确保未来添加新模型时正确设置 scoring_func,避免回归。
缺少测试覆盖 隐式依赖默认 scoring_func

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论