MLP通信隐藏

背景与挑战

大模型训练过程中,通信和计算往往存在依赖关系,这样的串行执行顺序会造成计算和通信流存在一定程度的空闲等待时间,导致执行效率较低。

解决方案

对通信和计算算子做更细粒度的切分,保证细粒度间的计算和通信任务不存在依赖关系,是创造并行执行任务的前提。

再对算子调度/执行顺序进行编排,实现计算和通信的并行执行,在计算过程能掩盖中间部分的通信过程。

图1 MLP与通信的掩盖

使用场景

使用方法

开启MLP通信隐藏,该功能将对每个experts进行细粒度切分,对前向和反向的执行顺序进行编排,实现通信和计算之间的掩盖,提高效率。
--moe-model-type deepspeed_moe
--use-pipe-experts
开启--use-pipe-experts后,可单独或同时设置以下特性:
  • 多流水线
    --pipe-experts-multi-stream

    开启后,能够保证ep的alltoall通信和tp的allgather/reduce-scatter之间串行执行,避免集合通信出现链路冲突。

  • 多副本
    --pipe-experts-multi-data N   # N表示使用N份副本

    开启后,能将输入数据切分为多个副本,将不同副本间的计算和通信类比为多个experts的计算和通信。

启用该特性时需注意以下几点:

  • 在开启--pipe-experts-multi-data时,若N过大,导致输入数据切分过细,会引入多余的cast和add算子,导致额外的开销,引起性能恶化。
    • 8机:当num_local_experts = 1时,推荐开启--pipe-experts-multi-data 4来获得最佳性能;当num_local_experts大于1时,不推荐开启“多副本”。
    • 单机:当num_local_experts为1或2时,推荐开启--pipe-experts-multi-data 2来获得最佳性能;当num_local_experts为4及以上时,不推荐开启“多副本”。
  • “多副本”特性主要被用来提供num_local_experts为1时无法进行experts间的细粒度切分的替代方案。虽然兼容num_local_experts大于1的场景,开启后可以进一步提高计算通信掩盖比例,但会新引入cast和add算子操作,当掩盖的收益不足以抵消新引入算子的拖慢时,可能会导致性能恶化。
  • 在未开启--sequence-parallel(SP,序列并行)时,无法开启多流水线--pipe-experts-multi-stream。

使用效果

在特定配置下使用MLP通信隐藏特性,可以带来显著的性能改进。下表是基于实际测试数据的具体效果描述。

表1 配参示例

配置参数

参数值

world_size

64

sequence_len

128k

num_layers

4

recompute_granularity

full

hidden_size

12288

moe_router_topk

2

ep(专家并行度)

4

tp(张量并行度)

8

dp(数据并行度)

2

cp(长序列并行度)

4

pp(流水线并行度)

1

sp(序列并行)

True

总体上,使用MLP通信隐藏特性后,通过减少通信时间、提高设备利用效率,在上述参数配置可以获得5%-6%的计算效率提升。