Prhub

#45961 [Bugfix] Use native SiLU activation in CPU fused MoE

原始 PR 作者 aldenlobo 合并时间 2026-06-29 17:12 文件变更 1 提交数 3 评论 2 代码增减 +1 / -1

执行摘要

CPU MoE 启动崩溃修复

在 CPU 上启动 vLLM 0.22.0 时,某些 MoE 模型(如 Qwen3.5-35B-A3B)的初始化序列会因 AssertionError 崩溃。根本原因是 _CPU_MOE_ACT_FN 字典中 SiLU 路径使用 lambda x: SiluAndMul(compile_native=False).forward_native(x) 实例化了 CustomOp,而 CustomOp.__init__ 调用了 get_current_vllm_config(),但此时配置上下文尚未设置,导致断言失败。

建议合并。此修复对于 CPU 后端 MoE 模型运行至关重要,且改动极小、风险低。值得关注的设计决策:使用静态方法避免 CustomOp 实例化,是维护 get_current_vllm_config() 上下文约束的通用模式。

讨论亮点

无有效的 review 评论。PR 被 fadara01 和 bigPYJ1151 批准,无争议。

实现拆解

  1. 定位问题文件vllm/model_executor/layers/fused_moe/cpu_fused_moe.py 中的 _CPU_MOE_ACT_FN 字典。
  2. 分析原因MoEActivation.SILU 映射的 lambda 表达式会构造 SiluAndMul 对象(继承自 CustomOp),其 __init__ 方法调用了 get_current_vllm_config(),但预热阶段配置未就绪。
  3. 修复方案:将 MoEActivation.SILU 的值从 lambda x: SiluAndMul(compile_native=False).forward_native(x) 改为 SiluAndMul.forward_nativeforward_native@staticmethod,直接引用避免实例化。
  4. 验证改动:使用多个 MoE 模型(Qwen3.5-35B-A3B、ibm-granite/granite-4.0-h-tiny-base、mistralai/Mixtral-8x7B-v0.1)在 CPU 后端启动,确认预热阶段成功完成。
  5. 保持一致性:该模式与已有相邻激活函数(_swigluoai_forward_native_gelu_and_mul)的静态方法/独立函数方案一致。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/cpu_fused_moe.py 激活函数 modified 5.5

关键源码片段

vllm/model_executor/layers/fused_moe/cpu_fused_moe.py data-contract

唯一的变更文件,修复了 CPU fused MoE 的激活函数映射,避免启动时崩溃。

# vllm/model_executor/layers/fused_moe/cpu_fused_moe.py# 将 activation 名称映射到原生 forward 函数。
# 使用静态方法或独立函数来避免实例化 CustomOp 类,
# 因为 CustomOp 会调用 get_current_vllm_config() ,而该函数在配置未设置时会断言失败。
_CPU_MOE_ACT_FN: dict[MoEActivation, Callable[[torch.Tensor], torch.Tensor]] = {
    # 修复前:lambda x: SiluAndMul(compile_native=False).forward_native(x) # 会实例化 SiluAndMul
    # 修复后:直接引用静态方法,避免构造函数调用
    MoEActivation.SILU: SiluAndMul.forward_native,
    MoEActivation.SWIGLUOAI: _swigluoai_forward_native,
    MoEActivation.GELU: _gelu_and_mul,
    MoEActivation.GELU_TANH: (
        lambda x: F.gelu(x[..., : x.shape[-1] // 2], approximate="tanh")
        * x[..., x.shape[-1] // 2 :]
    ),
}

评论区精华

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

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

风险与影响

风险极低。变更仅涉及一行代码,将 lambda 替换为对静态方法的直接引用。语义上完全等价(SiluAndMul.forward_native 是纯 PyTorch 原生实现,不依赖任何配置状态),因此不会引入逻辑回归。唯一潜在风险是若 SiluAndMul 类被移除或 forward_native 签名变更,但此类为核心算子,概率极低。

影响范围:仅影响 CPU 后端 MoE 模型的启动阶段。修复后,所有使用 SiLU 激活的 MoE 模型在 CPU 上均能正常启动。用户可见:用户无需任何配置更改,启动崩溃问题消失。团队/系统:无,仅修复启动路径。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论