分布式训练 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

分布式训练

开始使用分布式训练

如果您熟悉分布式训练,请访问首选策略或框架的链接之一以开始使用。否则,请继续下一部分以了解一些分布式训练概念。

SageMaker 分布式训练库:

基本分布式训练概念

SageMaker的分布式训练库使用以下分布式训练术语和功能。

数据集和批处理

  • 训练数据集:用于训练模型的所有数据。

  • Global batch size (全局批处理大小):在每次迭代中从训练数据集中选择以发送到集群中的 GPUs 的记录数。这是在每次迭代时对其计算梯度的记录数。如果使用数据并行度,则它等于模型副本的总数乘以每个副本的批次大小:全局批次大小 = # model replica x 每个副本的批次大小。在机器学习文档中,单个全局批处理大小批次通常称为小批次。

  • Per-replica batch size (每副本批处理大小):在使用数据并行度时,这是发送到每个模型副本的记录数。每个模型副本都会对此批次执行向前和向后传递以计算权重更新。在处理下一组每个副本的批次之前,将跨所有副本同步(平均)生成的权重更新。

  • 小批量:小批量的子集;如果使用了混合模型和数据并行度,则它是每个副本大小的批处理的子集。当您使用 SageMaker 的分布式模型并行度库时,每个微批次将逐一馈送到训练管道中,并遵循由库的运行时定义的执行计划

培训

  • Epoch:整个数据集中的一个训练周期。每个纪元通常有多个迭代。您在训练中使用的纪元数在模型和使用案例上是唯一的。

  • 迭代:使用全局批次大小的批(小型批次)训练数据执行单个前向和后向传递。训练期间执行的迭代次数由全局批处理大小和用于训练的纪元数决定。例如,如果数据集包含 5000 个样本,并且您使用全局批处理大小 500,则完成单个纪元需要 10 次迭代。

  • 学习速率:影响为响应模型的计算错误而更改权重的数量的变量。学习速率在模型收敛能力以及收敛的速度和最佳性中发挥着重要作用。

实例和 GPUs

  • 实例:AWS 机器学习计算实例。这些也称为节点

  • 集群大小:在使用 SageMaker的分布式训练库时,这是实例数乘以每个实例中的 GPUs数。例如,如果您在训练作业中使用两个 p38xlarge 实例,每个实例有 4 个 GPUs则集群大小为 8。虽然增加集群大小可以缩短训练时间,但必须优化实例之间的通信;否则,节点之间的通信会增加开销并降低训练时间。SageMaker 分布式训练库旨在优化 AWS ML 计算实例之间的通信,从而提高设备利用率和训练时间。

分布式训练解决方案

  • 数据并行度:分布式训练中的策略,其中训练数据集跨多个处理节点(如 AWS ML 实例)拆分,并且每个处理节点包含模型的副本。每个节点接收不同的训练数据批次,执行向前和向后传递,并与其他节点共享权重更新以进行同步,然后再转到下一个批次并最终转到另一个纪元。

  • 模型并行度:分布式训练中的策略,其中模型跨多个处理节点(如 AWS ML 实例)分区。模型可能很复杂,并且具有大量隐藏图层和权重,使其无法容纳单个节点的内存。每个节点都保存模型的子集,通过该子集共享和编译数据流和转换。在 GPU 利用率和训练时间方面,模型并行度的效率在很大程度上取决于模型的分区方式以及执行计划用于执行前向和后向传递。

  • 管道执行计划管道执行计划):管道执行计划确定在模型训练期间跨设备执行计算(微批处理)和处理数据的顺序。管道传输是一种在模型并行度中实现真正的并行化以及通过让 GPUs 在不同数据样本上同时计算来克服因顺序计算而导致的性能损失的技术。要了解更多信息,请参阅管道执行计划

示例

以下示例演示了如何使用这些术语来描述使用混合模型和数据并行度的训练作业:

2-way数据并行度和 4-way模型并行度训练作业以 64 个图像的全局批处理大小启动。此训练作业共需要 8 个 GPUs。每个模型副本处理每个副本 32 个大小的批次。在前向和后向过程中,每个副本的批次进一步分为多个微批次。使用管道执行计划以交错方式处理这些微批处理。

