soft-moe-pytorch
PyTorch 实现 Google Brain 软混合专家算法,无需离散路由即可高效融合多 expe
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
PyTorch 实现 Google Brain 软混合专家算法,无需离散路由即可高效融合多 expe
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

图1:Soft MoE 核心架构示意——通过软路由将所有 expert 的能力融合到每个 slot 中
想象一个大型医院的会诊场景:传统 MoE 就像挂号分诊——每个病人(token)只能被分配到1-2个专科医生(expert)看诊,结果是有些医生忙得脚不沾地,有些医生却闲得发慌。这就是 MoE 领域的负载不均衡(load imbalance)难题。
Google Brain 团队在 2023 年提出的 Soft MoE(arXiv:2308.00951)彻底改变了这个逻辑。它不再"挂号",而是让每个病人都能同时参考所有医生的意见——只是权重不同。身体抱恙找内科权重高,皮肤问题找皮肤科权重高,综合下来给出最优诊疗方案。这就是"软混合"的核心思想。

图2:Soft MoE 软路由机制——每个 slot 加权融合所有 expert 的输出,避免离散路由带来的负载不均问题
本项目是 Soft MoE 的 PyTorch 开源实现,代码精炼但逻辑深刻。核心实现在 soft_moe_pytorch/soft_moe.py 中:
1. 路由器(Router)设计
路由器为每个 slot 生成一个权重向量,维度等于 expert 数量。与传统 MoE 的稀疏路由(选 top-K)不同,Soft MoE 的路由器输出是稠密的——每个 slot 都对所有 expert 有权重贡献。这些权重通过 softmax 归一化,确保总和为1。
moe = SoftMoE(
dim=512, # 模型维度
seq_len=1024, # 序列长度
num_experts=4 # expert 数量
)
2. 加权融合机制
对于每个 slot,加权融合的过程是:
3. 分布式训练支持
项目内置 distributed.py 支持多 GPU 训练:
AllGather:跨 GPU 聚合所有 expert 的输出split_by_rank:按 rank 分割输入数据gather_sizes:动态协调各 GPU 持有的 tensor 尺寸4. 动态槽位变体
DynamicSlotsSoftMoE 变体引入了自适应槽位机制——不再要求事先指定固定的 seq_len,槽位数量可以根据输入动态调整,特别适合变长序列的处理场景。
适用场景:
当前局限:
pip install soft-moe-pytorch
import torch
from soft_moe_pytorch import SoftMoE
moe = SoftMoE(dim=512, seq_len=1024, num_experts=4)
x = torch.randn(1, 1024, 512)
out = moe(x) + x # 残差连接
lucidrains(Phil Wang)是 AI 开源领域的活跃贡献者,其项目以"用最少的代码实现最优雅的算法"著称。本项目依赖极简(仅 torch + einops),代码可读性极高,适合作为 MoE 变体的学习素材。
Soft MoE 代表着 MoE 领域的一个新方向——不再追求"选择谁"的离散决策,而是拥抱"融合一切"的连续思维。虽然在 AR 场景受限,但在视觉和文生图领域已经展现出潜力,是值得关注的技术演进路线。