大规模深度学习模型的高效训练:综述(下)

。。。继续

在这里插入图片描述
介绍23年4月的综述论文“On Efficient Training of Large-Scale Deep Learning Models: A Literature Review“,京东、悉尼大学和中科大的合作。

优化为中心的高效训练

从优化的角度将当前加速训练的思路总结为以下几个方面:

学习率。学习率是非凸优化的一个重要超参数,也是当前深度网络训练的关键。像Adam及其变型这样的自适应方法在深度模型方面取得了卓越的进展。一些基于高阶梯度调整学习率的策略也有效地实现了加速训练。学习率衰减的实施也会影响训练过程中的表现。

大批次量。采用大批次量将有效地提高训练效率。它直接减少了完成一个epoch训练所需的迭代次数。同时,由于其额外的内存利用率和通信瓶颈,处理一个大批次比处理具有相同样本总量的几个小批次要花费更少的成本。

有效的目标(objective)。原始ERM在最小化问题中发挥着关键作用,这使得许多任务能够被实际应用。随着对大型网络的深入研究,一些工作更加关注优化和泛化之间的差距,并提出了减少测试误差的有效目标。他们从不同的角度解释了泛化的重要性,并在训练中对其进行了联合优化,显著提高了测试的准确性。

平均权重。加权平均是一种实用的技术,可以增强模型的泛化性。它考虑了具有一组冻结或可学习系数历史状态的加权平均值,这显著加快了训练过程。

学习率

学习率是控制训练中更新的最重要的超参数之一。它应该通过联合考虑优化器和批次量来精心选择。从适应策略的实施角度,将其分为三种类型,即缩放的系数、逐单元自适应和基于矩阵的预条件器。它们分别采用单个值来衰减学习延迟,采用向量来平衡梯度,采用矩阵来搜索最优。

一般的学习率调度器采用单一的衰减系数,逐渐降低学习率来学习训练数据集的细粒度知识。

自适应学习率侧重于梯度所有维度的元素自适应。它认为梯度的每一个元素都与重要性不同的目标有关,并且应该被视为局部标量。它有助于更精确地控制学习率,并可用于多个大型任务。已经设计了各种基于自适应性的优化器,以从不同角度提高其效率。

自适应优化器在大模型训练方面取得了重大进展。之前几项工作都是基于Hadamard乘积采用逐元素标量。它有效地稳定了大批次量的训练过程,并且通常比基于一般梯度的方法收敛得更快。在未来,将逐阶段和逐层与冻结技术相结合,为优化器的设计提供了新见解。

预条件器通过矩阵来微调学习率。除了一阶梯度方法的优势之外,预条件器还涉及高阶导数,主要包括hessian和Fisher矩阵(FIM)。经典的牛顿方法采用hessian算法实现最优收敛,有效地加快了训练速度。目前,虽然这种方法在大模型训练中还不是主流,但其中一些技术和见解值得利用。

预条件器看作上实现最优收敛的学习率矩阵投影。由于计算的复杂性,它还没有在大模型上有效地工作。设计一个具有一阶计算复杂度的预条件矩阵来加速大型模型的训练,是未来的一个重要目标。并且,平衡优化和泛化的目标可能会提供更多新见解。

大批次量训练

适当地采用大批次量训练可以减少时间消耗,提高存储的利用率,生成平滑的梯度,并保持稳定的训练过程。然而,过大批次量的训练会适得其反,这可能会极大地损害训练的稳定性,甚至导致分歧,尤其是在大模型上。

为了实现大批次量训练,避免泛化性能差,现有的一些解决方案侧重于联合微调学习率和批次量,包括随批次量的扩大让学习率的线性缩放,在初始阶段采用学习率的预热,和逐渐增加训练批次量。此外,对数据的额外增强和所提出的高效优化器也可以支持大批次量训练,这提高了泛化性能并加快了训练过程。

对于高效的分布式系统,使用类似于梯度累积的思想,通过在多台机器之间并行划分梯度计算来减少训练时间,并且需要解决学习率、优化器和通信等问题,从而在跨设备训练中实现高效的并行性。

效率目标

目标始终是优化中最重要的因素之一,这是想要针对任务进行优化的原则。优化目标直接决定了最终目标和训练效率。

