Expert Parallelism
专家并行将混合专家层中的专家分布到多个 GPU 上,并通过全互连通信将每个 token 路由到对应专家。
专家并行(EP)是一种用于分布式训练和推理的策略,适用于混合专家(MoE)模型;该策略会将不同的专家放置在不同的GPU上,并将每个词元发送到存放该词元所选专家的设备。MoE 层会用许多更小的专家网络和一个路由器,替换 Transformer 中的一个大型前馈模块;路由器对每个词元只激活少数几个专家,因此总参数量的增长速度可以远远超过每个词元计算开销的增长速度。专家并行使这些参数能够放入内存:每块 GPU 无需存储所有专家,只需存储其中一部分。Google 的 Noam Shazeer 及其同事早在 2017 年就在其稀疏门控 MoE 层中将专家分布到不同设备上,每个专家各保留一个共享副本;GShard 于 2020 年 6 月进一步扩展了这一方法,将一个拥有 6000 多亿个参数的翻译模型中的专家分布到 2,048 个 TPU v3 加速器上。如今,专家并行已成为训练和部署大型 MoE 语言模型和视觉语言模型的标准方法。
Token 如何在 GPU 之间传输#
每个 MoE 层分四步运行:
- 路由:路由器根据每个 token 对每个专家进行评分,并保留得分最高的 k 个专家,通常为一个、两个或八个。
- 分发:全互连集合通信会将每个 token 的隐藏状态发送到负责其所选专家的 GPU。
- 计算:每个 GPU 使用本地专家处理收到的 token。
- 合并:第二次全互通通信会将输出送回每个 token 原本所在的 GPU,然后根据路由器分数对输出加权并求和。
下面的代码片段模拟一个层中的路由和分发步骤:8 个专家分布在 4 个 GPU 上,每个 GPU 有两个专家:
import torch
torch.manual_seed(0)
num_experts, num_gpus, top_k = 8, 4, 2
tokens = torch.randn(4096, 512) # 4,096 个 token 的隐藏状态
router = torch.nn.Linear(512, num_experts)
# 路由:每个 token 根据路由器分数选择得分最高的 2 个专家
with torch.no_grad():
_, experts = router(tokens).topk(top_k, dim=-1)
# 专家并行:专家 0-1 位于 GPU 0,专家 2-3 位于 GPU 1,依此类推
gpu = experts // (num_experts // num_gpus)
# 分发:统计每个专家和 GPU 收到的 token-专家分配数量
print(torch.bincount(experts.flatten(), minlength=num_experts).tolist())
print(torch.bincount(gpu.flatten(), minlength=num_gpus).tolist())第一行输出显示各专家的负载:分配数量在 948 至 1,087 之间,而平均值为 1,024;第二行显示 4 个 GPU 各自接收了 8,192 项分配中的 1,968 至 2,139 项。即使路由器是随机初始化的,工作分配也会不均衡;经过训练的路由器还会形成热门专家,使负载偏斜得更加严重。
负载均衡与容量#
一层只有在负载最重的 GPU 完成后才能结束,因此路由不均衡会直接导致硬件闲置。MoE 训练会通过三种方式缓解这一问题:
- 辅助负载均衡损失:在损失函数中增加一项,鼓励路由器将 token 均匀分配给各个专家。
- 容量因子:每个专家每批次最多接收固定数量的 token,例如均匀分配份额的 1.25 倍;超出容量的 token 会跳过该专家。
- 基于偏置的均衡:DeepSeek-V3 会在路由器分数上为每个专家添加偏置,这只会影响专家选择。每一步结束后,系统会降低负载过高专家的偏置,并提高空闲专家的偏置,从而均衡负载,而无需让辅助损失与主要目标相互竞争。
在容量受限的情况下,每个 token 的路径取决于其专家的繁忙程度:
被跳过的 token 会原样通过该层的残差连接,因此大量丢弃 token 会损害质量。DeepSeek-V3 在训练期间不会丢弃任何 token,而是依靠基于偏置的均衡机制。
通信是另一项成本。每个 MoE 层都会进行两次全互连交换,因此专家并行最适合在节点内运行,因为节点内 GPU 通过高速 NVLink 连接;跨节点使用速度较慢的链路则成本较高。DeepSeek-V3 使用 64 路专家并行,将每层 256 个路由专家分布到 8 个节点上;每个 token 最多只会发送到 4 个节点上的专家,并且通信交换会与计算重叠进行。
组合并行策略#
专家并行是将训练拆分到多个设备上的几种方法之一:
- 数据并行:在每个 GPU 上复制完整模型,并拆分每个批次,在每一步之后同步梯度。
- 张量并行:将单个权重矩阵拆分到多个 GPU 上,因此每个 GPU 都会参与每一层的计算。
- 流水线并行:将连续的层分配给不同 GPU,并让微批次依次流经这些 GPU。
- 上下文并行:将一个长输入序列拆分到多个 GPU 上。
能够装入单块 GPU 显存的稠密模型只需采用数据并行;传入 device=[0, 1] 这样的设备列表并启用训练模式时,Ultralytics YOLO26 就会以这种方式在多块 GPU 上训练。大型 MoE 模型会结合多种并行方式:DeepSeek-V3 使用 16 路流水线并行、64 路专家并行和分片数据并行训练其 6710 亿个参数(每个 token 激活 370 亿个),且没有使用张量并行。推理引擎(例如 vLLM)在为模型提供服务时也会采用相同的拆分方式,因此,如果一个 MoE 模型的专家无法全部装入单块 GPU 的显存,该模型就会跨多块 GPU 运行,每块 GPU 仅存放分配给该 GPU 的那部分专家。










