# PR #37481 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[XPU] enable is_act_and_mul for xpu
- 合并时间：2026-05-05 09:07
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/37481

---

# 执行摘要

- 一句话：为 XPU 平台启用 is_act_and_mul=False 及 RELU2_NO_MUL
- 推荐动作：值得精读，展示了 vLLM 中为硬件平台添加 MoE 功能支持的典型模式：通过扩展核心层的平台检查和更新后端模块的能力声明。对于从事多平台适配的开发者有参考价值。

# 功能与动机

PR 的目的是在 XPU 上测试 NVIDIA-Nemotron-3-Nano-30B-A3B-bf16 模型，需要启用 `relu2_no_mul` 内核路径。PR body 中说明了依赖 `vllm-xpu-kernels` 的 `relu2_no_mul` 内核（外部 PR #232），并通过 lm_eval 的 GSM8K 任务验证了准确率满足要求。

# 实现拆解

1. **扩展平台兼容性检查**：在 `vllm/model_executor/layers/fused_moe/layer.py` 中，将 `is_act_and_mul=False` 的支持条件从 `current_platform.is_cuda_alike()` 扩展为 `current_platform.is_cuda_alike() or current_platform.is_xpu()`，并更新错误提示信息包含 XPU。
2. **启用无乘法激活路径**：在 `vllm/model_executor/layers/fused_moe/experts/xpu_moe.py` 中将 `_supports_no_act_and_mul()` 的返回值从 `False` 改为 `True`，声明 XPU 后端支持无乘法激活的 fused MoE 路径。
3. **添加新激活函数**：在同文件的 `_supports_activation()` 方法中添加 `MoEActivation.RELU2_NO_MUL` 到支持列表，允许使用该激活函数。
4. **依赖配套**：等待 `vllm-xpu-kernels` 发布 0.1.7 版本以提供 `relu2_no_mul` 内核后合并本 PR。

关键文件：
- `vllm/model_executor/layers/fused_moe/layer.py`（模块 MoE 核心；类别 source；类型 core-logic；符号 FusedMoE.__init__）: FusedMoE 核心层，修改了 `is_act_and_mul=False` 的平台支持条件，允许 XPU 作为可选平台并更新错误提示。这是本次功能启用的关键开关。
- `vllm/model_executor/layers/fused_moe/experts/xpu_moe.py`（模块 XPU 后端；类别 source；类型 data-contract；符号 _supports_no_act_and_mul, _supports_activation）: XPU 后端专家模块，通过修改 `_supports_no_act_and_mul()` 和 `_supports_activation()` 声明对无乘法路径和 `RELU2_NO_MUL` 激活函数的支持，是 XPU 侧的功能启用。

关键符号：_supports_no_act_and_mul, _supports_activation

## 关键源码片段

### `vllm/model_executor/layers/fused_moe/layer.py`

FusedMoE 核心层，修改了 `is_act_and_mul=False` 的平台支持条件，允许 XPU 作为可选平台并更新错误提示。这是本次功能启用的关键开关。

```python
# 从 vllm/model_executor/layers/fused_moe/layer.py 中 extract 的 __init__ 相关片段
# 在量化方法初始化后，检查 is_act_and_mul 开关
if not self.moe_config.is_act_and_mul and not (
    current_platform.is_cuda_alike() or current_platform.is_xpu()  # 原为只检查 is_cuda_alike，现加入 XPU
):
    raise NotImplementedError(
        "is_act_and_mul=False is supported only for CUDA and XPU for now"  # 错误提示同步更新
    )

```

### `vllm/model_executor/layers/fused_moe/experts/xpu_moe.py`

XPU 后端专家模块，通过修改 `_supports_no_act_and_mul()` 和 `_supports_activation()` 声明对无乘法路径和 `RELU2_NO_MUL` 激活函数的支持，是 XPU 侧的功能启用。

```python
# 从 vllm/model_executor/layers/fused_moe/experts/xpu_moe.py 中提取的 XPUExperts 相关方法
class XPUExperts(mk.FusedMoEExpertsModular):
    # ...
    @staticmethod
    def _supports_no_act_and_mul() -> bool:
        # 之前返回 False，现在返回 True 以启用无乘法 fused MoE 路径
        return True

    @staticmethod
    def _supports_activation(activation: MoEActivation) -> bool:
        # 新增 MoEActivation.RELU2_NO_MUL 的支持，用于 Nemotron 等模型
        return activation in [
            MoEActivation.SILU,
            MoEActivation.GELU,
            MoEActivation.SWIGLUOAI,
            MoEActivation.RELU2_NO_MUL,  # 新增
        ]

```

# 评论区精华

讨论主要集中在依赖管理上：jikunshang 建议先标记为 Draft 以等待 `vllm-xpu-kernels` 发布，xuechendi 则认为可先合入，断言会在内核侧保护（若内核不支持则断言失败）。最终选择等待 v0.1.7 发布后再合并。gemini-code-assist 建议更新错误消息以包含 XPU，该建议已被采纳。此外 pre-commit 失败由另一个 PR #40078 修复。

- 依赖管理：等待 vllm-xpu-kernels 发布 (design): 最终等待 vllm-xpu-kernels v0.1.7 发布后合并本 PR。
- 错误消息更新建议 (documentation): 已被采纳，错误消息更新为 'is_act_and_mul=False is supported only for CUDA and XPU for now'。
- pre-commit 失败修复 (testing): 依赖 PR #40078 解决。

# 风险与影响

- 风险：风险低。变更仅扩展平台检查条件并声明支持，未改动现有 CUDA/ROCm 逻辑。但运行时若 `vllm-xpu-kernels` 版本不匹配或缺少 `relu2_no_mul` 内核，可能会导致断言失败。依赖外部库的版本同步是关键风险点。
- 影响：对 XPU 用户：现在可以运行需要 `is_act_and_mul=False` 的 MoE 模型（如 Nemotron），从而在 Intel GPU 上获得更好的性能和兼容性。对其他平台（CUDA/ROCm）无影响。团队需确保 `vllm-xpu-kernels` 同步更新。
- 风险标记：依赖外部内核库 , 平台特定支持

# 关联脉络

- PR #40078 pre-commit 相关修复 : 修复了本 PR 的 pre-commit 失败问题。
- PR #41019 vllm-xpu-kernels v0.1.7 版本升级 : 本 PR 依赖 v0.1.7 版本提供 `relu2_no_mul` 内核。