经验风险最小化(ERM)是统计学习理论中的一个原则,它定义了一系列学习算法,并用于提供其性能的理论界限。在解决最小化的机器学习任务中,各种优化方法已经得到了显著的发展。然而,它在平衡优化效率和泛化误差方面并不占上风。由于优化目标和期望目标在实践中存在偏差,ERM的紧张度较低,在泛化性表示上缺乏准确性。因此,联合考虑效率和稳定性,一系列修正目标提出来作为全局目标[216]。除了广泛使用的优化器,如SGD、Adam等,分层自适应速率缩放(LARS)也是一种通用的方法,旨在使用大型微批次进行训练。它允许不同的模块或层采用自适应学习率,而不是固定的学习率。细粒度的调整有效地缓解了大型微批次的局部过拟合。

目标改进考虑了普通ERM中更多的见解和实际问题。如何表示泛化的差距和错误正成为未来值得研究的研究课题。结合经验评估方法,在合理的搜索空间内,使用大规模搜索来找到最优优化器,显示出显著的效率。

模型平均

模型平均是通过几个历史状态生成泛化有效模型的重要技术。生成的模型通常显示出比训练模型更高的测试精度。平均模型不需要训练,仅用于测试,这不会在计算和内存利用率方面带来额外成本。

模型平均值来自Anderson加速[1258],在随机非凸优化方面取得了良好的进展。模型平均有助于在训练过程中接近一组更好的广义状态。尽管这些方法没有直接参与优化更新,但它们在泛化方面的显著改进有助于提前停止参数可比的训练。它大大减少了所需的训练时间。在高效训练领域,其实际应用是一项很有前途的研究。

学习率选择方面的最新进展表明,自适应是以可接受的额外计算成本保持高效率的正确方法,这得益于梯度不同维度上的逐元素标量。需要注意的一个主要问题是,平方动量的标量可能会导致学习率急剧下降,从而导致收敛速度减慢。预条件器的应用是引入曲率校正的一种很有前途方法,这可能会造成快速收敛。然而,在实际训练中,尤其是在大模型上,更新预条件器的成本高昂。同时,不准确的曲率方向可能会将优化误导到局部最小值。大批次量训练显示出对超参选择的强烈依赖性。高效大批次训练的解决方案,通常调整其他超参或设计新目标。这两条路线侧重于加速优化过程,这有助于实现更好的收敛。

另一种场景更注重提高泛化效率。以前的许多工作都研究了优化和泛化之间的差距,并提出在平坦损失面上搜索合适的状态。基于有效的平坦度测量策略,已经提出几个目标,增强大模型的泛化性并取得巨大成功。尽管不能忽视一些额外的计算消耗,但这种基于目标的改进仍然非常有效。与目标设计相比,模型平均是一种简单有效的提高泛化性的方法。它可以在不引入任何额外计算成本的情况下实现有效加速,并在训练的中期显示出巨大的潜力。随着训练的完成,它的改进最终消失。

总之,未来优化为中心的发展包括以下方向:

精细的自适应学习率。在训练大模型时,进一步平衡由不稳定梯度引起的偏差有助于实现更高的效率。考虑曲率信息来构造用于细粒度调整的低成本预条件矩阵是值得探索的,这可能有助于在训练中适应更大的批次量。

对训练模型的泛化性进行有效测量。采用几种测量方法来评估局部稳定性和平坦性,例如hessian的顶部特征值、梯度范数、邻域中的最差状态,并在训练加速度方面取得了很大的效率。探索低成本的表示有助于改进具有高泛化性的训练过程。同时,利用合理的奖励和策略来寻找更新公式的最佳组合,显示出提高训练效率的巨大潜力[28]。

平均模型的训练参与度。具有良好泛化性能的平均模型可以被认为是下一次迭代的更好初始状态。设计更好的优化算法来充分利用这种聚合状态,将是一个很有前途的方向。

有预算的高效训练