训练数据集包含 640 个图像,因此单个纪元进行 10 次迭代。

高级概念

在训练模型时 Machine Learning (ML) 实践者通常会遇到两个扩展挑战:扩展模型大小扩展训练数据。虽然模型大小和复杂性可以提高准确性,但您可以放入单个 CPU 或 GPU 的模型大小存在限制。此外,扩展模型大小可能会导致更多的计算和更长的训练时间。

并非所有模型都能够同等地处理训练数据扩展。某些算法需要提取内存中的所有训练数据以进行训练。它们仅垂直扩展,并且可扩展到更大和更大的实例类型。某些算法的缺点是,它们与数据集大小超线性扩展。例如,最近邻点搜索 N 行数据集的所有记录的计算负载以 N 平方为单位进行缩放。在大多数情况下,扩展训练数据会导致更长的训练时间。 

深度学习 (DL) 是包含多个人工神经网络层的特定机器学习算法系列。最常见的训练方法是使用小批量随机梯度下降 (SGD)。在小批量 SGD 中,通过对其系数进行较小的迭代更改来训练模型,从而减少其错误。这些迭代在称作小批量的训练数据集的相同大小子样本上进行。对于每个小批量,在小批量的每条记录中运行模型,测量其误差并估算误差的梯度。然后,在小批量的所有记录中测量平均梯度,并提供每个模型系数的更新方向。训练数据集的一个完整传递称为纪元。模型训练通常包含数十到数百个纪元。Mini-batch SGD 具有多种优势:首先,其迭代设计使得训练时间在理论上与数据集大小成线性关系。其次,在给定的小批量中,每个记录由模型单独处理,无需记录间通信,但最终梯度平均值除外。因此,小批量的处理特别适用于并行化和分布。 

通过在不同的计算设备中分发小批量的记录来并行处理 SGD 训练称为数据并行分布式训练,是最常用的 DL 分配范例。数据并行训练是一种相关的分配策略,用于扩展小批量大小并更快地处理每个小批量。但是,数据并行训练的额外复杂性在于,必须计算具有来自所有工作人员的梯度的小批量梯度平均值,并将梯度传递给所有工作人员。一个名为 Allreduce 的步骤,该步骤可表示开销不断增加,因为训练集群是扩展的,如果不正确地实施或通过不当的硬件减去来实施,该步骤也会对训练时间进行大量惩罚。 

数据并行 SGD 仍然要求开发人员能够在计算设备(如单个 CPU 或 GPU)中至少适应 模型和单个记录。在训练非常大的模型(例如,自然语言处理 (NLP) 中的大型转换器)或基于高分辨率图像的分段模型时,可能会发生这种不可行的情况。分解工作负载的一种替代方法是在多个计算设备上对模型进行分区,这是一种名为 > 模型并行分布式训练的方法。

策略

分布式训练通常拆分为两种方法:数据并行和模型并行。数据并行是分布式训练的最常见方法:您有大量数据,对其进行批处理,并将数据块发送到多个 CPUs或 GPUs节点),由神经网络或 ML 算法处理,然后合并结果。神经网络在每个节点上都相同。模型并行方法与大型模型一起使用,这些模型无法放入一个节点的内存中,它会分解模型并将不同的部分放在不同的节点上。在这种情况下,您需要将批量数据发送到每个节点,以便在模型的所有部分上处理数据。

网络模型这两个术语通常互换使用:大型模型实际上是具有许多层和参数的大型网络。使用大型网络进行训练会生成一个大型模型,并使用所有预训练参数及其权重将该模型重新加载到该网络中 将大型模型加载到内存中。当您拆分模型以跨节点拆分它时,您还会拆分底层网络。网络由层组成,要拆分网络,您可以将层放在不同的计算设备上。

