Skip to content

MoE 的两个上游创新:Routing-Free 与 OmniMoE

前一篇拆的七项工作,有一个共同前提:

Router 已经给出 token → Expert 的分配,我们优化后面的 dispatch / GEMM / A2A。

这两篇动的是这个前提本身。

工作改的是哪一层
Routing-Free MoE谁决定专家激活
OmniMoE专家本身有多细(外加执行层)
FasterMoE / Tutel专家怎么分布到 GPU
MegaBlocks不规则专家 GEMM 怎么块化
ScatterMoE怎么避免 routing 重排的 materialization
SonicMoErouting/token 数怎么适配 GEMM tile
Mega MoE分布式 MoE 整条链怎么 block-streaming 化

Yilun Liu*, Jinru Han*, Sikuan Yan, Volker Tresp, Yunpu Ma(LMU Munich / UCLA / MCML) arXiv:2604.00801,2026-04-01。代码 liuyilun2000/RoutingFreeMoE

1.1 把「Router 替所有专家决策」拆掉

Section titled “1.1 把「Router 替所有专家决策」拆掉”

标准 MoE 是自上而下的竞争式路由:

x→Router(x)→Softmax→TopK→Eix \rightarrow \text{Router}(x) \rightarrow \text{Softmax} \rightarrow \text{TopK} \rightarrow E_i

RFMoE 反过来问:为什么要一个中央模块替所有专家做决定?让每个专家自己判断这个 token 想不想接。

每个专家内部有自己的低秩投影:

Gi(x)=ReLU(∥xAgate,i∥2−bi)G_i(x) = \text{ReLU}\big(\|x A_{\text{gate},i}\|_2 - b_i\big)

其中 Agate,i∈RD×rA_{\text{gate},i} \in \mathbb{R}^{D \times r}(r≪Dr \ll D)是专家私有的投影矩阵,bib_i 是可学的逐专家偏置(初始化 10−610^{-6} 做 warm-up)。激活是个硬指示:

fi(x)=1[Gi(x)≥θ]f_i(x) = \mathbf{1}\big[G_i(x) \ge \theta\big]

于是消失的是:外部 router、softmax、固定 Top-K。每个 token 激活几个专家自然可变,θ\theta 控制整体稀疏度,而且调 θ\theta 不需要重训。

它真正消灭的是「中心化的竞争式路由」,不是「系统里不再有 routing 这件事」——你依然得知道哪些专家最终激活了才能 dispatch。

1.2 去掉 router 之后,负载均衡成了新问题

Section titled “1.2 去掉 router 之后,负载均衡成了新问题”

这是最容易被漏掉、但对系统影响最大的一节。传统 MoE 的负载均衡损失作用在 router 的概率上;router 没了,出现两种正交的失败模式:

只用哪种损失后果
仅 token-balancing(μ=0\mu = 0)token 被规范到激活目标数量的专家,但专家侧不受约束——少数热门专家垄断,其余饿死
仅 expert-balancing(μ=1\mu = 1)每个专家在 batch 内被均匀使用,但每 token 的计算量剧烈波动,对域漂移过敏

解法是联合辅助损失:

LLB=μLEB+(1−μ)LTB\mathcal{L}_{\text{LB}} = \mu \mathcal{L}_{\text{EB}} + (1-\mu)\mathcal{L}_{\text{TB}}

LEB=∣E∣∑i∈Efig~i,LTB=∣B∣∑t∈Bftg~t\mathcal{L}_{\text{EB}} = |\mathcal{E}|\sum_{i \in \mathcal{E}} f_i \tilde g_i, \qquad \mathcal{L}_{\text{TB}} = |\mathcal{B}|\sum_{t \in \mathcal{B}} f_t \tilde g_t

用阈值前的 Gi(x)G_i(x) 作可微代理 g~\tilde g。实测 μ=0.5\mu = 0.5 困惑度最低、吞吐最高。权重还有动态调度:

λt=λt−1exp⁡(η(ρt−ρ∞))\lambda_t = \lambda_{t-1}\exp\big(\eta(\rho_t - \rho_\infty)\big)

当前密度 ρt\rho_t 超过目标就加压,否则放松。