最近,一些工作专注于用更少的资源训练深度学习模型,但尽可能实现更高的准确性。这类问题被定义为有预算训练,即在给定预算下进行训练(对可衡量成本的限制),实现最高的模型性能[134183]。为了系统地考虑硬件支持以更接近真实情况,我们将有预算训练定义为给定使用设备和有限时间进行训练,例如,在单个低端深度学习服务器上训练一天[68104],获得具有最佳性能的模型。对有预算训练的研究可以揭示如何为有预算训练制定训练诀窍,包括决定模型大小、模型结构、学习率时间表的配置和其他影响绩效的几个可调因素,以及结合符合可用有预算的高效训练技术。

数据

从数据的角度来看,有预算训练侧重于数据集的预算分配和与数据相关的算法。Kaplan[110]表明,模型性能与以下三个因素之间存在幂律关系:非嵌入模型参数的数量N、token中的训练数据集大小D和非嵌入计算量C。然而,对于相同数量的计算C,在N和D之间存在权衡,例如,较大的模型每单位计算处理较少的数据。Kaplan[110]提出,在模型大小和训练中处理的数据量之间存在最优预算分配。他们证明,在固定的计算预算(术语“计算预算”指的是计算总量)内,通过训练非常大的模型并在收敛前提前停止,可以获得最佳模型性能。Hoffmann[93]显示了不同的结果,并提出在给定计算预算的情况下,训练中处理的数据tokens的数量应与模型的大小相等,而不是像以前的工作那样只缩放模型,但保持训练数据量不变。他们表明,经过充分训练的较小模型可能会在训练不足的大模型中表现出色,他们通过训练语言模型Chinchilla(70B参数,4倍多的数据)来检验这一假设,该模型比具有相同计算预算的另一个大语言模型Gopher(280B参数)获得了更好的得分。上述工作总结了在固定预算下决定数据集大小的经验定律。

此外,Steiner[231]研究了训练数据量、AugReg(数据增强和模型正则化)、模型大小和计算预算之间的相互作用。他们表明,用AugReg和较小的数据集训练但有更多计算预算的模型,达到了与更多数据训练的模型相同的性能。对于有限的数据场景,Chen[25]提出了一种数据高效的GAN训练方法,该方法用真实图像的小训练集从原始GAN中识别可训练的稀疏子网络(“中奖票”[64])。然后,用相同的有限数据集以及数据和特征级增强技术对该子网络进行进一步训练。他们的框架是对真实图像数据增强方法的补充。此外,Zhao[302]提出了用于GAN训练的可微分增强(DiffAugmentation),该方法将可微分增强技术应用于真实样本和生成样本,这提高了稳定性和收敛性能,在训练数据有限的情况下尤其有效。应该注意的是,用于数据处理的几种技术是计算密集型的,例如数据增强和重要性采样,在给定的计算预算中使用这些技术时会带来权衡。Arazo[4]研究了在固定迭代次数的带预算训练中重要性采样和数据增强的相互作用,表明充分的数据增强比重要性采样方法具有更好的性能,并造成加速。

模型

在给定计算预算的情况下,可以导出模型参数的最佳数量和数据量,Kaplan[110]建议在中等数据上训练非常大的模型,并在收敛前提前停止。Geiping&Goldstein[68]、Izsak[104]还证明,训练大模型而不是小模型,适合低预算情况。类似的发现得到了Li的支持[142],其提出了一种训练策略,该策略训练更大的模型(更宽、更深)并提前停止,然后通过量化和修剪对其进行大量压缩,而不是训练更小的模型,直到以相同的预算收敛。较大的Transformer模型,比起较小的Transformer模型,收敛得更快,并且压缩更具鲁棒性。此外,训练大模型还有其他好处,例如Wei[272]表明,模型扩展可以为语言模型带来额外的(涌现)能力。在决定了模型的参数数量后,仍然可以找到并优化模型的有效架构,加快带预算训练或提高性能。

Izsak[104]研究了使用单个低端深度学习服务器在24小时内对类似BERT的掩码语言模型进行预训练。他们提出了一种训练方法,使用稀疏token预测(仅预测掩码tokens)[149]训练大模型。在RTX 2080Ti上训练24小时的预算与Izsak设定的预算相似[104]。

