执行摘要
- 一句话:在Intel XPU上启用Nemotron-3-Nano混合Mamba+MoE模型
- 推荐动作:此 PR 改动简洁,适合学习如何在 SGLang 中为 XPU 适配混合 Mamba+MoE 模型。重点关注跨平台算子绑定(
elif is_xpu())和激活函数白名单扩展的模式。
功能与动机
Before this PR the model crashes at load on XPU: the causal_conv1d import gate only binds on CUDA/NPU, and the MoE path rejects the relu2 activation Nemotron-H uses.
实现拆解
- Mamba因果卷积导入适配:在
python/sglang/srt/layers/attention/mamba/mamba.py 中导入 is_xpu,并在 is_npu() 分支后增加 elif is_xpu(): 分支,将 causal_conv1d_fn、causal_conv1d_fn_triton、causal_conv1d_update、causal_conv1d_update_triton 全部绑定至纯 Triton 实现,确保 XPU 无原生 kernel 时仍可正常运行。
- MoE 激活函数扩展:在
python/sglang/srt/layers/quantization/unquant.py 的 UnquantizedFusedMoEMethod.forward_xpu 方法中,将激活白名单从 ["silu","gelu"] 扩展为 ["silu","gelu","relu2"],使 sgl-kernel-xpu 的 fused_experts 可以处理 Nemotron-H 使用的平方 ReLU 激活。
- 测试文件本地化:将端到端测试
test_nvidia_nemotron_3_nano.py 加入 .gitignore,因为该模型需要 tp=4(3B 活跃参数,60GB 权重),无 4-GPU XPU CI runner,测试仅用于本地验证。
关键文件:
python/sglang/srt/layers/attention/mamba/mamba.py(模块 Mamba层;类别 source;类型 dependency-wiring): 核心修改:添加 elif is_xpu(): 分支,为 XPU 绑定纯 Triton 实现的 causal_conv1d,是解决模型崩溃的关键。
python/sglang/srt/layers/quantization/unquant.py(模块 MoE量化;类别 source;类型 core-logic;符号 forward_xpu): MoE 路径适配:在 forward_xpu 的激活白名单中增加 relu2,使 fused_experts 支持平方 ReLU。
.gitignore(模块 忽略规则;类别 other;类型 configuration): 将大模型测试文件 gitignore,避免因硬件不足导致 CI 失败或误提交。
关键符号:forward_xpu
关键源码片段
python/sglang/srt/layers/attention/mamba/mamba.py
核心修改:添加 elif is_xpu(): 分支,为 XPU 绑定纯 Triton 实现的 causal_conv1d,是解决模型崩溃的关键。
from sglang.srt.utils import (
is_cpu,
is_cuda,
is_npu,
is_xpu, # 新增导入用于 XPU 平台判断
set_weight_attrs,
)
if is_cuda():
from sglang.srt.layers.attention.mamba.causal_conv1d import (
causal_conv1d_fn,
causal_conv1d_update,
)
from sglang.srt.layers.attention.mamba.causal_conv1d_triton import (
causal_conv1d_fn as causal_conv1d_fn_triton,
causal_conv1d_update as causal_conv1d_update_triton,
)
elif is_npu():
from sgl_kernel_npu.mamba.causal_conv1d import (
causal_conv1d_fn_npu as causal_conv1d_fn,
causal_conv1d_update_npu as causal_conv1d_update,
)
elif is_xpu():
# XPU 尚无原生 causal_conv1d kernel,因此将纯 Triton 实现绑定到
# `causal_conv1d_fn` / `causal_conv1d_fn_triton` / `causal_conv1d_update`
# / `causal_conv1d_update_triton` 四个入口点,确保所有代码路径都可调用。
from sglang.srt.layers.attention.mamba.causal_conv1d_triton import (
causal_conv1d_fn as causal_conv1d_fn,
causal_conv1d_fn as causal_conv1d_fn_triton,
causal_conv1d_update as causal_conv1d_update,
causal_conv1d_update as causal_conv1d_update_triton,
)
python/sglang/srt/layers/quantization/unquant.py
MoE 路径适配:在 forward_xpu 的激活白名单中增加 relu2,使 fused_experts 支持平方 ReLU。
def forward_xpu(self, layer, dispatch_output):
# ... 前置计算 ...
moe_runner_config = self.moe_runner_config
assert moe_runner_config.activation in [
"silu",
"gelu",
"relu2", # Nemotron-H 使用平方 ReLU,此前不在白名单中导致崩溃
], f"activation = {moe_runner_config.activation} is not supported."
backend = self.runner.runner_backend
if use_intel_xpu_backend():
# sgl-kernel-xpu 路径:fused_experts 已支持 relu2
from sgl_kernel import fused_experts
# ... 调用 fused_experts ...
else:
# Triton 路径仅允许 silu;relu2 不会走到这里
assert backend.is_triton()
assert (
moe_runner_config.activation == "silu"
), f"activation = {moe_runner_config.activation} is not supported for Triton PATH, please set ENV SGLANG_USE_SGL_XPU=1."
评论区精华
核心讨论包括:
风险与影响
关联脉络
参与讨论