跳到主要内容

MoE 并行

一句话概括核心:Mix-of-Experts 通过路由机制让每个 token 只激活部分 Expert,结合 Expert Parallel 将不同 Expert 分布到不同 GPU,实现"模型越大、激活越少"的高效推理。

前置知识

核心概念

MoE 架构回顾

MoE 的核心思想是将 FFN 层替换为多个 Expert(通常是小型 FFN),每个 token 通过 Router 选择 top-k 个 Expert 进行计算。

传统 FFN: Input → FFN → Output (所有 token 走同一个 FFN)

MoE FFN: Input → Router → top-k Expert → 加权组合 → Output
↗ Expert_0
token_i → → Expert_1 (每个 token 只激活 2 个 Expert)
↘ Expert_7

关键参数

  • num_experts:总 Expert 数量(如 DeepSeek-V3 有 256 个 Expert)
  • top_k:每个 token 激活的 Expert 数(通常为 2)
  • expert_capacity:每个 Expert 最多处理的 token 数

MoE 跨卡 Expert 分布

流程说明

  1. Router 计算:在所有 token 上计算路由分数(Gating Network),确定每个 token 的 top-k Expert
  2. Token Dispatch(AllToAll):将 token 按 Expert 分配到对应 GPU
  3. Expert 计算:各 GPU 独立计算自己负责的 Expert
  4. Result Gather(AllToAll):将 Expert 输出聚合回原始 token 顺序
  5. 加权组合:按路由权重组合 top-k Expert 的输出

AllToAll 通信详解

AllToAll 在 MoE 中的作用

MoE 中有两次关键的 AllToAll 通信:

Dispatch(前向分发):
GPU_i 持有: 一部分 token
需要发送到: 不同 GPU 上的对应 Expert
通信模式: 每个 GPU 向所有 GPU 发送不同数据

Gather(结果聚合):
各 GPU 计算完 Expert 输出
需要将结果发回给持有原始 token 的 GPU
通信模式: Dispatch 的逆操作

AllToAll 通信量计算

Dispatch 通信量 = tokens × top_k × hidden_size × 4 bytes / num_gpus

以 Llama-MoE 为例:
tokens = 4096 (batch × seq)
top_k = 2
hidden_size = 4096
num_gpus = 8
通信量 = 4096 × 2 × 4096 × 4 / 8 = 16 MB

对比 TP 的 AllReduce: ~32 KB/layer
MoE 的 AllToAll 通信量远大于 TP 的 AllReduce

AllToAll vs AllReduce

维度AllReduce (TP)AllToAll (MoE)
通信量小(hidden_size × 常数)大(tokens × hidden × top_k)
通信模式环形/树形全互联
带宽利用率高(可 pipeline)取决于数据分布
延迟敏感度极高(每层同步)中等(可 batch)

Expert Parallel vs Tensor Parallel 的组合

纯 Expert Parallel(EP)

每个 Expert 完整放在一张 GPU 上,适合 Expert 较小的场景。

EP + TP 混合

当单个 Expert 很大时(如 DeepSeek-V3 的 Expert 本身就需要多卡),需要在 Expert 内部再做 TP:

并行策略选择

场景推荐策略
Expert 小,数量多纯 EP
Expert 大,数量少EP + TP(Expert 内 TP)
超长序列EP + CP(Context Parallel 切分序列)
跨节点部署EP 跨节点 + TP 节点内

负载均衡策略

MoE 的核心挑战之一是 Expert 负载不均衡。如果所有 token 都路由到同一个 Expert,会导致:

  • 该 GPU 成为瓶颈
  • 其他 GPU 空闲
  • AllToAll 通信倾斜

Auxiliary Loss(辅助损失)

训练时添加辅助损失函数,鼓励均匀分配:

aux_loss = α × Σ(expert_i_fraction × expert_i_capacity_fraction)

其中:
expert_i_fraction = token 分配到 expert_i 的比例
expert_i_capacity_fraction = expert_i 使用容量占总容量的比例
α = 平衡系数(通常 0.01)

目标: 最小化时,token 会均匀分布到所有 Expert

Capacity Factor

capacity_factor = max_tokens_per_expert / (total_tokens / num_experts)

capacity_factor = 1.0: 严格均匀,超出丢弃
capacity_factor = 1.25: 允许 25% 溢出,溢出 token 走残差连接
capacity_factor = 2.0: 宽松分配,但可能导致显存浪费

推理时通常设 1.0-1.25,保证负载均衡

推理时的负载均衡