Geiping&Goldstein[68]证明,从注意块的QKV投影中消除偏差并禁用所有线性层偏差可以提高计算效率。他们还研究了在注意和FFN块[5]之前应用层归一化(LN),使用门控线性单元[221]可以提高性能。最近,Pan[185]从模型结构的角度观察到,Transformer模型在不同的训练阶段表现出不同程度的冗余。他们提出了一个带预算训练框架,在固定预算下控制模型结构的激活率,主要是注意头的数量、MLP的隐藏维度和训练过程中视觉tokens的数量,调整每个模型复杂度级别的持续时间。

优化

Izsak[104]展示了几个重要的超参数,用于优化预算训练中的性能,包括批次量大小、峰值学习率、学习率的预热比例和训练天数。带预算训练中的超参数配置与大规模模型框架不同,需要进行调整以适应固定预算。为了找到最佳的超参数配置,可能需要在估计的超参范围内用不同的超参进行几次测试。此外,一些研究侧重于有效的训练计划。Li[134]提出了带预算训练设置,并表明可以采用新的学习调度器(普通线性调度器)来提高性能,特别是对于小预算的情况。Chen[24]提出了学习率调度的新函数和采样率的组合,通过从给定函数中采样来更新学习率。他们表明,在低预算环境中,他们的时间表优于线性时间表。

带预算训练的总体方案

总体方案应包括配置关键超参,并建立一个包含多种有效训练技术的训练流水线。为了启动带预算训练,决定几个对最终表现有重大影响的超参是很重要的。总计算预算可以基于有限的训练时间和所使用设备的计算能力来估计。在此之后,可以基于经验定律[93110]或现有配方来确定模型大小和训练数据tokens的数量。为了确定参数的最佳配置,可以实验观察早期训练结果并选择最佳参数集。在数据层面,在确定数据集的大小后,可以收集适当数量的高质量数据,并应用必要的处理,例如数据增强技术。在模型层面,尽管缩放定律[110]表明,一旦模型大小固定,改变模型结构只会产生有限的性能改进,但随着某些模型结构的改变,计算效率仍然可以提高[68]。

在优化器级别,还有一些超参,如学习率规划的峰值学习率和预热比例,这些参数应该基于现有公式或通过超参搜索来确定。应该引入有效的优化器来调度学习率[24]或模型结构[185]。最后,从系统的角度来看,适合给定预算的有效技术可以合并到现有的方法中。针对给定硬件优化的技术可用于提高系统性能,例如离线分割数据集和加载RAM[104]以减少磁盘I/O瓶颈,以及使用磁盘序列化[184]来节省RAM。这些技术可以帮助提高系统的吞吐率,并在不损失精度的情况下实现总体加速。此外,可以将DeepSpeed[205]等框架添加到模型中,以实现ZeRO(零冗余)优化器[202]、自动混合精度训练和融合实现。综合起来,这些技术可以提供一个有效的训练方法。如下表总结预算训练的技术:

添加图片注释,不超过 140 字(可选)

权衡的思想,即为另一方的利益牺牲一方,在预算训练中发挥着重要作用。例如,已经开发出通过时空权衡来减轻记忆限制的技术。此外,鉴于训练预算有限,影响模型性能的不同技术和超参之间往往存在权衡。当这些参数单独缩放时,或者当有效的技术中单独使用时,它们通常可以提高模型性能。但是,在固定的计算预算下,需要在这些超参和假定的密集型技术之间进行权衡。

几项系统研究审查了各种训练配置,为实践中的权衡提供了经验建议,并提出了有效的预算分配方案[93,110]。问题是,结论可能仍然是片面的,即仅对特定范围内的参数有效,或者结论给出了有偏差的定律,因为它们只是从实验中得出的经验定律。这些定律可能仍然需要未来的工作来训练更多的模型,在新的设置中验证它们,这将比遵循现有模型训练的配置来获得良好的结果产生更多的成本。从小规模、低预算的训练机构开始,决定一个有效的预算训练方案,然后扩大规模,这似乎相对可行。另一个可能有价值的想法是设计更多的预算-觉察训练组件,即可以根据剩余预算调整参数的训练组件,例如最近一些研究中提出的学习率调度器[24]。

未来对带预算训练的研究侧重于以下方向:

实际基准。研究一个相同且实用的预算基准,例如,在低端GPU服务器上进行一天的训练[68104]。研究人员在不同配置下进行系统研究的成本太高(如[93,110,231])。相反,对于相同的实际预算,未来的工作可以遵循现有的训练方法,并引入进一步的优化。

