

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

# 采用 SageMaker AI 最佳实践进行分布式计算
<a name="distributed-training-options"></a>

本最佳实践页面概要介绍了用于机器学习 (ML) 作业的各种分布式计算。本页面中的*分布式计算*一词包括用于机器学习任务的分布式训练，以及用于数据处理、数据生成、特征工程和强化学习的并行计算。在本页中，我们将讨论分布式计算中的常见挑战，以及 SageMaker 训练和 SageMaker 处理中的可用选项。有关分布式计算的其他阅读材料，请参阅[什么是分布式计算？](https://www.amazonaws.cn/what-is/distributed-computing/)。

您可以将机器学习任务配置为在多个节点（实例）、加速器（NVIDIA GPUs、 Amazon Trainium 芯片）和 vCPU 内核之间以分布式方式运行。通过运行分布式计算，您可以实现各种目标，例如计算速度更快、处理大型数据集或训练大型 ML 模型。

以下列表涵盖了大规模运行 ML 训练作业时可能面临的常见挑战。
+ 您需要根据 ML 任务、要使用的软件库和计算资源来决定如何分布计算资源。
+ 并非所有 ML 任务都能够轻易地实现分布式处理。此外，并非所有 ML 库都支持分布式计算。
+ 分布式计算并不一定能够实现计算效率的线性提高。特别是，您需要确定数据 I/O 和 GPU 间通信是否存在瓶颈或导致开销。
+ 分布式计算可能会干扰数值处理并改变模型准确性。特别是对于数据并行神经网络训练，当您纵向扩展到更大的计算集群时需要更改全局批量大小，还需要相应地调整学习率。

SageMaker AI 提供分布式训练解决方案，以缓解各种用例的此类挑战。请选择以下最适合您使用场景的选项。

**Topics**
+ [选项 1：使用支持分布式训练的 SageMaker AI 内置算法](#distributed-training-options-1)
+ [选项 2：在 A SageMaker I 托管的训练或处理环境中运行自定义 ML 代码](#distributed-training-options-2)
+ [选项 3：编写自己的自定义分布式训练代码](#distributed-training-options-3)
+ [选项 4：并行或按顺序启动多个作业](#distributed-training-options-4)

## 选项 1：使用支持分布式训练的 SageMaker AI 内置算法
<a name="distributed-training-options-1"></a>

SageMaker AI 提供了[内置算法](https://docs.amazonaws.cn/sagemaker/latest/dg/algos.html)，您可以通过 A SageMaker I 控制台或 SageMaker Python SDK 开箱即用。使用内置算法时，您无需花时间自定义代码、了解模型背后的科学知识，也无需在预置 Amazon EC2 实例上运行 Docker。

 SageMaker AI 内置算法的子集支持分布式训练。要检查您选择的算法是否支持分布式训练，请参阅[关于内置算法的常用信息](https://docs.amazonaws.cn/sagemaker/latest/dg/common-info-all-im-models.html)表中的**可并行化**列。**有些算法支持多实例分布式训练，而其余的可并行算法则支持在单个实例 GPUs 中实现多个实例的并行化，如 Parallelizable 列所示。**

## 选项 2：在 A SageMaker I 托管的训练或处理环境中运行自定义 ML 代码
<a name="distributed-training-options-2"></a>

SageMaker AI 作业可以为特定的用例和框架实例化分布式训练环境。此环境充当 ready-to-use白板，您可以在其中自带和运行自己的机器学习代码。

### ML 代码使用深度学习框架时
<a name="distributed-training-options-2-1"></a>

您可以使用用于训练的 Dee [p Learning Containers (DLC)](https://github.com/aws/deep-learning-containers) 启动分布式 SageMaker 训练作业，您可以通过 AI Python [SDK 中的专用 SageMaker Python](http://sagemaker.readthedocs.io/) 模块或通过 with SageMaker APIs 进行[Amazon CLI](https://docs.amazonaws.cn/cli/latest/reference/sagemaker/index.html)编排。[适用于 Python (Boto3) 的 Amazon SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html) SageMaker AI 为机器学习框架提供训练容器，包括、[PyTorch[TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/index.html)](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/index.html)、[Hugging Face Transformers [和 MXNet](https://sagemaker.readthedocs.io/en/stable/frameworks/mxnet/index.html) Apac](https://sagemaker.readthedocs.io/en/stable/frameworks/huggingface/index.html) he。您可以通过两种方式编写深度学习代码用于分布式训练。
+ **A SageMaker I 分布式训练库**

  A SageMaker I 分布式训练库为神经网络数据并行性和模型并行性提供了 Amazon托管代码。 SageMaker AI 分布式训练还附带了 SageMaker Python SDK 中内置的启动器客户端，您无需编写并行启动代码。要了解更多信息，请参阅 [SageMaker AI 的数据并行度库和 [SageMaker AI 的模型并行度](https://docs.amazonaws.cn/sagemaker/latest/dg/model-parallel.html)库](https://docs.amazonaws.cn/sagemaker/latest/dg/data-parallel.html)。
+ **开源分布式训练库** 

  开源框架有自己的分发机制，例如中的 [DistributedDataParallelism (DDP) PyTorch 或中的](https://pytorch.org/docs/stable/notes/ddp.html)`tf.distribute`模块。 TensorFlow您可以选择在 SageMaker AI 管理的框架容器中运行这些分布式训练框架。例如，在 AI 中[训练 maskrCNN 的示例代码展示了如何在 SageMaker AI](https://github.com/aws-samples/amazon-sagemaker-cv) 框架容器中同时使用 PyTorch DDP 和在 PyTorch 框架容器中使用 [Horovod](https://horovod.readthedocs.io/en/stable/)。 SageMaker SageMaker TensorFlow 

SageMaker [AI ML 容器还预装了 [MPI](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/mpi_on_sagemaker/intro/mpi_demo.ipynb)，因此您可以使用 mpi4py 并行化入口点脚本。](https://mpi4py.readthedocs.io/en/stable/)当您启动第三方分布式训练启动器或在 AI 托管训练环境中编写临时并行代码时，使用 MPI 集成训练容器是一个不错 SageMaker 的选择。

*关于数据并行神经网络训练的注意事项 GPUs*
+ **在适当的时候扩展到多 GPU 和多计算机并行性**

  我们经常在多 CPU 或多 GPU 实例上运行神经网络训练作业。每个基于 GPU 的实例通常包含多个 GPU 设备。因此，分布式 GPU 计算可以在具有多个 GPU 的单个 GPU 实例中进行 GPUs （单节点多 GPU 训练），也可以在每个实例中有多个 GPU 内核的多个 GPU 实例之间进行（多节点多 GPU 训练）。单实例训练更易于编写代码和调试，而且节点内的 GPU-to-GPU吞吐量通常比节点间 GPU-to-GPU吞吐量快。因此，最好先垂直扩展数据并行度（使用一个 GPU 实例和多个 GPU 实例 GPUs），然后在需要时扩展到多个 GPU 实例。这可能不适用于 CPU 预算过高（例如，用于数据预处理的大量工作负载）以及多 GPU 实例的 CPU-to-GPU比例过低的情况。在所有情况下，您都需要根据自己的 ML 训练需求和工作负载，尝试不同的实例类型组合。
+ **监控收敛质量**

  在使用数据并行度训练神经网络时，在保持每个 GPU 的小批次大小不变的 GPUs 同时增加神经网络的数量会增加小批量随机梯度下降 (MSGD) 过程的全局小批次的大小。而 MSGD 的小批次大小已知会影响下降噪声和收敛性。为了在保持准确性的同时正确缩放，您需要调整其他超参数，例如学习率 [[Goyal 等](https://arxiv.org/abs/1706.02677)。(2017)]。
+ **监控 I/O 瓶颈**

  随着数量的增加 GPUs，读取和写入存储的吞吐量也应增加。请确保您的数据来源和管道不会成为瓶颈。
+ **根据需要修改训练脚本**

  针对单 GPU 训练编写的训练脚本必须进行修改，才能用于多节点多 GPU 训练。在大多数数据并行性库中，需要修改脚本才能进行以下操作。
  + 向每个 GPU 分配训练数据批次。
  + 使用可以处理多个梯度计算和参数更新的优化器。 GPUs
  + 将执行检查点操作的责任分配给特定的主机和 GPU。

   

### ML 代码涉及表格数据处理时
<a name="distributed-training-options-2-2"></a>

PySpark 是 Apache Spark 的 Python 前端，Apache Spark 是一个开源的分布式计算框架。 PySpark 已被广泛用于大规模生产工作负载的分布式表格数据处理。如果要运行表格数据处理代码，请考虑使用 Processing [ PySpark 容器](https://docs.amazonaws.cn/sagemaker/latest/dg/use-spark-processing-container.html)并运行 parallel 作业。SageMaker 您还可以使用与 Amazon EMR 和 Amazon [EMR](https://www.amazonaws.cn/blogs/machine-learning/part-1-create-and-manage-amazon-emr-clusters-from-sagemaker-studio-to-run-interactive-spark-and-ml-workloads/) 集成的 Amazon SageMaker Studio Classic APIs 中的 SageMaker 训练和 SageMaker 处理并行运行数据处理作业。[Amazon Glue](https://www.amazonaws.cn/about-aws/whats-new/2022/09/sagemaker-studio-supports-glue-interactive-sessions/?nc1=h_ls)

## 选项 3：编写自己的自定义分布式训练代码
<a name="distributed-training-options-3"></a>

当您向 A SageMaker I 提交训练或处理任务时， SageMaker 训练和 AI 处理 API 会启动 SageMaker Amazon EC2 计算实例。您可以通过运行自己的 Docker 容器或在 Amazon 托管容器中安装其他库来自定义实例中的训练和处理环境。有关带 SageMaker 训练的 Docker 的更多信息，请参阅[调整自己的 Docker 容器以与 SageMaker AI 配合使用](https://docs.amazonaws.cn/sagemaker/latest/dg/docker-containers-adapt-your-own.html)和[使用自己的算法和模型创建容器](https://docs.amazonaws.cn/sagemaker/latest/dg/docker-containers-create.html)。有关具有 SageMaker AI 处理功能的 Docker 的更多信息，请参阅[使用自己的处理代码](https://docs.amazonaws.cn/sagemaker/latest/dg/use-your-own-processing-code.html)。

每个 SageMaker 训练作业环境都包含一个位于的配置文件`/opt/ml/input/config/resourceconfig.json`，而每个 Processing SageMaker 作业环境都包含一个类似的配置文件`/opt/ml/config/resourceconfig.json`。您的代码可以读取此文件，从而查找 `hostnames` 和建立节点间通信。要了解更多信息，包括 JSON 文件的架构，请参阅[分布式训练配置](https://docs.amazonaws.cn/sagemaker/latest/dg/your-algorithms-training-algo-running-container.html#your-algorithms-training-algo-running-container-dist-training)和 [Amazon Process SageMaker ing 如何配置您的处理容器](https://docs.amazonaws.cn/sagemaker/latest/dg/build-your-own-processing-container.html#byoc-config)。您还可以安装和使用第三方分布式计算库，例如 [Ray](https://github.com/aws-samples/aws-samples-for-ray/tree/main/sagemaker) 或 DeepSpeed SageMaker AI。

您还可以使用 SageMaker 训练和 SageMaker 处理来运行不需要工作人员间通信的自定义分布式计算。在计算文献中，这些任务通常被描述为*易并行*或*不共享*。这样的例子包括并行处理数据文件、在不同配置下并行训练模型，或者对记录集合运行批量推理。您可以轻松地将此类无共享用例与 Amazon AI 并行化。 SageMaker 当您在具有多个节点的集群上启动 SageMaker 训练或 SageMaker 处理作业时， SageMaker AI 会默认在所有节点上复制并启动您的训练代码（采用 Python 或 Docker）。通过在 SageMaker A `TrainingInput` I API 的数据输入配置中进行设置，可以简化需要`S3DataDistributionType=ShardedByS3Key`在如此多个节点上随机分配输入数据的任务。

## 选项 4：并行或按顺序启动多个作业
<a name="distributed-training-options-4"></a>

您还可以将 ML 计算工作流分配到较小的并行或顺序计算任务中，每个任务都由自己的 SageMaker 训练或 SageMaker 处理任务表示。对于以下情况或任务，将一个任务拆分为多个作业可能会带来好处：
+ 当每个子任务都有特定的[数据通道](https://docs.amazonaws.cn/sagemaker/latest/dg/model-train-storage.html)和元数据条目（例如超参数、模型配置或实例类型）时。
+ 当您在子任务级别实施重试步骤时。
+ 当您在运行工作负载期间改变子任务的配置时，例如增加批次大小来进行训练时。
+ 当您需要运行的 ML 任务用时比单个训练作业允许的最大训练时间（最多 28 天）更长时。
+ 当计算工作流的不同步骤需要不同的实例类型时。

对于超参数搜索的具体情况，请使用 [SageMaker AI 自动模型调整](https://docs.amazonaws.cn/sagemaker/latest/dg/automatic-model-tuning.html)。 SageMaker AI Automated Model Tuning 是一款无服务器参数搜索协调器，它根据搜索逻辑代表你启动多个训练作业，搜索逻辑可以是随机、贝叶斯或。 HyperBand

[此外，要编排多个训练作业，您还可以考虑使用工作流编排工具，例如流[SageMaker 水线、[Amazon Step Fun](https://docs.amazonaws.cn/step-functions/latest/dg/connect-sagemaker.html) ctions 和 AI 工作流支持的亚马逊托管](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/index.html)[工作流程 Apache Airflow (MWAA) 和 AI 工作流程](https://www.amazonaws.cn/managed-workflows-for-apache-airflow/)。SageMaker ](https://sagemaker.readthedocs.io/en/stable/workflows/airflow/using_workflow.html)