推理时无法像训练那样通过 loss 调整,常见策略:

  1. 静态路由:固定 token 到 Expert 的映射(简单但可能不均衡)
  2. 动态重路由:当 Expert 超限时,将 token 路由到下一个 Expert
  3. Load-aware Routing:根据 Expert 队列长度动态选择

DeepSeek-V3 的 MLA + MoE 架构简析

DeepSeek-V3(671B 参数,激活 37B)是 MoE 架构的代表:

总参数: 671B
激活参数: ~37B (每 token 只激活约 5.5% 的参数)

架构特点:
├── MLA (Multi-Head Latent Attention)
│ ├── 低秩 KV 压缩(减少 KV Cache)
│ └── 注意力计算高效
├── MoE FFN
│ ├── 256 个 Expert
│ ├── 每 token 激活 top-8 Expert(实际 1 个 routed + 1 个 shared)
│ └── 跨节点 Expert 分布(Expert Parallel)
└── 并行策略
├── 节点内 TP=4(Expert 内部)
├── Expert 跨节点分布(EP)
└── 可能的 PP 跨节点分层

DeepSeek-V3 推理优势

  • 激活参数仅 37B,推理效率远高于同等规模的 Dense 模型
  • MLA 大幅减少 KV Cache 显存
  • Expert 并行使显存占用分散

MoE 部署的通信瓶颈和缓解策略

通信瓶颈分析

缓解策略

策略原理效果
通信聚合将多次小 AllToAll 合并为一次大 AllToAll减少 startup latency
Expert 复制热门 Expert 在多卡上各放一份减少跨卡访问
Token Batching按 Expert 分组 token,批量发送提高带宽利用率
Overlap 计算通信计算当前 batch 时预取下一个 batch隐藏通信延迟
Hierarchical Routing先选组再选 Expert减少 AllToAll 目标数

部署视角

vLLM 中的 MoE

# DeepSeek-V3 推理(MoE + EP)
vllm serve deepseek-ai/DeepSeek-V3 \
--tensor-parallel-size 4 \
--enable-expert-parallel

# MoE 模型需要注意 Expert 的分配

显存估算

MoE 显存 = (总参数量 / EP_size) × 2 bytes
+ KV_Cache × batch_size
+ Router buffer + AllToAll buffer

DeepSeek-V3 EP=8:
权重显存 = 671B / 8 × 2 bytes = 168 GB
需要多卡或量化才能放下

面试视角

Q1: MoE 模型的并行策略如何选择?

决策框架

  1. 先看激活参数量:MoE 的推理成本取决于激活参数(非总参数)
    • DeepSeek-V3 激活 37B → 按 37B 模型来规划
  2. TP size 由激活参数决定:TP 切分的是激活态的计算
  3. EP size 由总 Expert 数决定:EP 分布的是 Expert 的权重
  4. 总 GPU 数 = TP_size × EP_size × PP_size

Q2: MoE 推理的主要性能瓶颈是什么?

三个层次

  1. 计算层:Expert 内部的矩阵乘法(可通过 TP 优化)
  2. 通信层:AllToAll 的 token 分发/聚合(主要瓶颈)
  3. 调度层:Router 计算和负载不均衡

实际部署中,AllToAll 通信通常占 MoE 推理延迟的 30-50%。

Q3: 为什么 MoE 可以跨机部署而 TP 不行?

  • TP 的 AllReduce 每层都要同步,延迟直接叠加到每个 token
  • MoE 的 AllToAll 只在 MoE layer 处发生,频率远低于 TP
  • MoE 的 token 分发可以批量完成,对延迟不那么敏感
  • MoE 中 Expert 计算是独立的,没有 TP 那种紧耦合的同步关系

Q4: MoE 模型的负载均衡怎么做?

  • 训练阶段:Auxiliary Loss 引导均匀分配
  • 推理阶段:Capacity Factor 限制单 Expert 负载 + 溢出 token 走 shared Expert
  • 部署阶段:监控各 GPU 利用率,动态调整 Expert 分布

Q5: DeepSeek-V3 相比传统 MoE(如 Mixtral)有什么创新?

  • MLA:低秩注意力,大幅减少 KV Cache
  • 更细粒度的 Expert:256 个小 Expert vs Mixtral 的 8 个大 Expert
  • Shared Expert:保留一个共享 Expert 处理 overflow token
  • 更高的 top-k:top-8 路由 vs Mixtral 的 top-2,增加灵活性

分布式完成 → 进入 生产部署架构