还有一个值得记的发现:把逐层密度约束放松成全局密度,让首尾层多激活、中间层保持稀疏,Scale S 的验证困惑度从 39.44 降到 28.74。

RFMoE 把标准的「Router 矩乘 → Softmax → Top-K → 阻塞式 All-to-All」换成:

  1. 非阻塞 all-gather 把 token 广播到全部 MM 张卡
  2. 每卡流水地为本地 N/MN/M 个专家打分
  3. 对激活的 (token, expert) 对算 FFN,复用打分阶段算出的 xAgate,ixA_{\text{gate},i}
  4. 异步点对点回传,无 barrier

推理时把有效密度 ρeff\rho_{\text{eff}} 从 100% 降到 4.3%(激活数降 20×,FLOP 降 31%),下游 benchmark 掉不到 2 个百分点。

这让它的开放问题变得尖锐:门控成本是

O(N⋅D⋅r)O(N \cdot D \cdot r)

而中央线性 router 是 O(N⋅D)O(N \cdot D)——RFMoE 的每专家门控比中央 router 还贵一个秩 rr 的因子。它在 24 个专家上证明了架构可行,但代价函数在 NN 增大时是往坏方向走的。论文把这列为已知局限。


Jingze Shi, Zhangyang Peng, Yizhang Zhu, Yifan Wu, Guang Liu, Yuyu Luo(HKUST 广州 / BAAI) arXiv:2602.05711,ICML 2026。代码 flash-algo/omni-moe

普通专家是一整个 FFN:d→dff→dd \rightarrow d_{ff} \rightarrow d。OmniMoE 继续拆,拆到一个 atomic expert 只剩两条向量 wiin,wiout∈Rdw_i^{in}, w_i^{out} \in \mathbb{R}^d:

Ei(x)=σ(x wiin⊤) wioutE_i(x) = \sigma\big(x\,{w_i^{in}}^\top\big)\, w_i^{out}

本质是一个 rank-1 的 FFN 分量。σ\sigma 实例化为 SwiGLU。大量 atomic expert 堆成 W,V∈RN×dW, V \in \mathbb{R}^{N \times d}——官方实现里就是两张 (N,d)(N, d) 的 embedding 表 up_embed / down_embed。

和 MegaBlocks 的「细粒度」完全不是一回事:

MegaBlocks: 一个 Expert 仍是一个 FFN,只是执行时切 block
OmniMoE: 模型语义上 Expert 本身就细到 vector

N=106N = 10^6 时最朴素的 router xWrxW_r(Wr∈Rd×NW_r \in \mathbb{R}^{d\times N})成本 O(Nd)O(Nd),光 router 就撑不住。

OmniMoE 把专家 ID i∈[0,N)i \in [0, N) 拆成二维 (ir,ic)(i_r, i_c),NrNc=NN_r N_c = N,Nr≈Nc≈NN_r \approx N_c \approx \sqrt N。分别投影:

pr=xWr,Wr∈Rd×Nr;pc=xWc,Wc∈Rd×Ncp_r = x W_r,\quad W_r \in \mathbb{R}^{d\times N_r}; \qquad p_c = x W_c,\quad W_c \in \mathbb{R}^{d\times N_c}

隐式分数由 LogSoftmax⁡\operatorname{LogSoftmax} 后相加得到:Sij=pr[i]+pc[j]\mathcal{S}_{ij} = p_r[i] + p_c[j]。投影复杂度:

O(Nd)⟶O(N d)\boxed{O(Nd) \longrightarrow O(\sqrt N\, d)}

Router 照常给出 token → experts。执行时把 M=L×KM = L \times K 个 (token, expert) 任务摊平、按 (Expert Group ID, Token ID) 排序、分组批量执行,输出用 scatter-add 写回:

token0 -> E17 E853 E10028 E17: token0 token1 token2
token1 -> E392 E17 E771 ⟹ E853: token0 token2
token2 -> E853 E17 E6 E392: token1

即把计算 DAG 从 for token: visit experts 转置成 for expert: process tokens。

