Prhub

#36309 [AMD][Bugfix] Skip invalid fused MoE reduction for direct top-1 output

原始 PR 作者 bingxche 合并时间 2026-08-27 09:52 文件变更 1 提交数 1 评论 0 代码增减 +3 / -1

执行摘要

修复 ROCm top-1 MoE 无效归约

ROCm 7.2.4 上 stage-b-test-1-gpu-small-amd 的 TestFusedMOE.test_single_expert_routing 在 topk=1 和 routed_scaling_factor=1.0 时失败。PR body 指出:该路径下第二个 GEMM 直接写入 out_hidden_states,intermediate_cache3 未填充,但 HIP epilogue 仍将其归约到输出,用未初始化数据覆盖有效结果。CUDA 和 XPU 已在相同条件下跳过归约,本 PR 将守卫同步到 HIP。

该 PR 值得精读,但价值在于展示了跨平台守卫一致性的维护模式。对于关注 AMD 平台 MoE 正确性的工程师有参考意义。改动小、风险低,建议关注合并状态和后续是否有类似守卫遗漏。

讨论亮点

本 PR 无 review 评论或讨论。审核人 HaiShaw 直接批准(APPROVED),未提出异议。可能是由于改动逻辑简单、与 CUDA/XPU 已有实现完全一致,且 CI 已验证。

实现拆解

在 python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py 的 _fused_moe_kernel_sequence 函数中,调整 HIP 分支的控制流:

  1. 在 _is_hip 分支中,新增条件 topk == 1 and routed_scaling_factor == 1.0 and not _use_intermediate,满足时直接 pass,表示输出已直接写入 out_hidden_states。
  2. 原 _use_aiter 分支及其后的归约逻辑仅在条件不满足时执行。
  3. 该改动仅影响 HIP 平台,与 CUDA/XPU 已有逻辑保持一致,不改变其他路径。
    修改不涉及测试、配置或部署,现有 test_single_expert_routing 已覆盖该配置。
文件 模块 状态 重要度
python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py MoE 调度 modified 5.07

关键符号

_fused_moe_kernel_sequence

关键源码片段

python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py core-logic

修复 HIP epilogue 无效归约,新增直接输出守卫

# 位于 _fused_moe_kernel_sequence 中,处理 HIP 平台的输出归约逻辑
elif _is_hip:
    # 修复:topk=1 且 unit scaling 且无 intermediate 时,输出已直接写入 out_hidden_states,
    # 此时 intermediate_cache3 未填充,若继续归约会用未初始化数据覆盖有效结果。
    # 该守卫与 CUDA/XPU 分支保持一致。
    if topk == 1 and routed_scaling_factor == 1.0 and not _use_intermediate:
        pass # 输出已直接写入,无需归约
    elif _use_aiter:
        moe_sum(
            intermediate_cache3.view(*intermediate_cache3.shape),
            out_hidden_states,
        )
    else:
        # 根据 micro benchmark,小 token 时 torch.compile 性能更好
        if _use_moe_sum_reduce_torch_compile(num_tokens):
            moe_sum_reduce_torch_compile(
                intermediate_cache3.view(*intermediate_cache3.shape),
                out_hidden_states,
                routed_scaling_factor,
            )
        else:
            moe_sum_reduce_triton(
                intermediate_cache3.view(*intermediate_cache3.shape),
                out_hidden_states,
                routed_scaling_factor,
            )

评论区精华

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

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

风险与影响

本 PR 修改的是 fused MoE kernel 序列的关键路径,但条件与 CUDA/XPU 完全一致,风险较低。主要风险是条件判断与 CUDA/XPU 保持一致的假设是否完全正确,以及未来修改 fused_moe.py 时的维护风险。建议确认 HIP 平台的 _use_intermediate 判断与 CUDA/XPU 一致。

影响范围限于 ROCm(AMD GPU)平台上 fused MoE 在 topk=1、scaling=1、无 intermediate 时的输出。修复后该路径不再执行无效归约,避免未初始化数据覆盖,提升了正确性。修复不影响其他 topk 或 scaled 路径,也不影响性能敏感路径,因为跳过的是不必要的归约。

跨平台一致性风险 关键路径变更 缺少测试配套

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论