跨设备意外拆分层的常见缺陷是严重 GPU 未充分利用。训练在前向和后向过程中本质上是顺序的,在指定的时间,只有一个 GPU 可以主动计算,而其他 GPU 则等待发送激活。现代模型并行库通过使用管道执行计划来提高设备利用率来解决此问题。但是,只有 SageMaker Amazon SageMaker 的分布式模型并行库包含自动模型拆分。库的两个核心功能(自动模型拆分和管道执行计划)通过做出自动化决策来简化实施模型并行度的过程,从而高效地利用设备。

什么是“较好”:数据并行或模型并行?

尽管数据并行训练的名称,但它确实是并行计算,而模型并行训练更类似于序列化计算。如果您的模型可以放入内存中,则可以使用数据并行训练,并且应该这样做,因为训练速度更快。但是,这并非始终可行,因此对于大型模型,您必须使用模型并行训练。模型并行流的某些部分可以并行处理,但网络的某些部分会限制其他部分,需要您等待网络以串行方式处理完数据。但是, SageMaker的模型并行度库使用复杂的管道传输,使库能够通过让设备在不同微批处理上同时进行计算来并行处理工作。这将接近真正的并行度,即使基础模型包含顺序的、非并行的计算步骤。

在数据并行和模型并行之间进行选择

从数据并行方法开始。如果您在训练期间内存不足,则可能需要切换到模型并行方法。但是,在尝试模型并行训练之前,请考虑以下替代方法:

  • 更改模型的超参数。

  • 减小批处理大小。

  • 持续减小批处理大小,直到它适合。如果您将批处理大小减小到 1,但仍用尽内存,则应尝试模型并行训练。

