本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon 中的分布式培训 SageMaker
SageMaker 提供分布式训练库,并支持各种分布式训练选项,用于深度学习任务,例如计算机视觉 (CV) 和自然语言处理 (NLP)。借助 SageMaker分布式训练库,您可以并行运行高度可扩展且经济实惠的自定义数据,并对并行深度学习训练作业进行建模。您还可以使用其他分布式训练框架和包,例如 PyTorch DistributedDataParallel (DDP) torchrun
、、MPI (mpirun
) 和参数服务器。在整篇文档中,说明和示例侧重于如何使用 SageMaker Python 为深度学习任务设置分布式训练选项SDK。
提示
要了解机器学习 (ML) 训练和处理作业的分布式计算最佳实践,请参阅采用 SageMaker 最佳实践的分布式计算。
入门准备
SageMaker Training 支持在单个实例和多个实例上进行分布式训练,因此您可以大规模运行任何规模的训练。我们建议您在 Pyth SageMaker on TensorFlowCreateTrainingJob
API在后端运行,找到当前会话正在运行的区域,然后提取一个预先构建的 AWS 深度学习容器,该容器预先打包了许多库,包括深度学习框架、分布式训练框架和驱动程序。EFA如果要将FSx文件系统挂载到训练实例,则需要将VPC子网和安全组 ID 传递给估算器。在中运行分布式训练作业之前 SageMaker,请阅读以下有关基本基础设施设置的一般指南。
可用区和网络背板
使用多个实例(也称为节点)时,重要的是要了解连接实例的网络、它们如何读取训练数据以及它们如何在彼此之间共享信息。例如,当您运行分布式数据并行训练作业时,许多因素,例如用于运行AllReduce
操作的计算集群节点之间的通信,以及节点之间的数据传输和 Amazon Simple Storage Service 或 Amazon for Lustre 中的数据存储,在实现计算资源的最佳利用和更快的训练速度方面起着至关重要的作用。FSx为了减少通信开销,请确保在同一可用区中配置实例、VPC子网 AWS 区域 和数据存储。
GPU具有更快网络和高吞吐量存储的实例
从技术上讲,您可以使用任何实例进行分布式训练。如果您需要运行多节点分布式训练作业来训练大型模型,例如大型语言模型 (LLMs) 和扩散模型,需要更快的节点间交换,我们建议使用EFA支持的启用GPU
开始使用 Amazon 中的分布式培训 SageMaker
如果您已熟悉如何进行分布式训练,请在以下选项中,选择与您偏好的策略或框架相符的选项以开始使用。如果您想全面了解分布式训练,请参阅分布式训练基本概念。
SageMaker 分布式训练库针对 SageMaker 训练环境进行了优化,有助于调整分布式训练作业 SageMaker,并提高训练速度和吞吐量。该库提供了数据并行和模型并行训练策略。它们结合了软件和硬件技术来改善节点间和节点间的通信,GPU并将 SageMaker extend 的训练功能与内置选项相结合,只需对训练脚本进行最少的代码更改。
使用 SageMaker 分布式数据并行度 () 库 SMDDP
该SMDDP库通过针对 AWS 网络基础设施AllReduce
和 Amazon SageMaker ML 实例拓扑进行了优化的AllGather
集合通信操作来改善节点之间的通信。您可以使用该SMDDP库作为 PyTorch基于分布式训练包的后端:PyTorch 分布式数据 parallel (DDP)ml.p4d.24xlarge
实例上启动分布式训练作业的PyTorch
估算器。
from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=
2
, instance_type="ml.p4d.24xlarge
", # Activate distributed training with SMDDP distribution={ "pytorchddp": { "enabled": True } } # mpirun, activates SMDDP AllReduce OR AllGather # distribution={ "torch_distributed": { "enabled": True } } # torchrun, activates SMDDP AllGather # distribution={ "smdistributed": { "dataparallel": { "enabled": True } } } # mpirun, activates SMDDP AllReduce OR AllGather )
要了解如何准备训练脚本并启动分布式数据并行训练作业 SageMaker,请参阅使用分布式数据并行度库运行 SageMaker 分布式训练。
使用 SageMaker 模型并行度库 () SMP
SageMaker 提供SMP库并支持各种分布式训练技术,例如分片数据并行、流水线、张量并行、优化器状态分片等。要详细了解该SMP库提供的内容,请参阅 SageMaker 模型并行度库的核心功能。
要使用 SageMaker模型并行度库,请配置 SageMaker 框架distribution
估计器的参数。支持的框架估计器是和。PyTorchTensorFlowml.p4d.24xlarge
实例上,使用数据并行性库为分布式训练构造框架估算器。
from sagemaker.
framework
importFramework
distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # enter parameter key-value pairs here } }, }, "mpi": { "enabled" : True, ... # enter parameter key-value pairs here } } estimator =Framework
( ..., instance_count=2
, instance_type="ml.p4d.24xlarge
", distribution=distribution )
要了解如何调整训练脚本、在estimator
类中配置分布参数以及启动分布式训练作业,请参阅SageMaker的模型并行度库(另请参阅 Pyth SageMaker on SDK 文档APIs中的分布式训练
使用开源分布式训练框架
SageMaker 还支持以下操作mpirun
和torchrun
后端选项。
-
要将 PyTorch DistributedDataParallel (DDP)
与 mpirun
后端 SageMaker 一起使用,请distribution={"pytorchddp": {"enabled": True}}
添加到您的 PyTorch估算器中。有关更多信息,另请参阅 Pyth SageMaker on SDK 文档中的PyTorch 分布式训练和SageMaker PyTorch 估算器的 distribution
参数。注意
此选项适用于 PyTorch 1.12.0 及更高版本。
from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=
2
, instance_type="ml.p4d.24xlarge
", distribution={"pytorchddp": {"enabled": True}} # runs mpirun in the backend ) -
SageMaker 支持PyTorch
torchrun
启动器,用于在GPU基于 Amazon 的EC2实例(例如 P3 和 P4)上进行分布式训练,也支持由 Trainium 设备提供支持的 Trn1。AWS 要在
torchrun
后端中 SageMaker 使用 PyTorch DistributedDataParallel (DDP),请 distribution={"torch_distributed": {"enabled": True}}
添加到 PyTorch 估算器中。注意
此选项适用于 PyTorch 1.13.0 及更高版本。
以下代码片段显示了构造 SageMaker PyTorch 估计器以使用分布选项在两个
ml.p4d.24xlarge
实例上运行分布式训练的torch_distributed
示例。from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=
2
, instance_type="ml.p4d.24xlarge
", distribution={"torch_distributed": {"enabled": True}} # runs torchrun in the backend )有关更多信息,请参阅 Pyth SageMaker on SDK 文档中的分布式 PyTorch 训练
和SageMaker PyTorch 估算器的 distribution
参数。在 Trn1 上进行分布式训练的注意事项
一个 Trn1 实例由最多 16 个 Trainium 设备组成,每个 Trainium 设备由两台设备组成。NeuronCores
有关 AWS Trainium 设备的规格,请参阅 Neuron 文档中的 Trainium 架构 。AWS 要在 Trainium 支持的实例上进行训练,您只需要在估算器类的
instance_type
参数中以字符串形式指定 Trn1 实例代码。ml.trn1.*
SageMaker PyTorch 要查找可用的 Trn1 实例类型,请参阅《AWS Neuron 文档》中的 AWS Trn1 架构。 注意
SageMaker Amazon EC2 Trn1 实例上的训练目前仅适用于从 v1.11.0 开始的 Dee AWS p Learning Containers for Ne PyTorch uron 中的 PyTorch框架。要查找支持的 Ne PyTorch uron 版本的完整列表,请参阅 Dee AWS p Learning Conta iners 存储库中的 Neuron 容
器 GitHub 。 当你使用 Pyth SageMaker on 在 Trn1 实例上启动训练作业时SDK, SageMaker会自动从 Deep Learning Containers 提供的AWS 神经元容器中提取并运行正确的容器
。Neuron Containers 预先打包了训练环境设置和依赖项,便于您的训练作业适应 SageMaker 训练平台和 Amazon EC2 Trn1 实例。 注意
要使用在 Trn1 实例上运行 PyTorch 训练作业 SageMaker,您应修改训练脚本以使用
xla
后端初始化进程组并使用PyTorch/。XLA为了支持XLA采用过程,Ne AWS uron SDK 提供了用于将 PyTorch 操作转换为 Trainiu XLA m 指令的 PyTorch Neuron。要了解如何修改训练脚本,请参阅 Neuron 文档中的 PyTorch Neuron 训练开发者指南 ( torch-neuronx
)。AWS 有关更多信息,请参阅 Python 文档中的 Trn1 实例 PyTorch 上使用神经元进行分布式训练
和 E SageMaker PyTorch stimator distribution
的论点。SageMaker SDK -
要MPI在中使用 SageMaker,请
distribution={"mpi": {"enabled": True}}
添加到您的估算器中。MPI分发选项适用于以下框架:MXNet PyTorch、和 TensorFlow。 -
要在中使用参数服务器 SageMaker,请
distribution={"parameter_server": {"enabled": True}}
添加到您的估算器中。参数服务器选项适用于以下框架:MXNet PyTorch、和 TensorFlow。提示
有关在每个框架中使用MPI和参数服务器选项的更多信息,请使用以下 SageMaker Python SDK 文档链接。
-
MXNet分布式训练
和SageMaker MXNet估算器的论点 distribution
-
PyTorch 分布式训练
和SageMaker PyTorch 估算器的论点 distribution
-
TensorFlow 分布式训练
和SageMaker TensorFlow 估算器的论点 。 distribution
-
分布式训练基本概念
SageMaker的分布式训练库使用以下分布式训练术语和功能。
数据集和批处理
-
训练数据集:您用于训练模型的所有数据。
-
全局批次大小:在每次迭代中从训练数据集中选择要发送到集群GPUs中的记录数。这是每次迭代时计算渐变所用的记录数。如果使用数据并行性,则该值等于模型副本总数乘以每个副本的批次大小:
global batch size = (the number of model replicas) * (per-replica batch size)
。在机器学习文献中,全局批次大小的单个批次通常被称为小批次。 -
每个副本批次大小:使用数据并行性时,这是发送到每个模型副本的记录数。每个模型副本对此批次执行向前和向后传递以计算权重更新。在处理下一组每个副本批次之前,生成的权重更新将在所有副本之间同步(取平均值)。
-
微批次:小批次的子集,或者,如果使用混合模型和数据并行性,则它是每个副本批次大小的子集。当您使用 SageMaker分布式模型并行度库时,每个微批次都会输入到训练管道中, one-by-one 并遵循库运行时定义的执行计划。
训练
-
纪元:对整个数据集完成的一个训练周期。通常每个纪元都会有多次迭代。您在训练中使用的纪元数量,对您的模型和使用场景唯一。
-
迭代:使用训练数据的全局批次大小的批次(微批次)执行单次向前和向后传递。训练期间执行的迭代次数取决于全局批次大小和训练使用的纪元数。例如,如果数据集包含 5000 个样本,并且您使用的全局批次大小为 500,则需要 10 次迭代才能完成一个纪元。
-
学习率:一个变量,在根据模型的计算误差更改权重时,它影响更改的大小。学习率在模型的收敛能力以及收敛的速度和最优性方面发挥着重要作用。
实例和 GPUs
-
实例: AWS 机器学习计算实例
。这些实例也被称为节点。 -
集群大小:使用 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) 中的大型变压器,或者在高分辨率图像上训练分割模型)时,在某些情况下这可能不可行。拆分工作负载的另一种替代方法是将模型在多个计算设备上分区,这种方法称为模型并行分布式训练。
策略
分布式训练通常按两种方法来拆分:数据并行和模型并行。Dat a parallel 是分布式训练的最常见方法:你有大量数据,对其进行批处理,然后将数据块发送到多个CPUs或GPUs(节点),由神经网络或机器学习算法处理,然后合并结果。每个节点上的神经网络都是一样的。模型并行方法用于不能整体放到一个节点的内存中的大型模型;该方法拆分模型,不同的部分放在不同的节点上。在这种情况下,您需要将数据批次发送到各个节点,以便在模型的所有部分上处理数据。
术语网络和模型经常可以互换使用:大型模型实际上是一个具有许多层和参数的大型网络。使用大型网络进行训练会生成一个大型模型,将模型以及所有预训练的参数及其权重加载回网络,会将大型模型加载到内存中。当您拆分模型以在节点之间分布模型时,您也会拆分底层网络。网络由层组成,为了拆分网络,您可以将层放置在不同的计算设备上。
在设备之间天真地拆分层的一个常见陷阱是利用率严重GPU不足。无论是向前还是向后传球,训练本质上都是按顺序进行的,在给定的时间,只有一个人GPU可以主动计算,而其他人则等待激活发送。为了解决这个问题,现代模型并行库使用管道执行计划来提高设备利用率。但是,只有 Amazon SageMaker 的分布式模型并行库包含自动模型拆分。该库有两个核心功能:自动模型拆分和管道执行计划,通过制定自动化决策以实现高效设备利用,简化了实施模型并行的过程。
使用数据并行和模型并行进行训练
如果您在使用大型数据集进行训练,请首先使用数据并行方法。如果您在训练期间内存不足,则可能需要切换到模型并行方法,或尝试混合使用模型并行和数据并行。您还可以尝试以下方法,通过数据并行来提高性能:
-
更改模型的超参数。
-
减少批次大小。
-
继续减少批次大小,直至能够放入。如果您将批量大小减少到 1,但内存仍然不足,那就应该尝试模型并行训练。
尝试渐变压缩 (FP16,INT8):
-
在NVIDIA TensorCore配备了硬件的硬件上,使用混合精度训练
可以提高速度并减少内存消耗。 -
SageMaker的分布式数据并行度库支持开箱即用的自动混合精度 (AMP)。除了对训练脚本进行框架级别的修改外,无需执行任何AMP其他操作即可启用。如果有梯度FP16,则 SageMaker 数据并行度库将在中运行其操作。
AllReduce
FP16有关实现训练脚AMPAPIs本的更多信息,请参阅以下资源:-
框架- PyTorch
在NVIDIA深度学习性能文档中 -
框架- TensorFlow
在NVIDIA深度学习性能文档中 -
NVIDIA开发者文档中@@ 用于深度学习的自动混合精度
-
在PyTorch 博客中@@ 引入原生 PyTorch 自动混合精度NVIDIAGPUs以加快训练速度
-
TensorFlow TensorFlow文档APIs中的@@ 精度好坏参半
-
尝试减小输入大小:
-
如果您增加NLP序列链接、需要向下调整批次大小或向GPUs上调整批次以分散批次,请减少序列长度。
-
降低图像分辨率。
检查是否使用了批次标准化,因为这可能会影响收敛性。当你使用分布式训练时,你的批次会被分开,批量小得多的结果可能是错误率更高,从而中断模型的收敛性。GPUs例如,如果您在批量大小为 64 的单个GPU网络上创建网络原型,然后扩展到使用四个 p3dn.24xlarge,那么现在您有 32 个,GPUs并且您的每GPU批次大小从 64 降至 2。这可能会破坏您在单个节点上可以实现的收敛。
在以下情况下从模型并行训练开始:
-
您的模型不能放入单个设备中。
-
由于您的模型大小,您在选择更大的批量大小时会面临限制,例如,如果您的模型权重占用了您的大部分GPU内存,而您被迫选择较小、次优的批次大小。
要了解有关 SageMaker 分布式库的更多信息,请参阅以下内容:
优化分布式训练
根据您的使用场景和数据自定义超参数,以获得最佳的扩展效率。在接下来的讨论中,我们将重点介绍一些最具影响力的训练变量,并提供对 state-of-the-art 实现的参考,以便您可以更多地了解您的选择。此外,建议您参考您偏好的框架的分布式训练文档。
批次大小
SageMaker 分布式工具包通常允许您进行更大规模的训练。例如,如果某个模型能够放入单个设备,但只能使用小批次大小进行训练,则模型并行训练或数据并行训练可以让您实验较大的批次大小。
请注意,批次大小会控制每次迭代时模型更新中的噪声量,进而会直接影响模型准确性。增加批次大小可以减少梯度估算中的噪声量,这在从非常小的批次大小开始增加时会有所帮助,但随着批量大小增加到较大值,可能会导致模型准确性降低。
提示
调整超参数,以确保您的模型训练随着批次大小的增加能够得到满意的收敛性。
现在已经开发了许多技术,以便在批次增加时保持良好的模型收敛性。
小批次大小
在中SGD,小批量大小量化了梯度估计中存在的噪声量。较小的小批次会产生噪声非常多的小批次梯度,这并不能代表数据集的真正梯度。较大的小批次会得到接近数据集上真实梯度的微批次梯度,并且有可能噪声不够,因而可能会保持锁定在无关的最小点中。
要了解有关这些技术的更多信息,请参阅以下文章:
-
PowerAI DDL
、Cho 等 -
大型 Minibatch 的横向扩展SGD:在 ImageNet -1K 上进行残差网络训练,提高了准确性并缩短了训练时间
,Codreanu 等人 -
ImageNet 在几分钟内训练
,你等。 -
卷积网络的大批次训练
,You 等人。 -
在 54 分钟内加速BERT预训练的大批量优化
,Zheng 等人。 -
深度渐变压缩
,Lin 等人。
场景
以下各节介绍了您可能想要扩大训练规模的场景,以及如何使用 AWS 资源来扩大训练规模。
从单一扩展GPU到多个 GPUs
根据机器学习中使用的数据量或模型的大小,可能会出现训练模型的时间超过您愿意等待的时间的情况。有时,由于模型或训练数据太大,训练可能完全无法正常工作。一种解决方案是增加用于训练GPUs的数量。 在具有多个的实例上GPUs,例如p3.16xlarge
具有八个的实例GPUs,数据和处理将分成八个GPUs。当您使用分布式训练库时,这可以为您训练模型所用的时间带来近乎线性的加速。它所花的时间略高于p3.2xlarge
使用一个GPU所花费的时间的 1/8。
实例类型 | GPUs |
---|---|
p3.2xlarge | 1 |
p3.8xlarge | 4 |
p3.16xlarge | 8 |
p3dn.24xlarge | 8 |
注意
SageMaker 训练使用的 ml 实例类型的GPUs数量与相应的 p3 实例类型相同。例如,ml.p3.8xlarge
具有与 p3.8xlarge
-4 GPUs 相同的数字。
从单个实例扩展到多个实例
如果您想进一步扩展训练,则可以使用更多的实例。但是,您应先考虑选择更大的实例类型,然后再考虑添加更多实例。查看上表,了解每个 p3 实例类型GPUs中有多少个。
如果您已从 a GPU 上的单跳p3.2xlarge
到 a GPUs 上的四个p3.8xlarge
,但决定需要更高的处理能力,那么如果您在尝试增加实例数量p3.16xlarge
之前选择 a,则可能会看到更好的性能并降低成本。根据您使用的库,保持在单个实例上进行训练时,相比使用多个实例的场景性能会更好,成本也更低。
当你准备好扩展实例数量时,你可以通过设置 SageMaker Python SDK estimator
函数来实现这一点instance_count
。例如,您可以创建 instance_type = p3.16xlarge
和 instance_count =
2
。在两个相同的实例中p3.16xlarge
,你有16 GPUs 个,而不是单个实例GPUs上的八个。下图显示了扩展和吞吐量,从单个实例GPUs上的 8 个实例开始
自定义训练脚本
虽然可以 SageMaker 轻松部署和扩展实例数量GPUs,但根据您选择的框架,管理数据和结果可能非常困难,这就是经常使用外部支持库的原因。 这种最基本的分布式训练形式需要修改训练脚本来管理数据分布。
SageMaker 还支持 Horovod 和每个主要深度学习框架原生的分布式训练的实现。如果您选择使用这些框架中的示例,则可以遵循深度学习容器指南 D SageMaker eep Learning Containers 以及演示实现的各种示例笔记本