执行摘要
- 一句话:优化 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 性能。
实现拆解
- 添加 math 导入:在
marlin_moe.py 顶部添加 import math,为 math.ceil 调用做准备。
- 调整 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 数。
- 保留原逻辑 fallback:若
global_num_experts == -1,则保持原有行为(M 不变),确保非 EP 场景无影响。
- 移动代码位置:原 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 性能。
# 添加 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 直接批准合并。
风险与影响
关联脉络
- PR #45149 [ROCM][DSV32][Perf][MTP] Enable UNIFORM_BATCH CG mode in rocm_aiter_mla_sparse: 同为针对 DeepSeek 模型的性能优化,但关注点不同(ROCm 后端 vs Marlin MoE 后端)。本 PR 的改动可能影响未来 Marlin MoE 在其他架构上的性能调优。
参与讨论