Prhub

#24069 fix(moe): repair dead import in fused_moe_native after MoE refactor

原始 PR 作者 JustinTong0323 合并时间 2026-04-30 02:14 文件变更 2 提交数 2 评论 4 代码增减 +6 / -4

执行摘要

修复 fused_moe_native 死导入

fused_moe_native.py 中第 10 行仍从已删除的模块 sglang.srt.layers.moe.fused_moe_triton.fused_moe 导入 swiglu_with_alpha_and_limit,该符号在 #18084 中已重命名,模块在 #23019 中删除。这导致任何使用 torch.compile 且设置 gemm1_alpha 的 MoE 路径在服务器启动时抛出 ModuleNotFoundError

值得合并,修复了一个导致服务器启动崩溃的关键 bug。建议阅读 PR 中 fused_moe_native.py 的导入修复方式,可作为后续重构时避免死导入的参考。

讨论亮点

Reviewer kpham-sgl 在评论中确认新导入的 swiglu_gpt_oss_sigmoid_alpha 与旧函数行为相同("confirmed this is identical behaviour")。PR 无其他讨论,快速获得批准。

实现拆解

  1. 提升函数为公开:在 python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py 中将私有函数 _swiglu_gpt_oss_sigmoid_alpha 重命名为公开函数 swiglu_gpt_oss_sigmoid_alpha(去除下划线前缀)。该函数实现了 GPT-OSS 风格的 swiglu 激活(带 gemm1_alphagemm1_limit 参数)。
  2. 更新内部调用:在同一文件中的 _fused_moe_kernel_sequence 函数内,将调用点从 _swiglu_gpt_oss_sigmoid_alpha 更新为 swiglu_gpt_oss_sigmoid_alpha,确保 Triton 路径仍能正确引用该函数。
  3. 修复导入和调用:在 fused_moe_native.py 中,将原指向已删除模块的导入替换为从新位置 sglang.srt.layers.moe.moe_runner.triton_utils.fused_moe 导入 swiglu_gpt_oss_sigmoid_alpha,并在 moe_forward_native 函数中更新调用点。行为完全不变。
  4. 验证:本地测试 python -c "from sglang.srt.layers.moe.fused_moe_native import moe_forward_native" 成功,无 ModuleNotFoundError。CI 中涉及 test_torch_compile_moe.pytest_mla.py 的测试应通过。
文件 模块 状态 重要度
python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py MoE 层 modified 6.09
python/sglang/srt/layers/moe/fused_moe_native.py MoE 层 modified 5.35

关键符号

swiglu_gpt_oss_sigmoid_alpha moe_forward_native

关键源码片段

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

核心变更:将私有函数 `_swiglu_gpt_oss_sigmoid_alpha` 提升为公开函数 `swiglu_gpt_oss_sigmoid_alpha`,并更新内部调用点。

# python/sglang/srt/layers/moe/moe_runner/triton_utils/fused_moe.py
# 原私有函数 _swiglu_gpt_oss_sigmoid_alpha 被重命名为公开函数
@torch.compile
def swiglu_gpt_oss_sigmoid_alpha(x, gemm1_alpha, gemm1_limit):
    # NOTE: This variant uses gemm1_alpha, unlike _swiglu_silu_clamp_mul.
    # At present, only GPT-OSS uses this variant.
    gate, up = x[..., ::2], x[..., 1::2]
    gate = gate.clamp(min=None, max=gemm1_limit)
    up = up.clamp(min=-gemm1_limit, max=gemm1_limit)
    return gate * torch.sigmoid(gate * gemm1_alpha) * (up + 1)# 内部调用点同样更新为公开名称
if gemm1_alpha is not None:
    assert gemm1_limit is not None
    intermediate_cache2 = swiglu_gpt_oss_sigmoid_alpha(
        intermediate_cache1.view(-1, N), gemm1_alpha, gemm1_limit
    )
python/sglang/srt/layers/moe/fused_moe_native.py dependency-wiring

修复死导入:将指向已删除模块的导入替换为从新模块导入 `swiglu_gpt_oss_sigmoid_alpha`。

# python/sglang/srt/layers/moe/fused_moe_native.py
# 旧导入(已删除模块):
# from sglang.srt.layers.moe.fused_moe_triton.fused_moe import swiglu_with_alpha_and_limit
# 新导入:
from sglang.srt.layers.moe.moe_runner.triton_utils.fused_moe import (
    swiglu_gpt_oss_sigmoid_alpha,
)# 调用点更新
if (
    moe_runner_config.activation == "silu"
    and moe_runner_config.gemm1_alpha is not None
):
    assert moe_runner_config.gemm1_clamp_limit is not None
    gate_up = swiglu_gpt_oss_sigmoid_alpha(
        gate_up,
        moe_runner_config.gemm1_alpha,
        moe_runner_config.gemm1_clamp_limit,
    )

评论区精华

行为确认 正确性

Reviewer kpham-sgl 在评论中确认新函数与旧函数行为相同。

结论:行为一致,无需额外修改。 · 已解决

风险与影响

风险极低。仅修改了导入路径和函数名,逻辑完全不变,且 reviewer 已确认行为一致。潜在风险:如果其他模块仍通过旧路径或旧名称引用该函数,可能导致类似错误,但本次未发现其他引用。

影响范围有限,仅修复使用 torch.compile 且需 gemm1_alpha 的 MoE 路径(如 GPT-OSS 模型),以及使用 fused_moe_native 的场景。对不使用这些路径的用户无影响。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论