

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

# 在 Amazon A SageMaker I 中进行分布式训练
<a name="distributed-training"></a>

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

**提示**  
要了解机器学习 (ML) 训练和处理作业的分布式计算最佳实践，请参阅[采用 SageMaker AI 最佳实践进行分布式计算](distributed-training-options.md)。

## 分布式训练概念
<a name="distributed-training-basic-concepts"></a>

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

**数据集和批处理**
+ **训练数据集**：您用于训练模型的所有数据。
+ **全局批次大小**：在每次迭代中从训练数据集中选择要发送到集群 GPUs 中的记录数。这是每次迭代时计算渐变所用的记录数。如果使用数据并行性，则该值等于模型副本总数乘以每个副本的批次大小：`global batch size = (the number of model replicas) * (per-replica batch size)`。在机器学习文献中，全局批次大小的单个批次通常被称为*小批次*。
+ **每个副本批次大小：**使用数据并行性时，这是发送到每个模型副本的记录数。每个模型副本对此批次执行向前和向后传递以计算权重更新。在处理下一组每个副本批次之前，生成的权重更新将在所有副本之间同步（取平均值）。
+ **微批次**：小批次的子集，或者，如果使用混合模型和数据并行性，则它是每个副本批次大小的子集。当您使用 SageMaker AI 的分布式模型并行度库时，每个微批次都会输入到训练管道中， one-by-one并遵循库[运行时定义的执行计划](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-core-features.html#model-parallel-pipeline-execution)。

**训练**
+ **纪元**：对整个数据集完成的一个训练周期。通常每个纪元都会有多次迭代。您在训练中使用的纪元数量，对您的模型和使用场景唯一。
+ **迭代**：使用训练数据的全局批次大小的批次（微批次）执行单次向前和向后传递。训练期间执行的迭代次数取决于全局批次大小和训练使用的纪元数。例如，如果数据集包含 5000 个样本，并且您使用的全局批次大小为 500，则需要 10 次迭代才能完成一个纪元。
+ **学习率**：一个变量，在根据模型的计算误差更改权重时，它影响更改的大小。学习率在模型的收敛能力以及收敛的速度和最优性方面发挥着重要作用。

**实例和 GPUs**
+ **实例**： AWS [机器学习计算实例](https://aws.amazon.com/sagemaker/pricing/)。这些实例也被称为*节点*。
+ **集群大小**：使用 SageMaker AI 的分布式训练库时，这是实例数乘以每个实例中的 GPU 数量。例如，如果您的训练作业中使用两个 ml.p3.8xlarge 实例，每个实例有 4 个 GPU，则集群大小为 8。虽然增加集群大小可以缩短训练时间，但实例之间的通信必须进行优化；否则，节点之间的通信可能会增加开销并导致训练速度变慢。 SageMaker AI 分布式训练库旨在优化 Amazon EC2 ML 计算实例之间的通信，从而提高设备利用率和缩短训练时间。

**分布式训练解决方案**
+ **数据并行性**：分布式训练中的一种策略，将训练数据集在计算集群中的多个 GPU之间拆分，计算集群由多个 Amazon EC2 ML 实例组成。每个 GPU 包含模型的一个*副本*，接收不同批次的训练数据，执行向前和向后传递，并与其他节点共享权重更新以进行同步，然后再转到下一个批次，最终进入另一个纪元。
+ **模型并行性**：分布式训练中的一种策略，将模型在计算集群中的多个 GPU之间拆分，计算集群由多个 Amazon EC2 ML 实例组成。模型可能很复杂，并且有大量隐藏的层和权重，因此无法放入单个实例的内存中。每个 GPU 都承载模型的一个子集，通过该子集共享和编译数据流和转换。在 GPU 利用率和训练时间方面，模型并行性的效率在很大程度上取决于模型的分区方式，以及用于执行向前和向后传递的执行计划。
+ **管道执行计划**（**管道传输**）：管道执行计划决定了模型在训练期间，在各个设备上进行计算（微批次）和处理数据的顺序。Pipelining 是一种在模型并行性中实现真正的并行化的技术，并通过同时对不同的数据样本进行计算来克服顺序计算造成的性能损失。 GPUs 要了解更多信息，请参阅[管道执行计划](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-core-features.html#model-parallel-pipeline-execution)。

### 高级概念
<a name="distributed-training-advanced-concepts"></a>

机器学习 (ML) 从业者在训练模型时通常会面临两个扩展挑战：*扩展模型大小*和*扩展训练数据*。虽然模型的大小和复杂程度会影响到准确性，但是可以放入单个 CPU 或 GPU 的模型大小有限制。此外，扩展模型大小可能会导致更多的计算量和更长的训练时间。

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

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

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

数据并行 SGD 仍然要求开发人员至少能够至少将模型和单个记录放入一个计算设备（例如单个 CPU 或 GPU）中。在训练非常大的模型时，例如自然语言处理 (NLP) 中的大型转换器，或者对高分辨率图像分段模型时，可能会出现这种做法不可行的情况。拆分工作负载的另一种替代方法是将模型在多个计算设备上分区，这种方法称为*模型并行分布式训练*。