具有预算-觉察的调度程序。有效的学习率时间表[24]等算法可以根据剩余预算进行调整,这有助于快速收敛并提高性能。更多能够动态响应剩余预算的技术仍有待开发。

系统为中心的高效训练

讨论在如下方面:

  • 以系统为中心的数据效率。高效的数据处理和数据并行是系统实现中的两个重要因素。随着数据集的快速增加,低效的数据处理逐渐限制了训练效率,尤其是在多节点的大规模训练中。设计更硬件友好的计算方法和并行化可以有效地避免训练中的时间浪费。
  • 以系统为中心的模型效率。随着模型参数量的急剧增加,从模型角度来看,系统效率已成为重要的瓶颈之一。大模型的存储和计算效率给硬件实现带来了巨大挑战。高效的部署I/O和简化模型并行性的实现,加快实际训练。
  • 以系统为中心的优化效率。优化过程表示每次迭代中的反向传播和更新,这是训练中最耗时的计算。因此,实施以系统为中心的优化直接决定了训练的效率。为了清楚地解释系统优化的特征,我们关注不同计算阶段的效率,并回顾每个过程的改进。
  • 开源框架。高效的开源框架有助于将训练作为移植算法设计和硬件支持的桥梁。

数据效率

在多个GPU的情况下,可以使用数据并行性来加快计算速度。在数据并行的情况下,每个节点都有一个模型的副本,获取不同的数据碎片,然后执行前向和后向计算以获得梯度。在集中式架构中,这些节点将其计算的梯度发送到参数服务器,参数服务器聚合参数,更新模型,并将参数发送回每个节点。相反,在去中心化架构中(在深度神经网络训练的情况下更常见),每个节点在执行多节点通信后更新其相应的模型权重部分。随着模型越来越大,分布式训练成为一个工程问题,训练者需要优化分布式策略以及网络通信和内存。例如,在多个GPU上训练PyTorch模型可以通过简单地修改代码以使用torch.nn.DataParallel来完成。然而,当大批次量训练大模型(如语言模型)时,有必要平衡GPU负载,例如,通过进一步分配损失准则计算来避免收集结果的服务器节点过载。

高效库为训练过程提供了坚实的支持。当数据集较小时,所有数据样本都可以在训练前存储在计算设备中,这不会在数据I/O上花费额外成本。然而,随着深度神经网络的快速发展,数据集的大小呈几何级数增长。如此庞大的数据量导致它们被存储在本地存储器上,并且样本在参与训练时被分批交替读取。在实际场景中,数据加载器并不是严重的瓶颈(通常低于总数的10%)。每个框架中的传统数据加载器都使用多线程在CPU中执行数据I/O和预处理,这需要有保证的内核数量。

模型效率

硬件设计和算法设计是相辅相成的过程。对于研究人员来说,基于他们对模型的理解,可以根据设备的内存、计算和通信特性,如CPU、GPU和其他硬件架构,优化计算和内存的算法。

Channel Last是一种高效的存储格式,可作为训练中4D NCHW张量的替代方案。这种方法逐像素存储张量,将通道作为最后一个维度。在混合精度训练下,在张量核上以通道-最后格式训练的模型可以增加训练吞吐量[61]。另一种有效的方法是采用量化的低精度来存储和计算张量。混合精度训练[166]是一种在单GPU和多GPU情况下都有效的技术,混合使用单精度和半精度浮点格式来加速网络训练过程。当使用FP16,即半精度浮点数来存储权重和梯度时,增加吞吐量同时减少内存使用和访问,可以加速训练。同时,存储在优化器步中随权重梯度更新的权重FP32主副本,主要保持单精度训练实现的网络精度。混合精度的使用允许在给定硬件上训练更大的模型或批次量。BF16[263]是一种与FP16不同的半精度格式,它可以表示更大范围的浮点数以提高稳定性,使用它代替FP16可以获得更好的结果[331225]。