为什么值得转置:atomic expert 只有两条 dd-向量,token-centric 遍历意味着 L×KL\times K 次分散的小向量查表,严重访存受限,根本没有足够大的 GEMM 去摊薄访存延迟。按专家重聚合之后,每个活跃专家的参数从 HBM 载入 SRAM 一次,被所有需要它的 token 共用,参数复用率

η=L⋅K∣Eactive∣\eta = \frac{L \cdot K}{|\mathbb{E}_{\text{active}}|}

于是「随机查表」重新变回「grouped GEMM」。


3.1 Expert-Centric Scheduling ≠ Expert-Choice Routing

Section titled “3.1 Expert-Centric Scheduling ≠ Expert-Choice Routing”

这是最容易搞混的一处。

Expert-Choice Routing(Zhou et al. 2022)OmniMoE 的 Expert-Centric Scheduling
层次模型语义执行顺序
内容专家自己选 Top-K token,Ei→TopK(tokens)E_i \rightarrow \text{TopK}(\text{tokens})token 照常选 Top-K 专家
影响改变归纳偏置和 token 容量路由语义完全不变

OmniMoE 是标准的 token-choice 路由,只是把执行顺序转置了。

3.2 它不是从 ScatterMoE「倒退」回显式排序

Section titled “3.2 它不是从 ScatterMoE「倒退」回显式排序”

看完 ScatterMoE 的「别 reorder token、让 routing index 直接驱动 GEMM」,再看 OmniMoE 说「按专家重排任务」,容易觉得是退步。

真正的道理是:最优 layout 策略取决于专家粒度。

ScatterMoEOmniMoE
一个专家是大 FFN两条 dd-向量
找到专家后后面有足够大的 GEMM 摊薄几乎全是随机读权重
于是值得接受 indexed load,少一次 copy值得先重组任务,换回参数复用

token-expert 分配是一张二部图。token-centric 是按行遍历(CSR),expert-centric 是按列遍历(CSC)——同一张图,只是遍历序不同。这正是论文的结构:按列分组成大小 BB 的块,块内按行(token)索引排序以获得访存合并。


四、消融数据:粒度决定 layout 不是观点,是 24.8 倍

Section titled “四、消融数据:粒度决定 layout 不是观点,是 24.8 倍”

OmniMoE 的组件消融(论文 Table 2):

替换延迟峰值显存其他
Expert-centric → token-centric24.8×417.7×分散 HBM 查表、访存不合并
Cartesian router → dense router30.6×337.5×专家利用率塌到 4%,不均度 0.24 → 0.77
去掉共享稠密 MLP——知识 −9%,推理 −21%

最后一行值得单说:纯 atomic expert 撑不起通用语法和推理,必须配一个稠密基底。 这和 DeepSpeed-MoE 的 Residual-MoE(固定稠密 MLP + Top-1 稀疏专家作误差修正)是同一个直觉,隔了四年又被验证一次。

  • 基线:Dense、GShard(NVIDIA CuTile kernel)、DeepSeekMoE(CuTile kernel)、PKM(Triton)、PEER(Triton)
  • 相对 PEER 10.9×、相对 DeepSeekMoE 15.2×(4096 token、200M FFN 层:73ms / 102ms → 6.7ms)
  • 端到端 8×A100 约 14.2k tok/s(PEER 11.6k,PKM 7.9k)
  • 6.4B-A1.7B 零样本平均 50.9%(DeepSeekMoE 50.2%,PEER 48.9%,Dense 45.9%)

五、两篇都没有和 MegaBlocks / ScatterMoE 做实证对比

Section titled “五、两篇都没有和 MegaBlocks / ScatterMoE 做实证对比”
被引用的工作RFMoEOmniMoE有实证对比吗
MegaBlocks引用引用都没有
ScatterMoE未引用第 4 节引用都没有
DeepSpeed-MoE引用引用都没有
Tutel / FasterMoE—在 bib 里没有
DeepSeekMoE引用引用OmniMoE 有(用 CuTile kernel 实现的架构对比)
vLLM / Megatron未引用未引用—

需要注意 OmniMoE 对 DeepSeekMoE 的对比是架构层面的(用 NVIDIA CuTile kernel 重实现),不是和 DeepSeek 自己那套手写 PTX/CUDA 融合 kernel 比。