近年来,随着数字化时代的到来,云计算、大数据、人工智能等技术的快速发展,集群分布式技术越来越受到人们的关注和重视。在互联网应用快速扩张的背景下,集群分布式技术具有高适用性、可扩展性...
未来已来!集群分布式引领下一个时代
2023-12-05

未来已来!集群分布式引领下一个时代

为什么需要分布式训练?

        大家有没有想过这样一个问题:即如何在拥有数百万到数十亿个参数的复杂模型上训练TB级别的数据?这些模型的规模可能变得非常庞大,甚至在单个处理器的内存中无法容纳。因此,采用传统的方法来训练这类模型是不切实际的。我们需要寻找其他解决方案来支持这种内存密集型的任务。分布式训练就是其中之一。接下来,我们将更正式地探讨它是什么,以及如何借助它来应对这些挑战。

        在深度学习领域中,当尝试解决复杂的问题,涉及图像、音频或文本等内容时,通常需要使用复杂架构的模型,以获得更好的性能。这些模型在训练过程中可能需要计算 和存储数百万甚至数十亿的更新权重参数,这可能导致显存容量不足。此外,单卡的训练需要经过很长的时间,在此期间可能出现训练过程中断的现象。

        然而,将任务分布到多台机器上时,可以充分利用线性代数运算的并行性质,将大型模型分散到多台机器上进行训练。此外,可以引入容错机制,以确保即使其中一台机器发生故障,训练过程也不会完全终止,可以在没有明显损失的情况下继续训练。


什么是分布式训练?


通常情况下,当面对一个非常庞大的任务时,通常会将其分解为多个子任务以同时进行。这样做的最大好处是可以节省时间,将一个非常复杂和庞大的任务变得可行。在深度学习中,这种方法被称为分布式训练。更准确地说,在分布式训练中,当工程师需要训练一个巨大的深度学习模型时,他们将训练工作负担分配到多个处理器上,这些处理器通常被称为工作节点。分布式训练通常分为两种,数据并行和模型并行。


数据并行