稀疏训练也是高效训练的一个很好的解决方案。在模型中有很多关于稀疏性的工作,但在现实世界中,稀疏计算需要硬件支持,否则很难实现加速。幸运的是,先进的硬件设计引入了对稀疏性的更多支持,例如NVIDIA的Ampere GPU架构,该架构在其矩阵数学单元(即张量核)中引入了对稀少性的支持,该张量核利用2:4(50%)稀疏性模式[170],实现了致密数学的两倍数学吞吐量。基于结构化修剪的方法在CPU和GPU架构中利用硬件的稀疏性,并有利于模型扩大[105]。为了实现适合硬件的结构化稀疏性,Ma[157]提出了面向基于块修剪(HRBP)的硬件友好重分组,这在反向传播中保留了提取的密集块。

对于超大规模的模型,模型并行是一种期望的方法,它可以通过增加计算资源来有效地减少训练时间。对于不能放在单个GPU卡上但可以放在多GPU服务器上的大型模型,或者对于消耗大量GPU内存的模型操作(例如,具有大量分类的softmax),可以使用张量并行(也称为层内并行度或模型并行)来减少内存使用并平均计算。在张量并行中,模型的一些特定权重、梯度和优化器状态在设备之间分配,原始张量的每个分切都在其指定的GPU上,并在分布式设置中进行计算。

优化效率

优化对应于反向传播和参数更新过程,这是训练中耗时最大的计算。这对加速至关重要。受反向传播机制的影响,传统范式在优化过程中的操作空间相对有限。因此,训练效率的主要决定因素之一是实现有效的底层优化过程的能力。

重实现是一种在计算图中重建实体的技术,可以有效地避免特定的冗余。它通常会更改梯度计算。梯度检查点[26](重实现)可用于重建计算图,该图在反向传播期间释放中间输出并重新计算正向结果,恢复释放的张量。再实现也可以手动实施,如Touvron[253]所示在LLaMA的有效实施中。为了提高训练效率,重建图而不是使用autograd重新实现反向传播,从而存储线性层的输出。这个过程降低了激活的成本,在反向传播过程中重计算是昂贵的。

流水线并行是一种有效的并行技术,它将进入的批次分解为小批次(这减少了流水线气泡),并将模型的层划分为多个GPU,从而创建一个流水线,其中每个阶段,即一组连续层,将前一阶段的结果作为输入,并将结果传递到下游,允许不同的GPU并行地参与计算过程。它具有最低的通信量,并且可以跨节点进行调度。最先进的系统[229]使用减少通信、增加局部性和并行性的组合来提高训练效率。Huang[100]提出了Gpipe时间表,其中只有当一个批次的全部正向通过(F-then-B)时,才会执行反向通过。Narayanan[173]提出了一种一前一后的调度机制(1F1B),Narayanans[174]展示了具有交错阶段的1F1B调度,其中每个设备被分配多个子层(称为模型块),而不是一组连续层,这在时间和空间上都比F-then-B更高效。单个GPU的有限内存限制了它可以容纳的最大模型规模以及GPU利用率。为了进一步增加模型大小以获得更好的准确性,现有的开源框架通常提供模型并行库,以帮助在多个节点上高效地分发和训练模型,从而提高最佳分布式训练的准确性和吞吐量。这些框架集成了并行训练和聚合通信库(如NCCL),使研究人员能够通过调整现有的训练设置来解决训练的瓶颈。

融合实现采用了重用计算单元的高效性。这些基本优化可以通过组合操作来减少内存I/O并提高计算效率。例如,内核融合是指将多个操作组合到一个内核中,以提高性能和数值稳定性。通过使用NVIDIA GPU的nvFuser等深度编译器,研究人员可以将多个神经网络层融合到一个CUDA内核中,并可以重建CUDA算子,有效利用GPU的计算单元,进一步减少内存I/O。这些方法大大有助于整体加速。例如,NVIDIA Apex[178]实现了一些常见优化器的融合版本,如Adam,它避免了多次往返GPU内存,并且比PyTorch中的实现更快。PyTorch最近的2.0版本提供了torch.compile,它可以使用OpenAI Triton编译器生成性能良好的代码,以及自定义的手写内核和专用的CUDA库。

