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

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

Amazon SageMaker 分布式培训库

SageMaker 提供了数据并行性和模型并行性的分布式培训库。这些库针对 SageMaker 培训环境进行了优化,有助于使您的分布式培训作业适应 SageMaker,并提高培训速度和吞吐量。

开始使用分布式培训

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

SageMaker 分布式培训库:

注意

SageMaker 分布式培训库只能通过AmazonSageMaker 培训平台中的 TensorFlow、PyTorch 和 HuggingFace 框架的深度学习容器。要使用这些库,您必须使用 SageMaker Python SDK 或者通过适用 SDK for Python (Boto3) 使用 SageMaker API 或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 分布式培训库旨在优化之间的沟通Amazon机器学习计算实例,从而提高设备利用率和更快的训练时间。

分布式训练方案

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

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

  • 管道执行计划(管道): 管道执行计划决定了模型训练期间进行计算(微批量)和跨设备处理数据的顺序。Pipelining 是一种技术,可通过在不同的数据样本上同时计算 GPU 来实现模型并行性能,并克服由于顺序计算而导致的性能损失。要了解更多信息,请参阅管道执行计划.

示例

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

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

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

高级概念

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

并非所有模型都处理训练数据的扩展能力都一样好,因为它们需要摄取所有训练数据记忆中的对于训练。它们只能垂直扩展,并扩展到更大和更大的实例类型。在大多数情况下,扩展训练数据会导致更长的训练时间。

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

通过将小批记录分发到不同的计算设备上并行进行 SGD 训练被称为数据并行分布式培训,是最常用的 DL 分布模式。数据并行训练是一种相关的分发策略,可以扩展小批量规模并更快地处理每个小批量。但是,数据并行训练带来了额外的复杂性,即必须计算小批次梯度平均值,使用来自所有员工的渐变,然后将其传达给所有员工,这是一个叫做的步骤所有减少随着培训群集的扩展,这可能意味着开销越来越大,如果实施不当或实施不当的硬件减少,也可能严重损害训练时间。 

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

策略

分布式训练通常分为两种方法:数据并行和模型并行。并行数据是分布式训练最常见的方法:你有很多数据,批量将数据块发送到多个 CPU 或 GPU(节点)以供神经网络或机器学习算法处理,然后合并结果。每个节点上的神经网络都是一样的。一个并行模型方法用于不能放在一个节点内存中的大型模型;它会分解模型并将不同的部分放在不同的节点上。在这种情况下,您需要将批量数据发送到每个节点,以便在模型的所有部分处理数据。

这些术语网络模型经常可以互换使用:大型模型实际上是一个具有许多层和参数的大型网络。使用大型网络进行训练会生成一个大型模型,然后将模型加载到网络中,其中包含所有预训练的参数及其权重将大型模型加载到内存中。当你拆分模型以跨节点拆分模型时,你也会拆分底层网络。网络由层组成,为了分割网络,您可以在不同的计算设备上放置层。

在设备之间天真地分割图层的一个常见缺陷是 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 中,迷你批量大小量量化了梯度估计中存在的噪声量。小批次会产生非常嘈杂的迷你批量渐变,这并不代表数据集的真正梯度。大型迷你批量生成的小批量渐变接近数据集的真实渐变,并且可能不够嘈杂,可能会保持锁定在无关紧要的最小值中。

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

方案

以下各节介绍了您可能希望扩大培训的场景,以及如何使用这样做Amazon资源的费用。

从单个 GPU 扩展到多个 GPU

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

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

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

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

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

如果你已经从一个 GPU 上跳出p3.2xlarge在一个上的四个 GPUp3.8xlarge,但是决定你需要更多的处理能力,如果选择p3.16xlarge在尝试增加实例数之前。根据您使用的库,当您将培训保留在单个实例上时,性能会更好,成本比使用多个实例的场景更低。

当你准备好扩展实例数量时,你可以使用 SageMaker Python SDK 来做到这一点estimator通过设置你的功能instance_count. 例如,您可以设置instance_type = p3.16xlargeinstance_count = 2. 而不是单个上的八个 GPUp3.16xlarge,你在两个相同的实例中有 16 个 GPU。下图显示了扩展和吞吐量从八个 GPU 开始在单个实例上,并增加到 64 个实例,总共 256 个 GPU。

可用区和网络背板

对于多个实例,重要的是了解连接实例的网络、实例如何读取训练数据以及它们之间如何共享信息(例如,在执行AllReduce操作)。

首先,您的实例必须位于同一区域和同一可用区。例如,us-west-2 中的实例必须全部位于 us-west-2a。当你使用 SageMaker Python SDK 时,这是为你处理的。如果您使用 Amazon EC2 并编排自己的培训集群,则需要注意这一点,否则您的训练速度会受到影响。 

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

优化 GPU、网络和存储

这些区域有:p3dn.24xlarge实例类型专为快速本地存储和高达 100 GB 的快速网络背板而设计,我们强烈推荐它作为分布式培训的最高性能选项。SageMaker 支持 S3 中的流数据模式,称为pipe模式。对于 HPC 负载(如分布式培训),我们建议亚马逊 Fx用于文件存储。

自定义训练脚本

虽然 SageMaker 可以轻松部署和扩展实例和 GPU 的数量,具体取决于您选择的框架,但管理数据和结果可能非常具有挑战性,这就是经常使用外部支持库的原因。 这种最基本的分布式训练形式需要修改训练脚本以管理数据分发。

SageMaker 还支持 Horovod 以及每个主要深度学习框架原生的分布式培训的实施。如果你选择使用这些框架中的示例,你可以关注 SageMaker容器指南适用于 Deep Learning Containers,以及各种示例笔记本展示了实现。

SageMaker 内置分布式培训功能

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

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