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

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

Amazon SageMaker 分布式培训库

SageMaker 为数据并行性和模型并行性提供分布式培训库。这些库针对 SageMaker 培训环境进行了优化,可帮助您将分布式培训作业调整到 SageMaker 中,并提高培训速度和吞吐量。

开始使用分布式培训

如果您熟悉分布式培训,请按照指向您首选策略或框架的链接之一开始。否则,请继续下一节以了解一些分布式培训概念。

SageMaker 分布式培训库:

注意

SageMaker 分布式培训库只能通过Amazon深度学习容器,用于 SageMaker 培训平台中的 TensorFlow、PyTorch 和 HugingFace 框架。要使用这些库,您必须使用 SageMaker Python 软件开发工具包或通过 SDK for Python (Boto3)(Bto3)或Amazon Command Line Interface. 在整个文档中,说明和示例侧重于如何将分布式培训库与 SageMaker Python SDK 结合使用。

基本分布式训练概念

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

数据集和批处理

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

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

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

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

训练

  • Epoch:整个数据集的一个训练周期。每个时代有多次迭代是常见的。您在训练中使用的周期数量在模型和用例中是唯一的。

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

  • Learning rate (学习速率):影响为响应模型计算误差而更改权重的量的变量。学习率在模型的收敛能力以及收敛速度和最佳性方面起着重要作用。

实例和 GPU

  • 实例:网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的Amazon 机器学习计算实例. 这些信息也称为个节点.

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

分布式训练方案

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

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

  • 管道执行时间表(管道): 管道执行计划确定了在模型训练期间跨设备进行计算(微批次)和处理数据的顺序。流水线是一种实现模型并行性真正并行化的技术,通过让 GPU 在不同的数据样本上同时计算,克服顺序计算造成的性能损失。要了解更多信息,请参阅管道执行时间表.

示例

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

启动了一个双向数据并行性和四向模型并行性训练作业,其全局批量大小为 64 个映像。此培训工作总共需要 8 个 GPU。两个模型复本中的每个复制副本都处理大小为 32 的每个副本批次。在向前和向后传递期间,每个副本的批次被进一步划分为微批次。使用流水线执行计划以交错方式处理这些微批次。

训练数据集包括 640 个图像,因此一个时代需要 10 次迭代。

高级概念

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

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

深度学习 (DL) 是一个特定的 ML 算法系列,由多层人工神经网络组成。最常见的训练方法是使用微型批次随机梯度下降 (SGD)。在小批量 SGD 中,通过对其系数进行小的迭代改变来训练该模型,从而降低其误差。这些迭代是在训练数据集的大小相同的子样本上执行的,称为微型批处理. 对于每个小批次,模型在小批次的每个记录中运行,测量的误差以及估计误差的梯度。然后在微型批次的所有记录中测量平均梯度,并为每个模型系数提供更新方向。训练数据集的一个完整传递称为纪元. 模型培训通常由数十到数百个时代组成。迷你批次 SGD 有几个优势:首先,它的迭代设计使训练时间在理论上呈线性的数据集大小。其次,在给定的微型批次中,每个记录都由模型单独处理,而不需要记录间通信,而不需要最终梯度平均值以外的记录间通信。因此,微型批次的加工特别适合并行化和分配。 

通过在不同的计算设备上分发微型批次的记录来实现 SGD 培训并行化称为数据并行分布式训练,是最常用的 DL 分发范例。数据并行训练是一种相关的分配策略,可以扩大小批量并加快每个小批次的处理速度。但是,数据并行训练带来了额外的复杂性,因为必须计算微型批次梯度平均值,而梯度来自所有工作人员,并将其传达给所有工作人员,这是一个名为全部减少,随着训练集群的扩展,这可能表示开销不断增加,而且如果在不正确的硬件减去不当的情况下实施或实施不当,也会严重影响训练时间。 

数据并行 SGD 仍然要求开发人员至少能够在计算设备(如单个 CPU 或 GPU)中适应模型和单个记录。在自然语言处理 (NLP) 中训练大型模型(如大型变压器)或高分辨率图像上的分割模型)时,可能会出现这种情况不可行的情况。分解工作负载的另一种方法是将模型划分到多个计算设备上,这种方法称为模型并行分布式培训.

策略

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

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

在设备之间天真地分割层的常见缺陷是 GPU 利用率严重不足。训练本质上是前进和后退的顺序,在给定时间,只有一个 GPU 可以主动计算,而其他 GPU 则等待激活被发送。现代模型并行库通过使用管道执行计划来提高设备利用率来解决此问题。但是,只有 Amazon SageMaker 的分布式模型并行库包括自动模型拆分。该库的两个核心功能,即自动模型拆分和管道执行调度,通过制定自动决策来提高设备利用率,简化了模型并行性的实现过程。

使用数据并行和模型并行进行训练

