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

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

Amazon 中的分布式培训 SageMaker

SageMaker 提供分布式训练库,并支持各种分布式训练选项,用于深度学习任务,例如计算机视觉 (CV) 和自然语言处理 (NLP)。借助 SageMaker分布式训练库,您可以并行运行高度可扩展且经济实惠的自定义数据,并对并行深度学习训练作业进行建模。您还可以使用其他分布式训练框架和包,例如 PyTorch DistributedDataParallel (DDP) torchrun、、MPI (mpirun) 和参数服务器。以下部分提供有关基本分布式训练概念的信息。在整篇文档中,说明和示例侧重于如何使用 SageMaker Python 为深度学习任务设置分布式训练选项SDK。

提示

要了解机器学习 (ML) 训练和处理作业的分布式计算最佳实践,请参阅采用 SageMaker 最佳实践的分布式计算

分布式训练概念

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

数据集和批处理

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

  • 全局批次大小:在每次迭代中从训练数据集中选择要发送到集群GPUs中的记录数。这是每次迭代时计算渐变所用的记录数。如果使用数据并行性,则该值等于模型副本总数乘以每个副本的批次大小:global batch size = (the number of model replicas) * (per-replica batch size)。在机器学习文献中,全局批次大小的单个批次通常被称为小批次

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

  • 微批次:小批次的子集,或者,如果使用混合模型和数据并行性,则它是每个副本批次大小的子集。当您使用 SageMaker分布式模型并行度库时,每个微批次都会输入到训练管道中, one-by-one并遵循库运行时定义的执行计划

训练

  • 纪元:对整个数据集完成的一个训练周期。通常每个纪元都会有多次迭代。您在训练中使用的纪元数量,对您的模型和使用场景唯一。

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

  • 学习率:一个变量,在根据模型的计算误差更改权重时,它影响更改的大小。学习率在模型的收敛能力以及收敛的速度和最优性方面发挥着重要作用。

实例和 GPUs

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

  • 集群大小:使用 SageMaker分布式训练库时,这是实例数乘以每个实例GPUs中的数量。例如,如果您在训练作业中使用两个 ml.p3.8xlarge 实例,GPUs每个实例有 4 个,则集群大小为 8。虽然增加集群大小可以缩短训练时间,但实例之间的通信必须进行优化;否则,节点之间的通信可能会增加开销并导致训练速度变慢。 SageMaker 分布式训练库旨在优化 Amazon EC2 ML 计算实例之间的通信,从而提高设备利用率和缩短训练时间。

分布式训练解决方案

  • 数据并行性:分布式训练中的一种策略,在这种策略中,训练数据集GPUs在由多个 Amazon EC2 ML 实例组成的计算集群中分成多个数据集。每个节点都GPU包含模型的副本,接收不同批次的训练数据,执行向前和向后传递,并与其他节点共享权重更新以进行同步,然后再进入下一个批次,最终进入另一个时期。

  • 模型并行性:分布式训练中的一种策略,其中模型在计算集群GPUs中分成多个模型,计算集群由多个 Ama EC2 zon ML 实例组成。模型可能很复杂,并且有大量隐藏的层和权重,因此无法放入单个实例的内存中。每个模型都GPU带有模型的子集,通过该子集共享和编译数据流和转换。就GPU利用率和训练时间而言,模型并行性的效率在很大程度上取决于模型的分区方式以及用于执行向前和向后传递的执行计划。

  • 管道执行计划管道传输):管道执行计划决定了模型在训练期间,在各个设备上进行计算(微批次)和处理数据的顺序。Pipelining 是一种在模型并行性中实现真正的并行化的技术,并通过同时对不同的数据样本进行计算来克服顺序计算造成的性能损失。GPUs要了解更多信息,请参阅管道执行计划

高级概念

Machine Learning (ML) 从业者在训练模型时通常面临两个扩展挑战:缩放模型大小缩放训练数据。 虽然模型大小和复杂性可以提高精度,但可以放入单个CPU或的模型大小是有限制的GPU。此外,扩展模型大小可能会导致更多的计算量和更长的训练时间。

并非所有模型都能很好地处理训练数据的扩展,因为它们需要在内存中摄取所有训练数据用于训练。这些模型只能垂直扩展,不断扩展到更大的实例类型。在大多数情况下,扩展训练数据会导致更长的训练时间。

深度学习 (DL) 是一个特定的 ML 算法系列,由多层人工神经网络组成。最常见的训练方法是使用小批量随机梯度下降 ()。SGD在小批量中SGD,模型通过朝减少误差的方向对其系数进行微小的迭代变化来训练。这些迭代在训练数据集的相同大小子样本上进行,这些子样本称为小批次。对于每个小批次,模型都对小批次的每个记录运行,衡量其误差和估算误差的梯度。然后,对小批次的所有记录测量平均梯度,并为每个模型系数提供更新方向。训练数据集的一次完整过程称为一个纪元。模型训练通常包括几十到数百个纪元。Mini-SGD batch 有几个好处:首先,它的迭代设计使训练时间在理论上与数据集大小成线性。其次,在给定的小批次中,模型会单独处理每条记录,除了最后的取梯度平均值外,不需要记录间的通信。因此,小批次的处理特别适合并行化和分布式。 

通过将小批次的记录分发到不同的计算设备上进行并行SGD训练称为数据并行分布式训练,是最常用的深度学习分发范式。数据并行训练是一种相关的分发策略,可以扩展小批次大小,并更快地处理每个小批次。但是,数据并行训练带来了额外的复杂性,即必须使用来自所有工作线程的梯度,计算小批次梯度平均值,然后将其传输给所有工作线程,这是一个名为 allreduce 的步骤,随着训练集群的扩展,这可能带来更大的开销,如果实施方法不当或实施了不当的硬件减少,也可能严重地影响到训练时间。 

Data parallel SGD 仍然要求开发人员能够在计算设备中至少拟合模型和一条记录,例如单个CPU或GPU。在训练非常大的模型(例如自然语言处理 (NLP) 中的大型变压器,或者在高分辨率图像上训练分割模型)时,在某些情况下这可能不可行。拆分工作负载的另一种替代方法是将模型在多个计算设备上分区,这种方法称为模型并行分布式训练