尝试梯度压缩 (fp16、fp8:

  • 在 NVIDIA TensorCore 附带的硬件上,使用混合精度训练可加快速度并减少内存消耗。

尝试减小输入大小:

  • 如果您增加序列链接,需要减小批处理大小或向上调整 GPUs 以分布批处理,请减小 NLP 序列长度。

  • 降低图像分辨率。

检查您是否使用批处理标准化,因为这会影响收敛。当您使用分布式训练时,您的批次将跨 GPUs 进行拆分,并且批次大小低得多的效果可能是更高的错误率,从而中断模型与合并的过程。例如,如果您在批处理大小为 64 的单个 GPU 上为您的网络制作了原型,然后扩展到使用 4 个 p3dn.24xlarge您现在有 32 个 GPUs您的每 GPU 批处理大小从 64 个降至 2 个。这可能会影响您看到的使用单个节点的收敛。

在以下情况下,从模型并行训练开始:

  • 您的模型不适合在单个设备上。

  • 由于您的模型大小,您在选择较大的批次时遇到了限制,例如,如果您的模型权重占用了大部分 GPU 内存,并且强制您选择更小、次优的批次大小。 

要了解有关SageMaker分布式库的更多信息,请参阅以下内容:

要了解有关这些技术的更多信息,请参阅以下文章:

优化分布式训练

为您的使用案例和数据自定义超参数,以获得最佳扩展效率。在下面的讨论中,我们重点介绍了一些最有影响的训练变量,并提供了对最新实施的参考,以便您了解有关您的选项的更多信息。此外,我们建议您参考首选框架的分布式训练文档。

批处理大小

SageMaker 分布式工具包通常允许您在更大的批次上进行训练。例如,如果某个模型适合单个设备,但只能使用小型批处理大小进行训练,则通过使用模型并行训练或数据并行训练,您可以试验更大的批处理大小。

请注意,批处理大小通过在每次迭代时控制模型更新中的噪声量来直接影响模型准确性。增加批处理大小将减少梯度估计中的噪声量,从非常小的批处理大小增加时,这会很有用,但会导致当批处理大小增加到大值时降低模型精度。 

提示

调整超参数,以确保在增加批处理大小时,您的模型训练到满足的收敛。

已开发一些在批处理增加时保持良好的模型收敛的技术。

Mini-Batch 大小

在 SGD 中,小批量大小用于量化梯度估计中存在的噪声量。小型批量会导致非常噪的小型批量梯度,这不代表数据集上的真实梯度。大型小批量导致小批量梯度接近数据集上的真实梯度,并且可能没有足够—噪点,无法在不相关的最小空间中保持锁定状态。

Scenarios

以下部分介绍了您可能希望扩展训练的场景,以及如何使用 AWS 资源来执行此操作。

从单个 GPU 扩展到多个 GPUs

机器学习中使用的数据量或模型大小可以创建您愿意等待的训练模型的时间较长的情况。有时,训练完全不起作用,因为模型或训练数据太大。一种解决方案是增加您用于训练的 GPUs 的数量。在具有多个 GPUs 的 实例上,如具有 8 个 GPUsp3.16xlarge的 ,数据和处理将在 8 个 GPUs 间拆分,并在训练模型所需的时间生成接近线性的加速。它需要的时间稍多 1/8,而在一个 GPU p3.2xlarge 上需要的时间。 

实例类型 GPU
p3.2xlarge 1
p3.8xlarge 4
p3.16xlarge 8
p3dn.24xlarge 8

从单个实例扩展到多个实例

如果要进一步扩展训练,您可以使用更多实例。但是,在添加更多实例之前,您应选择更大的实例类型。查看上表,查看每种 p3 实例类型中有多少个 GPUs。

如果您已从 上的单个 GPU 跳转到 上的p3.2xlarge四个 GPUsp3.8xlarge但决定您需要更多处理能力,则应始终选择 p3.16xlarge ,然后再尝试增加实例计数。在单个实例上保留训练时,性能优于使用多个实例时的性能。此外,您的 成本更低。

当您准备好扩展实例数时,可以通过设置SageMaker 和 estimator来使用 instance_type = p3.16xlarge Python 开发工具包的 instance_count = 2函数执行此操作。与单个 上的八个 GPUs 不同p3.16xlarge,您在两个相同的实例中具有 16 个 GPUs。下图显示了从单个实例上的 8 个 GPUs 开始的扩展和吞吐量,以及总共 256 个 GPUs 的增至 64 个实例。

可用区和网络后平面

对于多个实例,了解连接实例的网络、实例如何读取训练数据以及它们如何相互共享信息(例如,执行AllReduce操作时集群中节点之间的通信)非常重要。

首先,您的实例需要位于同一区域和同一可用区中。例如us-west-2 中的实例必须全部位于 us-west-2a 中。当您使用 SageMaker Python 开发工具包时,将为您处理这一过程。如果您使用 Amazon EC2 并协调自己的训练集群,则需要注意这一点,否则您的训练速度会受到影响。 

您的训练数据也应位于同一可用区中。当您使用SageMaker评估程序时,将传入区域和 S3 存储桶,如果数据不在您设置的区域中,则会收到错误。 

优化的 GPU、网络和存储

p3dn.24xlarge 实例类型专为快速本地存储和高达 100 Gb 的快速网络底层而设计,我们强烈建议您将其作为最出色的分布式训练选择。 SageMaker 支持来自 S3 的流数据模式(称为pipe模式)。对于像分布式训练一样的 HPC 负载,我们建议将 Amazon Fsx 用于文件存储。

自定义训练脚本

虽然 SageMaker 使得部署和扩展实例和 GPUs 的数量变得简单,具体取决于您选择的框架,但管理数据和结果可能非常困难,这就是经常使用外部支持库的原因。这种最基本形式的分布式训练需要修改您的训练脚本来管理数据分配。

SageMaker 还支持 Horovod 以及每个主要深度学习框架的原生分布式训练实施。如果您选择使用这些框架中的示例,您可以遵循 的深度学习容器SageMaker容器容器指南,以及各种演示 实施的示例笔记本。

SageMaker 内置的分布式训练功能

内置算法SageMaker库包含 18 种常见的机器学习算法。其中的很多属性从头开始编写为可扩展并开箱分发。如果要使用分布式深度学习训练代码,我们建议使用 Amazon SageMaker的分布式训练库。 SageMaker的分布式训练库使您能够更轻松地编写高度可扩展且经济高效的自定义数据并行和模型并行深度学习训练作业。

SageMaker 分布式训练库提供数据并行和模型并行训练策略。它结合了软件和硬件技术,以改进 GPU 间和节点间通信。它使用内置选项扩展了 SageMaker的训练功能,这些选项只需要对训练脚本进行小的代码更改。