1. 概述
DeepSeek V3/R1 采用了大规模专家并行(Expert Parallelism, EP)策略来处理256个专家的MoE层。由于模型的高度稀疏性(每层仅激活8个专家),需要采用很大的overall batch size来确保每个专家获得足够的expert batch size。
2. 专家并行策略
2.1 Prefill阶段
- 路由专家: EP32
- MLA和共享专家: DP32
- 部署单元: 4节点,32个冗余路由专家
- 每张卡: 9个路由专家 + 1个共享专家
2.2 Decode阶段
- 路由专家: EP144
- MLA和共享专家: DP144
- 部署单元: 18节点,32个冗余路由专家
- 每张卡: 2个路由专家 + 1个共享专家
3. 通信量分析
3.1 基础参数
- 总专家数: 256
- 每个token选择专家数: 8
- 隐藏层维度: 7168
- 数据类型: BF16 (2字节)
- 批次大小: 1024
- Prefill序列长度: 2048
- Decode序列长度: 1
3.2 Prefill阶段通信量
计算过程
总token数 = batch_size × seq_len = 1024 × 2048 = 2,097,152
总专家分配数 = 总token数 × experts_per_token = 2,097,152 × 8 = 16,777,216
每专家token数 = 总专家分配数 / 总专家数 = 16,777,216 / 256 = 65,536
每GPU专家数 = 总专家数 / EP_size = 256 / 32 = 8
每GPU token数 = 每专家token数 × 每GPU专家数 = 65,536 × 8 = 524,288
每GPU发送量 = 每GPU token数 × hidden_size × dtype_size / (1024³)
= 524,288 × 7168 × 2 / (1024³) = 7.00 GB
总通信量 = 每GPU发送量 × 2 = 7.00 × 2 = 14.00 GB
通信特点
- 专家并行度: 32
- 节点数: 4
- 每节点GPU数: 8
- 每GPU专家数: 8
- 每GPU token数: 524,288
- 每GPU发送量: 7.00 GB
- 总通信量: 14.00 GB
3.3 Decode阶段通信量
计算过程
总token数 = batch_size × seq_len = 1024 × 1 = 1,024
总专家分配数 = 总token数 × experts_per_token = 1,024 × 8 = 8,192
每专家token数 = 总专家分配数 / 总专家数 = 8,192 / 256 = 32
每GPU专家数 = 总专家数 / EP_size = 256 / 144 = 1
每GPU token数 = 每专家token数 × 每GPU专家数 = 32 × 1 = 32
每GPU发送量 = 每GPU token数 × hidden_size × dtype_size / (1024³)
= 32 × 7168 × 2 / (1024³) = 0.0004 GB
总通信量 = 每GPU发送量 × 2 = 0.0004 × 2 = 0.0009 GB
通信特点
- 专家并行度: 144
- 节点数: 18
- 每节点GPU数: 8
- 每GPU专家数: 1
- 每GPU token数: 32
- 每GPU发送量: 0.0004 GB
- 总通信量: 0.0009 GB
3.4 对比分析
| 指标 | Prefill阶段 | Decode阶段 | 比例 |
|---|---|---|---|
| 专家并行度 | 32 | 144 | 1:4.5 |
| 节点数 | 4 | 18 | 1:4.5 |
| 每GPU专家数 | 8 | 1 | 8:1 |
| 每GPU token数 | 524,288 | 32 | 16,384:1 |
| 每GPU发送量 | 7.00 GB | 0.0004 GB | 17,500:1 |
| 总通信量 | 14.00 GB | 0.0009 GB | 16,384:1 |
4. All2All 通信过程
4.1 通信阶段
阶段1: Token分发
- 目的: 将tokens按专家路由结果分发到对应GPU
- 操作: 统计每个专家需要的token数量
- 时间: ~0.1ms (Prefill), ~0.001ms (Decode)
阶段2: All2All发送
- 目的: 跨节点/GPU发送tokens到目标专家
- 操作:
dist.all_to_all()操作 - 通信模式:
- 节点内: NVLink (400 GB/s)
- 节点间: InfiniBand (50 GB/s)
- 时间: ~1.25ms (Prefill), ~0.0025ms (Decode)
阶段3: 专家计算
- 目的: 每个专家并行处理分配给它的tokens
- 操作: MLP前向传播
- 时间: ~5.0ms (Prefill), ~0.1ms (Decode)
阶段4: All2All接收
- 目的: 将专家计算结果聚合回原始位置
- 操作:
dist.all_to_all()操作 - 时间: ~1.25ms (Prefill), ~0.0025ms (Decode)
阶段5: 结果聚合
- 目的: 将多个专家的输出按权重聚合
- 操作: 加权求和
- 时间: ~0.1ms (Prefill), ~0.001ms (Decode)
4.2 通信模式分析
带宽利用率
- NVLink利用率: 87.5% (节点内通信)
- InfiniBand利用率: 12.5% (节点间通信)
通信瓶颈
- Prefill阶段: 主要瓶颈在All2All通信时间 (~2.5ms)
- Decode阶段: 主要瓶颈在专家计算时间 (~0.1ms)
5. 负载均衡分析
5.1 负载均衡前提
- 专家分布: 256个专家均匀分布在所有GPU上
- Token分布: 每个token随机选择8个专家
- 路由策略: 基于sigmoid评分的top-k选择
5.2 负载均衡效果
- Prefill阶段: 每GPU处理524,288个tokens,负载相对均衡
- Decode阶段: 每GPU处理32个tokens,负载非常均衡
5.3 负载不均衡的影响
- 计算时间: 最长路径决定整体延迟
- 通信时间: 最大通信量决定通信延迟
- 资源利用率: 负载不均衡导致资源浪费
6. 优化策略
6.1 通信优化
- 流水线并行: 重叠通信和计算
- 通信压缩: 减少传输数据量
- 拓扑优化: 优化节点间连接
6.2 计算优化
- 专家缓存: 缓存常用专家到本地
- 动态路由: 根据负载动态调整路由
- 批处理优化: 优化expert batch size
6.3 内存优化
- 梯度检查点: 减少内存占用
- 专家分片: 将大专家分片到多个GPU
- 内存池: 复用内存缓冲区
7. 性能指标
7.1 吞吐量
- Prefill阶段: 受限于All2All通信带宽
- Decode阶段: 受限于专家计算能力
7.2 延迟
- Prefill阶段: ~7.7ms (通信2.5ms + 计算5.0ms + 其他0.2ms)
- Decode阶段: ~0.11ms (通信0.005ms + 计算0.1ms + 其他0.005ms)
7.3 效率
- 通信效率: Prefill阶段通信开销占32%,Decode阶段占5%
- 计算效率: 专家利用率取决于路由策略和负载均衡
8. 总结
DeepSeek V3 MoE的通信量分析表明:
- Prefill阶段是通信密集型,总通信量达14GB,主要瓶颈在All2All通信
- Decode阶段是计算密集型,通信量很小(0.0009GB),主要瓶颈在专家计算
- 负载均衡对性能至关重要,特别是在Prefill阶段
- 专家并行策略需要根据阶段特点进行优化
这种设计充分利用了MoE的稀疏性,在保证模型质量的同时实现了高效的并行推理。