分布式训练的主要难点
随着模型规模和集群规模的扩大,通信在训练过程中的占比越来越大。为了更直观地展示这一现象,我们对比了未应用计算通信重叠技术时的时间线图。第一张图突出显示了在实现数据并行(DP)重叠前的通信状态,第二张图则展示了张量并行(TP)重叠前的情况。
从图中可以看到,在端到端的训练过程中,DP 的通信占比实际上超过了 15%,而 TP 的通信时间占比也超过了 30%。因此,减少通信对训练的影响,对提升训练效率至关重要。
混合并行方案简介
简单介绍一下混合并行中经典的三种并行方案:
- 数据并行(Data Parallelism, DP):将数据分割到不同的计算设备上,由这些设备完成各自的计算任务。
- 张量并行(Tensor Parallelism, TP):将模型中某些层的参数分散到不同的设备上,每个设备负责完成部分的计算工作。
- 流水并行(Pipeline Parallelism, PP):将模型的不同层切分到不同的计算设备上,类似于流水线的工作方式,各个设备协同完成整个模型的计算过程。
大模型训练在超大规模集群下的挑战与解决方案
DP Overlap 优化
DP overlap 的方案在理论上看起来非常吸引人,但实际应用中,我们真的能显著提升训练效率吗?在进行 DP overlap 优化时,我们遇到了三个主要问题:
- 通信和计算资源之间的竞争:当通信和计算操作同时进行时,它们会争夺有限的硬件资源,这可能会影响整体的系统性能。
- PP Bubble 问题:在混合并行场景下,DP overlap 还可能带来 PP bubble 的问题。
- 网络拥塞:不同通信资源的争抢还可能导致网络拥塞。
PP Bubble 问题的解决
DP overlap 引入的 PP bubble 问题在于负载不均衡。如果我们模仿 ZeRO 的调度策略,由于 overlap 计算的时间会长于 none overlap 计算的时间,这种负载不均衡会导致 PP bubble 的产生。即 Micro batch 2 的前向传播和 Micro batch 1 的反向传播较长的现象,这展示了负载不均的情况。
我们提出的解决方案是通信时机的纵向对齐。这样可以极大地缓解 PP bubble 的问题。同时需要强调的是,从计算 overlap 部分移出来的通信都被放在了 PP bubble 上,因此它不会产生任何额外的影响。这种策略有助于平衡负载,减少因通信和计算不匹配而产生的效率损失。
下图展示了最终优化后的 timeline。在这个优化版本中,我们实现了 reduce-scatter 与反向传播的 overlap,同时 all-gather 操作与前向传播也实现了 overlap。此外,我们通过分桶通信、网络预测控制、通信 CHANNEL 调优以及通信时机的纵向对齐等方法,大幅优化了 DP 的通信开销。
TP Overlap 优化
我们可以将这种策略推广到四个 rank 的场景中。为了简化表述,我们将计算的 stream 都合并到了一起。对于 all-gather overlap GEMM,我们会特别关注第一个 rank。
第一步,我们使用自己持有的那部分输入来进行计算,同时将自己持有的内容也发送给其他 rank,并接收其他 rank 中持有的那部分输入。接下来的第二步、第三步、第四步都是按照相同的原理进行。通过这种方式,我们就可以得到一个 all-gather 的 overlap 流程。这样,每个 rank 都在进行本地计算的同时,与其他 rank 进行数据交换,实现了计算与通信的重叠。这种策略可以有效地减少等待时间,提高资源利用率,从而提升整体的并行计算效率。
Reduce scatter 的操作也是类似的。我们可以首先关注 rank 4 在整个计算结果流程中的作用。在第一步中,rank 4 的计算结果被放置在 rank 1 上。rank 1 完成自己的计算后,在第二步中,它会将这个结果发送给 rank 2。rank 2 在接收到来自 rank 1 的结果后,会将其与自己的计算结果进行累加,然后继续进行下一步的计算。接着,在第三步和第四步中,流程与前两步相同。rank 3 和 rank 4 也会按照这个顺序接收之前 rank 传递的结果,并与自己的计算结果进行累加。最终,在流程的最后,rank 4 将拿到汇总后的最终结果。
通过上述步骤,我们得到了一个完整的解决方案,适用于处理通信和计算存在依赖关系时的通信计算重叠问题。
这是 TP overlap 的整体解决方案。对于计算通信没有依赖的情况,这里是指 column-wise linear 的反向传播。由于这部分操作没有数据依赖关系,我们采用了 bulk overlap 技术。对于其余的通信和计算,因为它们之间存在依赖关系,我们采用了 split pipeline overlap 的方法。
下图展示了实现 TP overlap 后的 timeline,我们可以看到 TP 的通信和计算重叠在了一起。同时,我们进行了两项优化措施:第一项是使用了 peer-to-peer memory copy,以此来减轻通信对 SM 的消耗。第二项优化是将计算分散到不同的 stream 上,这样计算也可以实现部分的重叠。


