今年以来,伴随着chatGPT的爆火,生成式人工智能和大型语言模型(LLM)在各领域的惊艳表现可谓令人印象深刻。
回想十年前,人工智能还是个蹒跚学步的初生婴儿。一直到2015年,机器识别图像的准确率才首次超过人类。当时的神经网络模型代表ResNet也不过只有25,557,032个参数。
在过去的几年里,神经网络的参数规模以每年10倍的速度增长。2020年左右,亿级参数被认为是大型模型的标志和准入门槛。到了2022年,神经网络基本上得达到千亿级参数规模才能被称之为大模型。如今,最先进的神经网络模型的参数量已经达到175,000,000,000左右的量级。当下最先进的多模态模型不仅可以分类图片,还可以流畅地响应人类的提问和指令,高质量地生成各种文本。
伴随着参数量的攀升,神经网络的训练难度也在不断增大。在ResNet刚出现的时候,训练通常都是在单机单卡或单机多卡的情况下完成,训练时间在几小时到数天之间。当下如果要训练拥有1750亿参数的GPT-3级别模型(3000亿tokens语料数据),按照半精度峰值计算性能折算,使用1块A100(英伟达旗下用于AI训练的GPU)需要32年才能完成训练任务。
当然,现实中就算不考虑时间问题,1块A100也无法训练千亿参数规模的模型,因为模型参数占用已经超过单卡显存容量上限。
所以,为了能够训练更深更大的神经网络模型,研究人员引入了分布式深度学习系统。通过将模型训练任务拆分到多台服务器的多个GPU上,从而使得训练周期从单卡几十年缩短到几十天,这需要至少使用数百台服务器和数千张GPU的大规模分布式训练才能勉强完成需求。
想实现分布式机器学习绝非易事。使用1024块A100在资源利用率为45%的情况下训练GPT-3级别的大模型,仍需要34天左右(这已经是训练效率较高的情况)。大模型的训练不仅有巨大的参数量,还有海量的训练数据要进行学习,需要同时兼顾体量与学习效率。研究人员也为此进行了许多并行策略上的优化。
分布式深度学习中的并行策略
先简单介绍下目前并行策略通常采用的几种模式。
模型并行:指的是将深层神经网络中的不同参数(以及计算)按照逻辑顺序拆分成多个部分的并行方法。这些不同部分会被放置在不同的GPU上,这样一个GPU的输出将被传递给序列中的下一个GPU作为输入。在此过程中,序列中的下一个GPU在收到前一个GPU的更新之前会保持等待状态,确保同一时间只有一个GPU处于活跃状态。在每个训练步完成时,损失和梯度会从后向前逐次传递和更新。
模型并行策略允许训练那些参数量过大,单个GPU难以承载的模型。然而,这种策略也带来了前向和后向传递过程中GPU之间的通信成本。这会导致大量的等待时间,并且计算资源的利用率严重不足。特别是对于大型模型而言,这样的训练效率往往相对较低。
模型并行
数据并行:数据并行是一种将训练数据分配到多个GPU上,然后在每个GPU上维护同一个模型的不同副本的方法。在每个训练步结束时,会对不同GPU的梯度进行平均聚合,随后同步更新所有GPU上的模型参数。然而,这种策略可能会引发大量的GPU间通信,因为每个GPU必须与参与训练的其他每个GPU进行通信以收集结果。
特别是在使用大规模数据集时,数据并行可以显著加快训练速度。然而,当单个显卡无法容纳整个模型时,数据并行策略可能会显得相对受限。在这种情况下,通常需要结合模型并行或流水线并行的方法来达到更好的效果。
流水线并行:为了应对更庞大的模型训练需求,研究人员已经将数据并行和模型并行的方法相结合,采用了流水线并行(Pipeline Parallelism)的策略。
流水线并行
在这一策略中,训练数据集的每个批次(batch)被细分为数个微批次(mini-batch)。以前述模型并行性示例为例,当一个GPU使用第一个微批次进行计算并将结果传递给序列中的下一个GPU时,它并不会闲置等待后续的输入,而是继续处理下一个训练数据集的微批次。这意味着它在进行前向传递和后向传递的通信过程时,不再需要等待上一个步骤的结束。
当然,这种策略的实施也增加了GPU之间的通信成本,因为每个微批次都需要序列中相邻GPU之间的前向和后向传递通信。在每个流水线流程中,依然采用了数据并行的方式。
通过这种方法,研究人员能够更加高效地应对巨大模型的训练任务。流水线并行的方式允许在GPU之间的任务之间实现更好的并行性,从而有效地减少了空闲时间,加速了整个训练过程。当然,这也是以增加通信开销为代价的,但在整体性能的权衡中,这种方法能够更好地应对大规模模型训练的挑战。
张量并行:除此之外还有张量并行,模型和流水线并行技术都在层边界处垂直分割模型。换而言之,把大模型按其网络传播的逻辑顺序进行分割。但是当神经网络大到一定程度,连简单的一层可能都没有办法被显卡所容纳的时候,这个时候就需要张量并行。他是在单个操作或“张量”级别对模型进行分区。这允许更细粒度的并行性,并且对于某些模型来说可以更高效。另外张量并行在数学操作的层面其拆分是等价的。
张量并行
总体来说,上述的并行策略和分布式机器学习,无论如何都会导致单个节点的训练效率下降。这是因为不同训练节点总需要同步和传输训练梯度等信息。随着训练节点数量的增加,单台服务器的训练效率下滑程度也愈加显著。当集群规模扩大到一定程度,诸如网络通信等短板就会成为制约训练进程的另一个瓶颈。因此,分布式训练也不可避免地会遇到所谓的硬件墙。
分布式深度学习的软硬件瓶颈
随着大模型参数量和训练规模进一步扩大,分布式机器学习系统很快也撞上了当前硬件设施的性能极限。一般来说,传统冯诺依曼架构下的计算设备会存在几个瓶颈,计算墙、存储墙、通信墙等。大模型的训练效率的上限其实是由上述三堵墙中最短的那块短板决定的,分布式计算的主要瓶颈则往往在于后两者。
计算墙:指的是单卡算力和训练模型需要的总算力之间的巨大差异。A100的单卡极限算力只有312 TFLOPS,Nvidia性能最高的 H100 GPU可以达到三倍左右的A100的性能,而GPT-3则需要314 ZFLOPs的总算力,两者相差了9个数量级。同时在许多训练工作负载中,由于内存和网络瓶颈,GPU利用率徘徊在 50%左右或更低。
存储墙:指的是计算单元的存储能力有限,其计算效率同时受制于计算能力和与存储单元的通信能力。计算墙和存储墙的本质是有限的单卡能力和模型的巨大的存储和计算需求之间的矛盾。比如单卡无法完整存储一个大模型的参数。GPT-3的1750亿参数本身就需要700GB的显存空间(每个参数按照4个字节计算),而NVIDIA A100 GPU只有80GB显存。这个问题可以通过分布式训练和流水线并行的方式去解决,但分布式训练之后又会遇到通信墙的问题。
通信墙:主要指的是在分布式训练环境下,集群中各计算单元需要频繁进行参数同步,而通信性能的表现将直接影响到整体的计算速度。如果处理不当,通信墙可能会导致随着集群规模的扩大,训练效率反而下降。成功地克服通信墙的挑战,体现在集群具备强大的扩展能力,即集群的多卡加速能力和规模是相互匹配的。多卡的线性加速比成为评估集群多卡加速能力的指标,其数值越高越为理想。
存储墙
对于在计算机领域有一定基础的人而言,冯诺依曼架构应该是非常熟悉的。它包含了输入、输出、计算单元以及存储单元等基本组成要素。然而,随着摩尔定律逐渐接近极限,计算和内存的发展速度正在逐步减缓,但这并不是当前最紧迫的问题。目前,我们所面临的更为迫切的挑战是存储单元与计算单元之间的交互瓶颈。
在冯诺依曼架构中,原本是从存储单元中获取数据,然后将数据传输到计算单元进行处理。目前计算单元的计算速度已经有了显著的提升,而存储单元中数据的读取速度却未能相应地提升。这导致计算单元和存储单元之间出现了一个瓶颈。
在这种情况下,短板效应变得尤为显著,因为存储单元读取速度的限制影响了整体处理速度。尽管计算单元能够迅速处理数据,但由于新数据尚未被读取,计算单元不得不等待,这降低了系统资源的有效利用率。这就是所谓的“存储墙”现象。这一现象不仅广泛存在于内存与GPU之间,也存在于GPU内部的存储和计算单元之间。
冯诺依曼架构示意图
通信墙
通信墙的问题则是集群训练最为头疼的部分。
分布式训练中,各个GPU在机内和机间不断进行通信。服务器内部的显卡之间需要频繁进行信息的交换,服务器与服务器之间也需要大量的信息传递。就拿之前提到的并行策略来说,在模型或流水线并行的过程中,需要通过通信来同步梯度并等待更新完成,这就引入了大量的机内和机间All-reduce操作,这势必带来相当大的时间成本开销。这些都需要软硬件的相应调适与优化,以打造独特的系统架构。
硬件上,在机器学习专用服务器内,常常会设置机内通信利用nvlink,而机间通信则借助高性能网络如IB、RoCE,以确保高吞吐、低时延的通信服务。
数据中心网络中的GPU服务器和GPU结构的概念图
比如,为了获得良好的训练表现,硬件集群结构设计上应具备以下几点:
GPU节点的网络体系应具有较低的端到端延迟。由于存在大量 GPU 间通信,降低节点之间数据传输的总体延迟有助于减少总体训练时间。
该结构应能够实现节点之间数据的无损传输。无损传输是人工智能训练的一个重要标准,因为梯度或中间结果的任何丢失都需要整个训练返回到存储在内存中的上一个检查点并重新开始。这会对训练性能产生不利影响。
系统应具有良好的端到端拥塞控制机制。在任何树形拓扑中,当多个节点向单个节点传输数据时,短暂的拥塞是不可避免的。持续的拥塞可能会增加系统的尾部延迟。由于 GPU 之间的顺序依赖性,即使单个 GPU 的梯度更新通过网络延迟,许多 GPU 也可能会停止。一个缓慢的环节就会导致训练性能下降。
因此,集群服务方会对服务器内部网络连接和集群通信拓扑进行特别设计,按叶/主干或三级CLOS拓扑设计节点间的交换结构,以满足大模型训练对通信的苛刻需求。这一优化措施还将确保在集群网络中,任何需要同步的节点进行通信时的跳数都要尽可能减少,从而为AI训练中的网络流量占比最大的同号卡All reduce操作,提供高吞吐、低时延的网络服务。如果只是传统的网络通信设施,很难发挥出多台机器的训练优势。
软件上看,当涉及到不同的分布式训练并行策略,也就是模型、数据和参数如何拆分,就会引入不同的数据通信需求。通过合理平衡不同频率通信需求之间的分配,减少不必要的参数同步等策略,来优化软件层面的通信效率。也会根据集群的硬件情况,合理调整通信频率与效率。实际中的训练框架里则会有更多更复杂的优化策略。
无论是上层的分布式训练框架与调度系统,还是底层的网络架构,训练集群对应的支持。只有经过专门的设计和精心的优化,方能充分发挥集群整体的计算力量,确保大规模训练时集群的性能和加速效果。
训练集群的综合硬件环境要求
大规模模型训练所面临的挑战远不止前文所提到的三大障碍,它还包括了容错性、灾备等软性要素
在大规模集群的长时间训练过程中,设备故障是不可避免的事件。针对这一情况,训练集群会通过与AI框架联动,采用弹性容错等方法,为大规模模型的长时间训练提供可靠的环境。这意味着需要监测和感知集群中各资源和任务的运行状态,以确保训练过程的稳定。
举个例子,长时间训练可能导致部分显卡过热,进而影响显卡的通信效率,甚至导致显卡无法正常使用。在这种情况下,要能够及时发现并定位问题。此外,集群平台还必须具备出色的容错和灾备能力,能够在出现故障时以分钟为单位定位问题并恢复任务,以将潜在损失降至最低。即使需要牺牲某块显卡,训练过程也能够持续进行。
同时,为了使在集群中运行的AI任务能够充分利用各类高性能资源,训练集群需要进行合理的资源分配。这包括确定AI任务的运行环境,资源对接方式,数据的存储与读取方式,以及GPU通信所依赖的网络设施类型等。在任务运行过程中,还要确保在集群变化时能适时进行资源和任务的调度,以保持系统运行的高效性。
此外,还必须综合考虑构建系统的总成本、功耗以及散热冷却成本等多方面因素。尤其是散热方面,2020年英伟达发布A100时,热设计功耗接近400W,到了最新的H100芯片,热设计功耗直接飙升到700W,预计到明年,单颗高性能AI芯片的热设计功耗将会突破1000W。正如当下业内所说:AI的尽头是散热。
更进一步,甚至需要思考训练集群在面对极端灾害时的适应能力。前不久,某北京高校的服务集群就因设置位置不合理,在北京遭遇降水洪涝时不幸被淹。为了预防这种情况,规划时应当尽量考虑将集群设置在非低洼地区,以防止洪涝等灾害的发生。目前在我国,甚至已经出现了海底数据中心,将训练和服务集群建设在海底,兼顾防灾和散热的要求。
英伟达H100
这些都清楚地表明,智能算力集群的软硬件体系构建是一项极其复杂的任务。高性能集群并不是GPU和算力设备的简单堆积,在今天想迈进大模型训练的门槛,需要面临非常多的软硬件挑战。
在策划和设计智能算力集群时,必须考虑的因素众多,涵盖了经济、环境、安全等多个层面。除了追求高性能和高效率,还需要确保系统的可靠性、稳健性以及在不可预见情况下的适应性。这意味着构建智能算力集群需要从多个角度进行综合权衡,以达到一个理想的平衡点,从而实现可持续、高效、安全的运行。
文章2023年9月1日发表于微信公众号 海兰云UDC (人工智能的瓶颈,并不只有GPU),风云之声获授权转载。
风云之声
科学 · 爱国 · 价值
继续阅读
阅读原文