高效的通信在加速训练中非常重要,尤其是在大规模训练中。跨多个节点的通信总线效率成为主要瓶颈。即使在单个节点中,CPU和GPU之间的大量通信仍然会导致严重的障碍。在大规模分布式深度学习训练中,重要的是关注GPU之间的通信效率,GPU在单机上通过PCIe或NVLink进行通信,在多台机器之间通过Socket(以太网)或InfiniBand(带RDMA)进行通信,节点内通信带宽高于节点间通信带宽。现有的算法和系统可以被优化以提高通信效率。例如,1-bit压缩[218]将梯度量化为每个值低至1 bit来减少通信。Tang[245]提出了1 bit-Adam,它与基于非线性梯度的优化器Adam一起工作。Lu[155]提出0/1 Adam,解决Adam在应用激进的1-bit量化和局部步的非线性挑战,与1-bit Adam基线相比,其实现更高的训练吞吐量和端到端训练时间缩短。Markov[162]提出了一种名为CGX的通信框架,该框架支持用于数据并行训练的压缩通信。此外,还可以探索更好的并行策略,实现高效通信。数据并行、张量并行和流水线并行是三种常用的并行策略。例如,Narayanan[174]展示了如何组成数据、张量和流水线并行,以扩展到数千个GPU。

Rajbhandari[202]提出了零冗余优化器(ZeRO),这是目前训练大模型的重要技术。ZeRO优化内存中的冗余模型状态(即优化器状态、梯度和参数),方法是将它们在处理器之间划分为三个相应的阶段,并优化通信,最终的模型状态在每个节点上平均分配。在划分优化器状态和梯度的第2阶段(ZeRO-2)上,构建了ZeRO Offload[209],它将两种状态的数据和计算卸载到CPU,从而利用CPU来节省GPU内存。然而,由于GPU内存有限,存储在GPU内存中并在所有设备上复制的参数量仍然有限,次优数据分区和有限的PCIe带宽需要大批次训练以提高效率。此外,Rajbhandari[203]展示了ZeRO Infinity,这是一种异构系统技术,它在多个设备上并行利用CPU和NVMe内存(便宜、缓慢但巨大),为当前GPU集群聚合有效带宽。目前的大规模深度学习模型通常达到10B甚至100B的参数,如GPT3[18](175B)、MT-NLG[229](530B)。训练这样的大模型通常需要综合使用数据并行性、张量并行性、流水线并行性、混合精度训练和类似ZeRO的分布式优化器,也称为3D混合并行性。通常,具有最大通信量的张量并行性在单个节点内被优先考虑。如果可能的话,数据并行性也被放置在节点内以加快梯度通信,或者被映射到附近的节点。

开源框架

JAX[16]是一个用于机器学习的库,它结合了AutoGrad(一种自动微分库)和XLA(加速线性代数,一种线性代数编译器),并提供与NumPy相同的API,与GPU和TPU兼容。对于深度学习,特别是在使用TPU的情况下,基于JAX的库(如Flax[86]和Haiku[90])提供了深度学习功能,JAX对hessian的高效计算也值得考虑。JAX和Haiku中有一个用于并行TRansformer的Mesh Transformer JAX[259]库。此外,谷歌最近发布了使用基于JAX库Scenic[43]的ViT-22B。

DeepSpeed[205]是一个用于大模型训练的开源PyTorch库,提供零冗余优化器(Zero)[202,203,209]和3D并行度等,并用于BLOOM(176B)[215]和MT-NLG(530B)[229]训练。DeepSpeed的数据高效库[132]结合了课程学习和随机分层tokens丢弃技术(random LTD)[286]。最近,微软推出了TorchScale开源工具包[158],用于扩展Transformer。

Meta Research的FairScale[58]是一个PyThorch扩展库,它提供分布式训练技术,如模型并行性(包括FullyShardedDataParallel、FSDP)、激活检查点、梯度累积、梯度裁剪等,提高内存使用率并加快训练过程。FairScale还包括一些优化器和调度器,如Adascale(大批量优化器)、FusedAdam、FusedSGD等,提高训练大模型的稳定性和效率。另一个库Fairseq[181]提供了一系列序列到序列和语言模型的实现,如Transformer、RoBERTa[149]等,还提供了一些用于数据预处理和训练的工具。还有xFormers[128],一个Transformer构建块库,支持Transformer的可组合结构。PaddlePaddle平台[160]是一个百度为并行分布式深度学习设计的框架,支持各种深度学习硬件。随后清华大学的ERNIE[235]相关开发工具包和一系列工作涵盖了许多训练技术。

