为什么需要分布式训练?
大家有没有想过这样一个问题:即如何在拥有数百万到数十亿个参数的复杂模型上训练TB级别的数据?这些模型的规模可能变得非常庞大,甚至在单个处理器的内存中无法容纳。因此,采用传统的方法来训练这类模型是不切实际的。我们需要寻找其他解决方案来支持这种内存密集型的任务。分布式训练就是其中之一。接下来,我们将更正式地探讨它是什么,以及如何借助它来应对这些挑战。
在深度学习领域中,当尝试解决复杂的问题,涉及图像、音频或文本等内容时,通常需要使用复杂架构的模型,以获得更好的性能。这些模型在训练过程中可能需要计算 和存储数百万甚至数十亿的更新权重参数,这可能导致显存容量不足。此外,单卡的训练需要经过很长的时间,在此期间可能出现训练过程中断的现象。
什么是分布式训练?
数据并行
数据并行Data Parallelism(DP)
使用All-reduce算法时,所有的工作节点将它们的梯度发送到一个主节点,然后主节点执行规约操作。然而,这种方法主要存在两个问题:
分布式数据并行(Distributed Data Parallelism )
Fig. Ring-Allreduce
模型并行(Model Parallelism)
我们已经讨论了如何在多个设备上使用不同的数据块来分发数据和训练模型,通常情况下,这种方法是有效的且易于实现。然而,在一些不太常见的情况下,模型的规模可能对于任何单个节点来说都过于庞大,这时我们需要考虑模型并行性。模型并行主要分为两种并行模式,一种是层间并行,通常被称为管道并行(Pipeline Parallelism)
层间并行(Pipeline Parallelism)
层间并行是一种比较常见的模型并行方式,它的是在模型层与层之间进行切分,也被称为inter-layer parallelism。顾名思义,就是把模型的不同层分别放到多个GPU上。如下图所示,一个四层的模型如果使用层间并行分别在GPU 0和GPU 1上运行,每个GPU只需要按照先后顺序存两层即可。
层内并行(Tensor Parallelism)
促进信息化建设发展