大语言模型训练面临的挑战
随着模型参数量规模的增大,资源和效率逐渐成为制约模型训练的核心因素。
按照摩尔定律的预测,芯片的集成度每 18~24 个月便会增加 1 倍,这意味着单位计算性能大约每两年翻 1 倍。当模型参数量不超过 10 亿个时,对资源的需求未触达单机硬件的极限。然而,随着大语言模型技术的进步,模型的参数量每年增长约 10 倍,很快透支了处理器的富余算力。另外,处理器的存储资源并未遵循摩尔定律的增长规律,其集成度仅呈线性增长趋势。因此,大语言模型天然地对训练工程提出了多机分布式要求。
要实现大语言模型的分布式训练,首先要关注的问题是怎么切分数据。在传统的分布式系统设计中,根据数据是否有冗余,存在副本与分片两种基本模式。在大语言模型的训练中,模型参数和训练样本都是要被切分的对象。根据数据冗余情况、切分内容、切分方法等划分标准,训练工程提出了数据并行、模型并行、流水线并行、张量并行等不同的分布式技术。这些分布式技术,或提高模型训练的参数规模,或提高训练过程中计算资源的利用效率,最终达到加速训练的目的。
在解决了基本的模型与数据切分后,大语言模型的预训练和微调仍无法在几个小时内完成。训练大语言模型需要投入巨大的资源。以 LLaMA2 模型为例,训练参数量规模为 70B 的模型需要投入累计 170 万卡时,相当于 1,000 张卡训练 70 天。大量的资源投入会引起边际效用的下降,因此,提高资源投入的边际效用也是训练工程关注的重要课题,常见做法是尽量消除系统中各级传输的瓶颈。在长时间的大规模训练中,软件或硬件故障不可避免,集群故障的及时发现和恢复速度对训练效率有很大的影响。此外,监控与容灾也是大语言模型训练工程需要特别关注的技术。
大语言模型训练优化秘籍
分布式训练技术解决了大语言模型训练面临的两个最主要的问题——模型参数量大和训练数据量大。如果要保障端到端训练的吞吐量,就还有需要优化的问题,如 I/O 优化、通信优化和稳定性优化。
I/O 优化
大语言模型训练场景下的 I/O 优化有一些常规方法,如增加进程数量以提升数据并发处理效率,通过数据预获取(Prefetch)降低等待时延,优化内存(如 Pin Memory)以提升复制效率,等等。这些方法在深度学习框架中通常都有内置的支持,也可以通过配置进行完善。
还有一些需要关注的 I/O 问题,如训练数据量比较大,通常有几 TB 到几百 TB,这对存储的要求比较高,既需要大存储容量,又需要高吞吐性能。需要高吞吐性能的原因是大语言模型需要多节点并行训练,并且每个节点都需要频繁访问存储、加载训练数据,节点越多,对吞吐性能的要求就越高。除此之外,需要具备足够的容错能力。这对于现有的存储系统是比较大的挑战。具体的优化方案有以下两种。
优化方案一:高可用的大容量存储服务 + 本地缓存。 这种方案适用于训练数据量为 TB 级别的情况,本地缓存(当前磁盘容量通常都是 TB 规格)可以完全满足存储需求。训练数据对于模型性能的重要性不言而喻,因此,高可用(容错能力)的大容量存储是必要条件。本地缓存可以很好地满足数据的高吞吐需求。训练开始前,要先通过数据预热将训练数据同步至各个计算节点的本地缓存。由于一次模型训练过程通常包含多轮,因此,初始数据预热占用的同步时间在整个训练过程中的占比很低,而且本地缓存不受节点数量增加的影响,可以保证每个节点具有同等的吞吐性能。本地缓存数据加速过程包括数据预热和加载数据两个关键步骤。
- 数据预热: 大容量存储服务,将训练数据分发至所有计算节点的本地缓存。
- 加载数据: 计算节点从本地缓存读取训练数据,无须访问远程大容量存储。
数据预热时需要将一份数据快速分发到多个计算节点。传统的做法是:设置一定的并发量,每个计算节点分别从远程中心存储加载数据。这种方式的中心存储很容易成为瓶颈,效率不高。可优化为采用 P2P 链式分发,即部分节点先从中心存储获取数据副本,当这些节点得到完整副本后也变成数据服务,并向其他节点分发数据。这样做效率更高,性能可提升数倍。
优化方案二:高可用的大容量存储服务 + 高性能的分布式缓存。 前者需满足容量和容错能力的需求,后者解决本地缓存容量过小的问题,同时满足高吞吐性能。该方案适用于训练数据量为几十 TB 到几百 TB 的场景,若本地缓存容量过小,在这类场景中将无法存放完整的训练数据。因为训练数据的使用规律是每轮只使用 1 次,且每轮都对数据进行随机打乱(Shuffle),所以本地缓存的数据难以被复用。分布式缓存利用训练节点的本地缓存组成一个大的分布式缓存服务,解决本地缓存容量过小的问题,并通过以下两点满足对吞吐量的要求。
- Read-Through 读取: 在读取数据时优先从本地缓存中读取,速度最快。
- Read-Neighbour 读取: 如果在本地缓存中检索不到数据,则从邻居节点中读取,其速度优于直接从远程读取。
通信优化
大语言模型训练通常需要多机、多节点并行计算,合理的通信优化能有效地提升训练吞吐量。不同的分布式并行技术对通信带宽的要求不同,因此,针对不同的硬件环境,需要选择最适合的分布式并行方案,并针对不同的数据量和模型特点做针对性的优化,从而达到最好的通信效率。
首先,需要根据网络条件选择使用哪种并行方案。如果网络是普通的以太网,则多机之间的带宽容易成为通信的瓶颈。首选方案是混合并行(或三维并行)。将需要高通信量的数据并行和张量并行安排在单机内,这样可以充分利用单机内的高速通信(如 NVLink)。然后,多机之间采用流水线并行,这样多机之间只需要同步中间结果,通信量远小于模型权重参数。次选方案是分层 ZeRO3 方案。相比于原生 ZeRO3 方案,前者可以降低网络通信瓶颈的影响。该方案利用单机内的高速通信,只在单机内切分权重参数,可有效降低权重参数同步的时延。由于多机之间需要进行梯度同步,因此能明显观察到通信时延的影响。虽然混合并行方案比流水线并行方案的性能好,但是需要深入适配模型代码,实现难度较高。虽然流水线并行方案的性能不如混合并行方案,但是更容易实现,且性能优于原生 ZeRO3 方案。混合并行方案和流水线并行方案的扩展性都受限于单机的计算能力,模型参数量的规模不能随着机器数量的增加而无限扩展。