如果要使用大型数据集进行训练,请从数据并行方法开始。如果在训练期间内存不足,则可能需要切换到模型并行方法,或尝试混合模型和数据并行性。您还可以尝试以下操作来提高数据并行性能:

  • 更改模型的超参数。

  • 减小批处理大小。

  • 继续减少批次大小,直到它适合。如果您将批处理大小减少为 1,并且内存不足,则应尝试模型并行训练。

尝试渐变压缩(FP16、INT8):

尝试减小输入大小:

  • 如果增加序列链接、需要向下调整批次大小或向上调整 GPU 以分布批次,则减少 NLP 序列长度。

  • 降低图像分辨率。

检查是否使用批量规范化,因为这会影响收敛性。使用分布式训练时,批次被拆分到 GPU 中,批次大小要小得多的影响可能会导致更高的错误率,从而扰乱模型的收敛。例如,如果您在批处理大小为 64 的单个 GPU 上对网络进行原型化,然后扩展为使用四个 p3dn.24xlarge,则现在您拥有 32 个 GPU,并且每个 GPU 的批处理大小从 64 个降至 2 个。这可能会破坏您看到的单个节点的收敛性。

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

  • 您的型号不适合单个设备。

  • 由于模型尺寸的原因,您在选择较大的批次大小时遇到了限制,例如,模型权重占用了大部分 GPU 内存,并且您不得不选择较小、不理想的批次大小。 

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

优化分布式训练

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

Batch 大小

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

请注意,批量大小通过控制每次迭代时模型更新中的噪声量来直接影响模型精度。增加批次大小可以减少梯度估计中的噪声量,这在从非常小的批次量增加时很有用,但随着批次大小增加到较大的值,模型精度会降低。 

提示

调整超参数,以确保模型在增加批处理大小时达到令人满意的收敛。

已经开发了一些技术,以便在批量增加时保持良好的模型收敛性。

迷你批次大小

在 SGD 中,微型批量大小用于量化梯度估计中出现的噪声量。小批处理会产生非常嘈杂的微型批处理渐变,这并不代表数据集上的真实渐变。大型小批处理会产生一个接近数据集上真实渐变的微型批处理渐变,并且可能不会产生足够的噪音 — 很可能会保持锁定在不相关的最小值中。

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

Scenarios

以下部分介绍了您可能希望扩大培训的方案,以及如何使用Amazon资源的费用。

从单个 GPU 扩展到多个 GPU

机器学习中使用的数据量或模型的大小可能会造成训练模型的时间比您愿意等待的时间长的情况。有时,训练根本不起作用,因为模型或训练数据太大。一种解决方案是增加用于培训的 GPU 数量。 在具有多个 GPU 的实例上,如p3.16xlarge具有八个 GPU,则数据和处理将分为八个 GPU。使用分布式训练库时,这可能会导致训练模型所需的时间近线性加速。它需要稍微超过 1/8 的时间,它会采取p3.2xlarge并使用一个 GPU。

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

SageMaker 培训使用的 ml 实例类型与相应的 p3 实例类型具有相同数量的 GPU。例如,ml.p3.8xlarge的 GPU 数量与p3.8xlarge-4.

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

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

如果您已经从p3.2xlarge设置为四个 GPUp3.8xlarge,但决定您需要更高的处理能力,您可能会看到更好的性能并产生更低的成本,如果您选择p3.16xlarge,然后尝试增加实例计数。根据您使用的库,当您将培训保留在单个实例上时,性能会更好,成本也低于您使用多个实例的场景。

当您准备扩展实例数量时,可以使用 SageMaker Python 软件开发工具包的estimator函数,方法是设置instance_count. 例如,您可以将instance_type = p3.16xlargeinstance_count = 2. 而不是在单个p3.16xlarge,您在两个相同的实例中拥有 16 个 GPU。下面的图表显示从八个 GPU 开始扩展和吞吐量,并增加到 64 个实例,总共 256 个 GPU。

可用区和网络底板

对于多个实例,必须了解连接实例的网络、实例如何读取训练数据以及它们彼此之间如何共享信息(例如,在执行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 使部署和扩展实例和 GPU 的数量变得非常简单,但根据您选择的框架,管理数据和结果可能非常具有挑战性,这就是经常使用外部支持库的原因。 这种最基本的分布式训练形式需要修改训练脚本以管理数据分布。

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

SageMaker 内置分布式培训功能

这些区域有:SageMaker 内置算法库由 18 种流行的机器学习算法组成。其中许多是从头开始重新编写的,以便可扩展和分布开箱即用。如果你想使用分布式深度学习培训代码,我们建议亚马逊 SageMaker 的分布式培训库。SageMaker 的分布式培训库使您能够更轻松地编写高度可扩展且经济高效的自定义数据并行并行深度学习培训作业建模。

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