下载
中文
注册

MLP通信隐藏

背景与挑战

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

解决方案

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

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

图1 MLP与通信的掩盖

使用场景

在local_experts大于等于2时,可以考虑使用专家间的计算通信流水实现通信隐藏的目的。

在local_experts等于1时,即ep = num_expert时,可以考虑使用多副本间的计算通信流水实现通信隐藏的目的。

可开启多流水线--pipe-experts-multi-stream规避集合通信上出现的链路冲突。

使用方法

  • MLP通信隐藏
    --use-pipe-experts

    开启后,将对每个experts进行细粒度切分,对前向和反向的执行顺序进行编排,实现通信和计算之间的掩盖,提高效率。

  • 多流水线
    --pipe-experts-multi-stream

    需要在打开--use-pipe-experts的基础上开启使用。开启后,能够保证ep的alltoall通信和tp的allgather/reduce-scatter之间串行执行。

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

    需要在打开--use-pipe-experts的基础上开启使用。开启后,能将输入数据切分为多个副本,将不同副本间的计算和通信类比为多个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。

需要在保证开启了--moe-model-type deepspeed_moe的前提下,开启--use-pipe-experts才会生效。 进一步,可以在--use-pipe-experts的前提下,单独或同时设置--pipe-experts-multi-stream和--pipe-experts-multi-data N来叠加使用“多流水线”和“多副本”的特性。

使用效果

使用该特性,通过减少通信时间,提高设备利用效率,可总体获得5%-6% 的计算效率提升。