Prhub

#30458 [NPU] [BUGFIX] Fix input parameters of swiglu_oai operator

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

执行摘要

修复 NPU SwiGLU OAI 算子输入参数错误

PR body 明确指出:'Since pre-transposed storage is removed for layer.w13_weight, the swiglu_oai operator throws errors when fetching dimension information from layer.w13_weight.' 解决 NPU 运行时 MoE 激活函数层的崩溃问题。

该 PR 改动量小且方向正确,建议精读以了解 NPU 上 MoE 激活函数的调用链路。但由于缺少测试覆盖,建议后续补充针对 swiglu_oai_triton 的回归测试。

讨论亮点

无 reviewer 讨论记录。

实现拆解

  1. 修改导入语句:将 from sgl_kernel_npu.activation.swiglu_oai import swiglu_oai 改为 from sgl_kernel_npu.activation.swiglu_oai import swiglu_oai_triton
  2. 改变调用签名:原来传入 layer 对象让算子内部从 layer.w13_weight.shape 推导 gate_up 维度,现在改为直接传入: hidden_states, hidden_states.shape[-1], gemm1_alpha, gemm1_clamp_limit
  3. 消除对 weight 形状的依赖:由于 w13_weight 现在按非转置格式存储(在 grouped_matmul 中动态转置),其 shape[2] 是 hidden 维度而非 gate_up 维度,显式传参避免了这一歧义。
  4. 仅修改一个文件 python/sglang/srt/layers/quantization/unquant.py,正向传播路径未涉及测试文件变更。
文件 模块 状态 重要度
python/sglang/srt/layers/quantization/unquant.py 量化层 modified 6.12

关键符号

forward_npu

关键源码片段

python/sglang/srt/layers/quantization/unquant.py dependency-wiring

核心修复文件,修改了 swiglu_oai 激活函数的导入和调用方式,修复因 w13_weight 预转置存储移除导致的维度错误。

# python/sglang/srt/layers/quantization/unquant.py
# 在 forward_npu 函数中,activation == "npu_swiglu_oai" 分支
if self.moe_runner_config.activation == "npu_swiglu_oai":
    from sgl_kernel_npu.activation.swiglu_oai import swiglu_oai_triton
​
    # `hidden_states` 是 gmm1 输出,形状为 [num_tokens, 2 * inter]。
    # 原版本传入 layer 对象,由算子内部通过 `layer.w13_weight.shape[2]` 获取
    # gate_up 维度;但 w13_weight 现已改为非转置存储(在 grouped_matmul 中动态
    # 转置),shape[2] 是 hidden 维度而非 gate_up 维度,导致 view 失败。
    # 修复后改为从 activation 自身显式传入 gate_up 维:hidden_states.shape[-1]。
    hidden_states = swiglu_oai_triton(
        hidden_states,
        hidden_states.shape[-1],
        self.moe_runner_config.gemm1_alpha,
        self.moe_runner_config.gemm1_clamp_limit,
    )

评论区精华

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

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

风险与影响

该 PR 仅修改了 swiglu_oai 分支的调用约定,且原 layer 参数在算子内部仅用来获取维度,显式传入 shape 后逻辑等价。但由于未添加对应的测试用例,若 swiglu_oai_triton 函数签名或行为与旧版本存在差异(如参数顺序、默认值),可能导致推理结果错误。

影响范围限于 NPU 平台上使用 npu_swiglu_oai 激活函数的 MoE 模型。修复前该分支会直接崩溃,修复后可正常运行。对其他激活函数分支(silu/gelu)无影响。

缺少测试覆盖 NPU 特定逻辑

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论