数据并行Data Parallelism(DP

        经典的DP运算是多个设备上拷贝同一份完整的模型副本,把一个大的数据集划分成与设备相同的数量进行输入,因此每个设备上输入的数据是不一样的,彼此之间可以进行独立的计算,最后所有设备上的梯度会在一个主设备上进行归约操作然后实现参数更新。过程如图所示: 

Fig. DP process


        主节点(master node):负责的是初始化和保存模型参数,接收工作节点计算出的局部梯度、汇总计算全局梯度,并更新模型参数。
        工作节点(worker node)主要功能是各自保存部分训练数据,初始化模型,从主节点上获取最新的参数,并使用训练,再通过部分数据训练梯度上传给主节点。
        主节点汇总计算全局梯度被称为ALLReduce,它是 DistributedDataParallel 用于计算所有进程梯度求和的原始通信 API。它由多个通信库支持,包括 NCCL、Gloo 和 MPI。
        不过,由于 AllReduce 对分布式训练速度有重大影响,通信库已经实现了更复杂、更高效的算法,如ring-AllReduce。 由于一个 AllReduce 操作要等到所有进程都加入后才能开始,因此它被认为是一种同步通信,而不是参数服务器中使用的 P2P 通信。

        使用All-reduce算法时,所有的工作节点将它们的梯度发送到一个主节点,然后主节点执行规约操作。然而,这种方法主要存在两个问题:

  • 存储开销:每个GPU上都会存一份完整的模型,造成冗余。
  • 通讯开销:主节点需要与每一个工作节点进行通信(梯度传输)。

        

分布式数据并行(Distributed Data Parallelism )


        由于DP会遇到通信上的瓶颈,DDP就很好地解决了这个问题。为了稳步提高深度神经网络模型的性能,有必要扩展模型训练,以便利用更多计算资源来使用更大的训练数据。Pytorch的DDP模块可用于在多个 GPU 和机器上执行分布式训练。
        DPP允许启动多个进程,并且每个进程占用一个GPU来进行训练。在训练开始之前,每个进程都需要加载相同的模型权重,然后在训练过程中,每个进程加载不同的子训练集进行前向传播和反向传播计算梯度。最后所有进程开始互相通信,目的是为了交换其他进程的梯度,并求平均。DDP采用的是ring-AllReduce通讯方式,每个GPU只与相邻的两个GPU相互通信。如下图所示,GPU 0 只会接收由GPU 4传来的参数,而它也只会把参数传递给GPU 1。最后,当传递的轮数等于使用的GPU数量时,所有的参数就都更新完成。

Fig. Ring-Allreduce


模型并行(Model Parallelism) 


        我们已经讨论了如何在多个设备上使用不同的数据块来分发数据和训练模型,通常情况下,这种方法是有效的且易于实现。然而,在一些不太常见的情况下,模型的规模可能对于任何单个节点来说都过于庞大,这时我们需要考虑模型并行性。模型并行主要分为两种并行模式,一种是层间并行,通常被称为管道并行(Pipeline Parallelism)

        层内并行也被称为张量并行(Tensor Parallelism),另一种是层内并行也被称为张量并行(Tensor Parallelism)。

        层间并行(Pipeline Parallelism)


        层间并行是一种比较常见的模型并行方式,它的是在模型层与层之间进行切分,也被称为inter-layer parallelism。顾名思义,就是把模型的不同层分别放到多个GPU上。如下图所示,一个四层的模型如果使用层间并行分别在GPU 0和GPU 1上运行,每个GPU只需要按照先后顺序存两层即可。

Fig. 层间并行


        Pipeline 并行的优势在于它将深度学习模型的计算任务分解为多个阶段,不同计算设备可以并行执行这些阶段,从而提高计算效率。这适用于计算密集型任务,因为它最大程度地利用了硬件资源,加速了计算过程,同时减少了计算时间和资源浪费。

        层内并行(Tensor Parallelism)


        上面介绍了pipeline parallelism,接下来将介绍一下tensor parallelism。Tensor parallelism是一种并行计算策略,旨在加速深度学习模型的训练。它通过将大型神经网络的张量参数划分成多个块,分配给不同的计算设备,以在多个设备上同时执行计算,从而提高训练速度和模型的扩展性。通常在模型过于庞大,单个设备无法容纳整个模型时,以及为了减少训练时间而采用tensor并行策略。如下图所示,模型会被垂直切分成两份分别放在GPU 0和GPU 1中,然后会通过all-reduce方法来归纳结果。

Fig. 层内并行

        Tensor 并行的优势在于它将模型参数分割成多个分块,每个设备负责处理不同的参数,从而降低内存开销和通信开销。这对大型模型和显存有限的设备非常有利,因为它允许在有限显存条件下训练大型模型,并减少了参数传输所需的通信带宽。这提高了模型的可扩展性和训练效率。这有助于加速深度学习研究和应用的进展,特别是在大规模、计算密集的任务中,如自然语言处理、计算机视觉和强化学习。

促进信息化建设发展


        综上所述,在深度学习领域,为了应对庞大模型和TB级别甚至更高的数据的训练需求,分布式训练成为一种关键解决方案。分布式训练主要分为数据并行和模型并行。数据并行通过在多个设备上复制完整模型,分配不同数据块实现并行计算,然后使用AllReduce等通信方式进行梯度求和。另一方面,模型并行包括管道并行和张量并行,它将模型分割成多块,每块由不同设备处理,以减少显存和通信开销。这些策略提高了训练效率,特别适用于大规模、计算密集的深度学习任务,如自然语言处理和计算机视觉。这些方法推动了深度学习研究和应用在大规模任务中的进展。在数字化时代的浪潮中,通过深入研究和应用集群分布式技术,我们可以更好地满足用户的需求,促进信息化建设的发展。
国家重点专精特新“小巨人”企业——菲特(天津)检测技术有限公司成立于2013年,是一家推进人工智能技术在工业领域智能化应用的企业。
企业专注于光学、人机交互、人工智能等前沿技术研发与创新,迄今已获得知识产权二百余项,独创百余个“在线级”落地应用案例,以汽车行业为起点,致力于为化纺、医药、钢铁等制造行业赋能,可提供包含质量控制,工艺监测,人工智能安全预警,智能分析以及工业垂类大模型等前沿技术,是为工业领域提供智能化解决方案的领军型研发企业。
从汽车零部件到整车厂,凡是涉及质量检测的场景都有菲特的身影,经过十年的实践先后为奔驰、奥迪、比亚迪、大众、广汽本田、红旗等知名车企提供一体化智能制造解决方案并保持长期合作,为制造企业实现真正的降本增效。2

相关资讯:
津ICP备17005157号 津公安备案号12011602000875