# PR #48144 完整报告

- 仓库：`vllm-project/vllm`
- 标题：update marlin M size for EP
- 合并时间：2026-07-10 07:52
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/48144

---

# 执行摘要

- 一句话：优化 EP 模式下 Marlin MoE 的 M 维度估算
- 推荐动作：PR 逻辑清晰、改动精简，属于高质量的小范围性能优化。建议精读，尤其关注 M 值估算公式的设计思路，未来类似场景可复用此模式。

# 功能与动机

在 DP/EP 场景下，hidden_states.shape[0] 被填充（padding），导致 Marlin MoE kernel 的 M block size 选择偏大，降低计算效率。通过 M * E / global_num_experts 估算每个 rank 的实际有效 token 数，可以更准确地选择 block_size_m，提升 kernel 性能。

# 实现拆解

1. **添加 math 导入**：在 `marlin_moe.py` 顶部添加 `import math`，为 `math.ceil` 调用做准备。
2. **调整 M 值估算逻辑**：在 `fused_marlin_moe` 函数中，将 `global_num_experts` 的赋值和 M 值修正逻辑移到 block_size_m 选择逻辑之前。当 `global_num_experts != -1` 时，使用 `M = math.ceil(M * E / global_num_experts)` 重新计算 M，即用原始 M 乘以（本机专家数 / 全局专家数）来估计每个 rank 的有效 token 数。
3. **保留原逻辑 fallback**：若 `global_num_experts == -1`，则保持原有行为（M 不变），确保非 EP 场景无影响。
4. **移动代码位置**：原 M 相关代码位于 block_size_m 选择之后，现移至之前，确保修正后的 M 被用于 block_size_m 计算。

关键文件：
- `vllm/model_executor/layers/fused_moe/experts/marlin_moe.py`（模块 模型执行器；类别 source；类型 core-logic；符号 fused_marlin_moe）: 核心变更文件，修改了 fused_marlin_moe 函数中 M 值的估算逻辑，影响 block_size_m 选择和 kernel 性能。

关键符号：fused_marlin_moe

## 关键源码片段

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

核心变更文件，修改了 fused_marlin_moe 函数中 M 值的估算逻辑，影响 block_size_m 选择和 kernel 性能。

```python
# 添加 math 导入（文件顶部）
import math

# fused_marlin_moe 函数内部关键变更片段
# ... 前面的断言 ...

# EP 场景下，hidden_states 的 dim 0 被 padding 到 max_tokens_per_rank * num_ranks
# 因此需要根据全局专家数比例缩放，估算当前 rank 的有效 token 数
if global_num_experts == -1:
    global_num_experts = E
else:
    # 将 M 缩小到每个 rank 实际处理的 token 数
    # M 是原始 padded M，E 是本地专家数，global_num_experts 是全局专家总数
    M = math.ceil(M * E / global_num_experts)

# 根据估算后的 M 选择更准确的 block_size_m
for block_size_m in [8, 16, 32, 48, 64]:
    if M * topk / E / block_size_m < 0.9:
        break

# 原来的 global_num_experts 赋值被移到上面，移除了下面这行（已无意义）
# if global_num_experts == -1:
# global_num_experts = E

```

# 评论区精华

无 review 讨论。PR 由 WoosukKwon 直接批准合并。

- 暂无高价值评论线程

# 风险与影响

- 风险：整个变更仅影响 `global_num_experts != -1` 的分支，且改动集中在一处条件判断和一行数学计算上。非 EP 场景（global_num_experts == -1）行为完全不变。风险极低，但缺乏直接针对 EP 场景的单元测试覆盖。由于是性能优化，回归可被 benchmark 快速验证。
- 影响：**影响范围**：仅影响使用 Marlin MoE 后端且启用 EP（Expert Parallelism）的模型（如 DeepSeek-V4）。
**影响程度**：Benchmark 显示 TPOT 从 32.72ms 降至 30.35ms（-7.24%），吞吐量从 1896.52 tok/s 提升至 2030.3 tok/s（+7.05%）。
**用户 / 系统**：仅对 DP/EP 用户有正向性能收益；非 EP 用户无感知。

- 风险标记：缺少测试覆盖 , 核心路径变更

# 关联脉络

- PR #45149 [ROCM][DSV32][Perf][MTP] Enable UNIFORM_BATCH CG mode in rocm_aiter_mla_sparse: 同为针对 DeepSeek 模型的性能优化，但关注点不同（ROCm 后端 vs Marlin MoE 后端）。本 PR 的改动可能影响未来 Marlin MoE 在其他架构上的性能调优。