Prhub

#48144 update marlin M size for EP

原始 PR 作者 gnovack 合并时间 2026-07-10 07:52 文件变更 1 提交数 1 评论 0 代码增减 +7 / -2

执行摘要

优化 EP 模式下 Marlin MoE 的 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 性能。

PR 逻辑清晰、改动精简,属于高质量的小范围性能优化。建议精读,尤其关注 M 值估算公式的设计思路,未来类似场景可复用此模式。

讨论亮点

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

实现拆解

  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 模型执行器 modified 6.83

关键符号

fused_marlin_moe

关键源码片段

vllm/model_executor/layers/fused_moe/experts/marlin_moe.py core-logic

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

# 添加 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

评论区精华

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

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

风险与影响

整个变更仅影响 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 用户无感知。

缺少测试覆盖 核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论