本文是对ICLR 2024的论文《ZERO BUBBLE (ALMOST) PIPELINE PARALLELISM》的解读,该论文作者来自新加坡Sea AI Lab团队。在大规模分布式深度神经网络训练中,流水线并行是关键组成部分之一,但其效率常常因不可避免的流水线气泡(bubble)而受损。该论文提出了Zero Bubble Pipeline Parallelism,一种全新的流水线并行方式,用以将流水线中的气泡降至几乎为零,同时又保持深度神经网络同步训练的语义。实验评估表明,在相似的内存限制下,该论文方法在吞吐量上比1F1B调度高出最多15%;当放宽内存限制时,这一数字可以进一步提高到30%。该论文基于Megatron-LM的源码已经开源在GitHub。
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。分布式模型训练领域已经成为深度学习社区的焦点,尤其是随着越来越大和复杂的模型的出现。训练这些巨型模型通常需要大量GPU通过各种拓扑结构互联。在过去几年中,已经提出了多种并行化技术来训练深度神经网络(DNN)。数据并行(DP)由于其简单性,成为了中小型模型的默认策略。但当模型达到一定规模后,就无法再将模型参数装入单个GPU,这时模型并行就派上了用场。模型并行主要有两种方案:张量并行(TP)和流水线并行(PP)。TP将一层的矩阵乘法分配到多个设备,而PP将整个模型划分为不同的阶段,这些阶段可以在不同的设备上处理。值得注意的是,ZeRO通过跨设备分片参数提供了模型并行的强大替代方案,同时保留了数据并行的简单性。最近的研究表明,在大规模训练场景中获得最佳性能需要DP、TP和PP策略之间的复杂交互。在丰富的互联资源(如同一计算节点内GPU之间的NVLink)条件下,DP、TP和ZeRO的混合策略效果良好。然而多项实验证据表明,PP在利用跨服务器连接,尤其是数千个GPU规模时特别有优势。
图1:1F1B流水线并行
这也突显了该论文工作的主要目标:提高PP的效率。在深入研究PP的复杂性时,其实现效率在很大程度上取决于设备空闲时间的多少,这被称为流水线气泡。由于层之间的依赖关系,气泡似乎是不可避免的。一个早期的著名工作是GPipe,它通过增加流水线中的并发批次数来尝试减少气泡比例,但直接后果是峰值内存需求增加。为了解决这一问题,GPipe在反向传播过程中丢弃部分中间激活,并在需要时重新计算。然而,这种方法引入了约20%的计算开销。有一类改进GPipe的工作集中在异步PP上,包括PipeDream和PipeMare。异步PP理论上没有气泡,大大提高了流水线效率,但牺牲了精确的优化语义。另一方面,也有在同步设置下的改进策略。一种比较著名的调度策略改进是1F1B。它最早由PipeDream在异步设置下提出,后来被引入同步设置下。1F1B通过提前调度反向传播提供了更快的内存释放。在相同的微批次数下,它产生了类似的气泡比例,但在峰值内存方面具有显著优势。基于1F1B,Narayanan等人引入了Interleaved 1F1B策略,通过将多个阶段分配到同一设备上,进一步减少气泡大小,但代价是增加通信量和更高的峰值内存。
尽管做出了各种努力,直到今天,剩余的气泡仍然是同步训练语义下PP面临的最大问题。在这项工作中,我们发现通过在更细粒度上表示和调度计算图可以进一步优化PP。经典的深度学习框架是以层为粒度设计的,而现代的深度学习编译器则使用不同的中间表示进行不同层次的优化。尽管更细的粒度意味着更大的搜索空间,但由于缺乏优化工具来探索这一空间,往往难以实现很好的效果。表1:每个transformer layer不同部分的FLOPS和激活值的显存需求
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。传统上,神经网络以层为单位进行粒度划分,每一层都有两个相关的函数:前向(forward)和反向(backward)。在前向传播中,输入x通过参数化映射f(x, W)转换为输出y。反向传播对于训练至关重要,涉及两个计算,分别为计算输入x和层参数W的梯度。为了方便,该论文用单字母B和W分别表示这两个计算,F表示前向传播(如图1所示)。传统上,B和W被组合为一个反向函数提供给用户。这种设计对用户来说概念友好,并且在数据并行中效果良好,因为第i层权重梯度的通信可以与第i-1层的反向计算重叠。然而,在流水线并行中,这种设计不必要地增加了顺序依赖的计算,即第i-1层的B依赖于第i层的W,这通常不利于流水线的效率。基于对B和W的拆分,该论文提出了新的流水线调度方案,大大提高了流水线的效率。首先,不妨假设B和W两部分的计算基本等同,这在transformer等深度神经网络情况下也大体成立(见表1)。基于这一假设,该论文手动设计了三种流水线并行方式,分别为ZB-H1、ZB-H2和ZB-V。图2:手动设计细粒度流水线调度方案(上:ZB-H1,下:ZB-H2)
其中,ZB-H1假设和1F1B使用基本相同的显存容量,通过细粒度调度,能使流水线气泡数量降低至约1F1B的1/3。ZB-H2放宽了这一假设。ZB-H2假设在同样的微批次(micro batch)数量下,可以使用1F1B两倍的显存容量,则可以实现理论上几乎零流水线气泡。具体流水线调度方案如图2所示,相关分析见表2。表2:1F1B和两种手动设计的流水线方案显存消耗比较
在该论文的扩展版本中,还借鉴Interleaved 1F1B类似的思路,设计了仅需要消耗和1F1B类似的显存容量,即可以实现理论上几乎零气泡的流水线并行方式ZB-V,如图3所示。其大致思路为,对于p个设备,将模型参数按照层切为2p个块。其中前p个块按照设备编号依次分配,后p个块按照设备编号逆序分配,形成一个“V”字形。例如对于16层的transformer模型在4个设备上进行流水线并行训练时,1-2层和15-16层分给设备1,3-4层和13-14层分给设备2,依次类推。这样在同样显存容量下,实现了几乎零气泡流水线并行。但是代价也是通信开销会相比1F1B翻倍,和Interleaved 1F1B类似。图3:ZB-V流水线并行调度方案(每个设备被分配了两个模型块,白色数字代表第一个模型块的计算,黑色数字代表第二个模型块的计算)
除此之外,该论文还讨论了假设B和W不一样,并且有通信开销等其他时间时,在给定显存容量限制等参数后,如何自动搜索出几乎零气泡流水线并行的算法。另外该论文还介绍了如何使优化器(optimizer)变为异步执行。一般情况下,优化器都可以异步执行且不损害同步语义,如果出现很少触发的特殊情况,该论文还提出了无须存储过多状态,直接in-place回滚更新的机制来保证同步语义(图4)。具体详见论文。图4: 后验证策略取代同步优化器更新
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。为验证方案效果,该论文测试了不同流水线并行方案使用不同微批次数量训练一个类GPT-3模型的吞吐(图5),其中1F1B-I表示Interleaved 1F1B,ZB-1p和ZB-2p可看作ZB-H1和ZB-H2的自动搜索微调优化版本。可以看到,ZB-2p一直性能最佳,即使微批次降低一半(保持和1F1B一样的显存用量),也明显比1F1B更好,非常接近理论性能上限。ZB-1p在小模型时和Interleaved 1F1B实现类似性能,当模型增大后,ZB-1p减少气泡数量和减少通信开销的优势就更加明显。图5: 不同流水线并行方案的吞吐比较
此外,该论文还展示了搜索出来的理论零气泡流水线并行方案和实际执行结果的比较(图6),结果实际结果和搜索估计结果高度一致。更多实验,例如扩展版本中关于ZB-V的实验,详见论文。图6:一个搜索出来的ZB-2p方案(上)和实际测试出来的执行结果(下)
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。该论文提出了一种新策略,通过将反向计算拆分为激活梯度计算和参数梯度计算,提高了流水线并行的效率,并且该论文设计了一种自动流水线调度算法,能够在不同的内存预算下最小化流水线气泡率。由该算法生成的调度方案在各方面始终优于1F1B,甚至接近于零气泡率。为了进一步减少内存消耗,本论文提出了一种名为ZB-V的新调度机制,当前向计算、激活梯度计算和参数梯度计算时间相同时,可以实现零气泡,并且保持与1F1B相同的内存限制。该论文方法的另一个优势是能够在较少的微批次数下(通常3倍于设备数量)实现最优效率,这意味着更多的微批可以在数据并行维度上划分,从而提高大型模型训练的可扩展性。
编辑:吴秉阳
原文作者:Penghui Qi*, Xinyi Wan*, Guangxing Huang, Min Lin