有一些提供了整个过程的全面操作平台。Megatron-LM是NVIDIA开发的大型Transformer库,具有高效的训练框架。此外,NVIDIA维护Apex[178]工具库,用于混合精度和分布式训练。MosaicML的Composer[247]是一个用于有效训练的PyTorch库,它为训练过程的每个部分创建了一个接口,允许在训练流水线中内置或自定义各种加速方法,以开发有效的训练配方。字节跳动LightSeq[267268],一款高效的Transformer推理和训练引擎。由快手和苏黎世联邦理工学院ETH开发的Bagua[66],是PyTorch的深度学习训练加速框架。香港的Colossal-AI[11],它提供了一系列并行组件来构建和训练分布式AI模型。除了上述1D张量并行外,Colossal- AI[11]平台还集成了2D、2.5D、3D张量并行策略[12260282]和序列并行(sequence parallel)[135],进一步分配计算和内存负载并优化通信成本。EleutherAI GPT NeoX[2],一个用于训练大规模语言模型的库,构建了200亿参数模型GPT-NeoX-20B[13]。Ray[206],一个用于扩展人工智能和Python应用程序(如机器学习)的开源框架。

Howard&Gugger[96]建立的fastai深度学习库,为研究人员提供高级别和低级别的组件,构建最先进或可配置的方法。OpenBMB BMTrain[180],一个用于高效训练大模型的大模型训练工具包。OneFlow-LiBai[143],这是一个大规模的开源训练工具箱,提供3D并行分布式训练和其他训练技术。华为得MindSpore[168],一个人工智能计算框架。Horovod[220]由LF AI和数据基金会主办,这是一个分布式深度学习框架。

总之,我们整理了如下表,总结每个框架库的好处,并清楚地显示了它们对高效训练的主要贡献。正如所提到的,训练大模型需要全面使用通用的技术。已经设计了几个深度学习框架,为训练加速提供有效支持。专注于有效的实施,这有助于实现更高的效率。随着长期的发展,更多的技术仍在出现和探索中。

添加图片注释,不超过 140 字(可选)

在以系统为中心的数据处理方面,关键路线包括高性能数据处理和数据并行。随着数据集的快速增长,训练数据样本的预处理变得复杂而繁重。这对大批次量训练的发展是非常不利的。当数据处理时间与训练消耗不匹配时,训练过程进入等待状态,导致效率非常低。越来越多的研究倾向于减少通信并保持数据处理的本地化,从而产生高效的处理和并行性。同样的想法也应用于模型级别。

与数据处理不同,模型通常存储在计算设备上。因此,不得不面对大模型部署的挑战。一系列基于量化压缩的技术和混合精度模型有效地保证了训练加速。此外,在大规模训练中,分布式架构的优化也有助于提高模型的计算效率。除了数据处理和模型部署,优化过程的硬件支持是实践训练中最重要的部分。当前的主流技术路线围绕着重建计算图上的高效计算、阶段训练的流水线并行性、高效优化器的融合实现以及跨多节点和多设备的高效通信。图和流水线确定了硬件计算的简化计算流程,通信效率解决了训练中系统挂钟时间冗余的问题。在硬件系统的良好支持下,可以最大限度地发挥算法的效果。

未来将在以下研究方向上看到曙光:

局部数据处理。可以充分利用GPU设备中高效的并行计算来实现大批次量训练中的数据正则化等预处理。有一些高效的库可以实现这一技术,但它还没有完全普及。许多操作仍有待发现。

垂直模型部署。随着模型大小的增大,计算设备的局限性将变得更加明显。同时,由于梯度的链式规则,大模型中单个模块的计算无法完全并行化。多节点多设备的垂直训练研究成为一个值得探索的方向。垂直训练的优化算法也有望得到进一步的研究。

新高效范例。开发新高效范式可以进一步加速大模型的训练。它应该共同考虑每个单独模块的加速技术及其潜在的相互作用和冲突,这可以有力地实施设计的有效训练框架。例如,考虑到大规模边缘计算设备,在去中心化设置中协同训练模型也是未来一项有前景的研究[289]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值