

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

# 使用 SageMaker AI 分布式数据并行库运行分布式训练
<a name="data-parallel"></a>

 SageMaker AI 分布式数据并行度 (SMDDP) 库通过提供针对基础设施优化的集体通信操作的实现，扩展了深度学习模型的 SageMaker 训练能力，具有近线性的扩展效率。 AWS 

当在庞大的训练数据集上训练大型机器学习 (ML) 模型（例如大型语言模型（LLM）和扩散模型）时，ML 从业人员会使用加速器集群和分布式训练技术来缩短训练时间，或解决每个 GPU 内存无法容纳的模型的内存限制问题。ML 从业人员通常先在单个实例上使用多个加速器，然后随着工作负载需求的增加扩展到实例集群。随着集群规模的扩大，多个节点之间的通信开销也会增加，从而导致整体计算性能下降。

为了解决此类开销和内存问题，SMDDP 库提供了以下内容。
+ SMDDP 库优化了 AWS 网络基础设施和 Amazon A SageMaker I ML 实例拓扑的训练作业。
+ SMDDP 库通过实现针对基础架构进行了优`AllReduce`化的`AllGather`集体通信操作来改善节点之间的通信。 AWS 

要了解有关 SMDDP 库产品详细信息的更多信息，请继续 [SageMaker AI 分布式数据并行库简介](data-parallel-intro.md)。

有关使用 SageMaker AI 提供的模型并行策略进行训练的更多信息，另请参阅。[（已存档）SageMaker 模型并行性库 v1.x](model-parallel.md)

**Topics**
+ [SageMaker AI 分布式数据并行库简介](data-parallel-intro.md)
+ [支持的框架 AWS 区域、和实例类型](distributed-data-parallel-support.md)
+ [使用 SageMaker AI 分布式数据并行库进行分布式训练](data-parallel-modify-sdp.md)
+ [Amazon SageMaker AI 数据并行库示例](distributed-data-parallel-v2-examples.md)
+ [SageMaker AI 分布式数据并行库的配置提示](data-parallel-config.md)
+ [Amazon SageMaker AI 分布式数据并行库常见问题](data-parallel-faq.md)
+ [在 Amazon A SageMaker I 中进行分布式训练的疑难解答](distributed-troubleshooting-data-parallel.md)
+ [SageMaker AI 数据并行度库发行说明](data-parallel-release-notes.md)

# SageMaker AI 分布式数据并行库简介
<a name="data-parallel-intro"></a>

 SageMaker AI 分布式数据并行度 (SMDDP) 库是一个集体通信库，可提高分布式数据并行训练的计算性能。SMDDP 库通过提供以下功能来解决关键集体通信操作的通信开销问题。

1. 该库`AllReduce`针对以下内容进行了优化 AWS。 `AllReduce`是一项关键操作，用于 GPUs 在分布式数据训练期间每次训练迭代结束时同步梯度。

1. 该库`AllGather`针对以下内容进行了优化 AWS。 `AllGather`是分片数据并行训练中使用的另一项关键操作，它是 SageMaker AI 模型并行度 (SMP) 库、 DeepSpeed 零冗余优化器 (ZerO) 和完全分片数据并行度 (FSDP) 等热门库提供的内存效率高的数据并行处理技术。 PyTorch 

1. 该库通过充分利用 AWS 网络基础设施和 Amazon EC2 实例拓扑来优化 node-to-node通信。

SMDDP 库可以在扩展训练集群时提高性能，以近乎线性的扩展效率提高训练速度。

**注意**  
 SageMaker 人工智能分布式训练库可通过训练平台中的 AWS 深度学习容器 PyTorch 和 Hugging Face SageMaker 获得。要使用这些库，你必须使用 SageMaker Python SDK 或适用于 Python 的 SageMaker APIs 直通 SDK (Boto3) 或。 AWS Command Line Interface在整篇文档中，说明和示例都侧重于如何将分布式训练库与 SageMaker Python SDK 配合使用。

## SMDDP 集体通信操作针对 AWS 计算资源和网络基础设施进行了优化
<a name="data-parallel-collective-operations"></a>

SMDDP 库提供了针对 AWS 计算资源`AllReduce`和网络基础架构进行了优化的`AllGather`集合操作的实现。

### SMDDP `AllReduce` 集体操作
<a name="data-parallel-allreduce"></a>

SMDDP 库实现了 `AllReduce` 操作与后向传递的最佳重叠，大大提高了 GPU 的利用率。它通过优化和之间的内核运算，实现了近线性的缩放效率 CPUs和 GPUs更快的训练速度。该库在 GPU 计算梯度时并行执行 `AllReduce`，而不会占用额外的 GPU 周期，这使得该库能实现更快的训练。
+  *杠杆 CPUs*：库使用`AllReduce`渐变 CPUs，将此任务从中卸载。 GPUs
+ *提高 GPU 使用率*：集群 GPUs 专注于计算梯度，从而在整个训练过程中提高梯度的利用率。

以下是 SMDDP `AllReduce` 操作的高级工作流程。

1. 图书馆将等级分配给 GPUs （工作人员）。

1. 每次迭代时，库都会将每个全局批次除以工作线程总数（世界大小），然后将小批次（批次分片）分配给工作线程。
   + 全局批次的大小为 `(number of nodes in a cluster) * (number of GPUs per node) * (per batch shard)`。
   + 批次分片（小批次）是每次迭代分配给每个 GPU（工作线程）的数据集的子集。

1. 该库会为每个工作线程启动训练脚本。

1. 库在每次迭代结束时，管理来自工作线程的模型权重和梯度的副本。

1. 库可同步各工作线程的模型权重和梯度，以聚合成为单个经过训练的模型。

以下架构图显示了该库如何为由 3 个节点组成的集群设置数据并行性的示例。

 

![\[SMDDP AllReduce 和数据并行架构图\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/distributed/data-parallel/sdp-architecture.png)


### SMDDP `AllGather` 集体操作
<a name="data-parallel-allgather"></a>

`AllGather` 是一种集体操作，每个工作者从一个输入缓冲区开始，然后将所有其他工作者的输入缓冲区串联或*聚合*成一个输出缓冲区。

**注意**  
SMDDP `AllGather` 集体操作已在 PyTorch v2.0.1 `smdistributed-dataparallel>=2.0.1` 及更高版本的 Deep Lear AWS ning Containers (DLC) 中提供。

`AllGather` 在分布式训练技术中被大量使用，例如分片数据并行技术，在这种技术中，每个工作者都持有模型的一部分，或者一个分片层。工作线程会在向前和向后传递之前调用 `AllGather`，以重建分片层。在参数*全部收集*后，继续向前传递和向后传递。在后向传递过程中，每个工作线程也会调用 `ReduceScatter` 来收集（减少）梯度并将其分解（分散）为梯度碎片，以更新相应的碎片层。[有关这些集体操作在分片数据并行性中的作用的更多详细信息，请参阅 [SMP 库关于分片数据并行性的实现、 DeepSpeed文档中的 [ZerO](https://deepspeed.readthedocs.io/en/latest/zero3.html#) 以及有关完全分片数据并行性的](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-extended-features-pytorch-sharded-data-parallelism.html)博客。PyTorch ](https://engineering.fb.com/2021/07/15/open-source/fsdp/)

由于在每次迭代中 AllGather 都会调用诸如此类的集体操作，因此它们是 GPU 通信开销的主要来源。这些集体操作的计算速度越快，训练时间就越短，而且不会对收敛性产生副作用。为此，SMDDP 库提供了针对 [P4d 实例](https://aws.amazon.com/ec2/instance-types/p4/)优化的 `AllGather`。

SMDDP `AllGather` 使用以下技术来提高 P4d 实例的计算性能。

1. 它通过具有网状拓扑结构的 [Elastic Fabric Adapter（EFA）](https://aws.amazon.com/hpc/efa/)网络在实例之间（节点间）传输数据。EFA 是一种 AWS 低延迟、高吞吐量的网络解决方案。节点间网络通信的网状拓扑更适合 EFA 和 AWS 网络基础设施的特性。与涉及多次数据包跳转的 NCCL 环形或树形拓扑相比，SMDDP 只需一次跳转，从而避免了多次跳转带来的延迟累积。SMDDP 实现了一种网络速率控制算法，可平衡网状拓扑中每个通信对等节点的工作负载，并实现更高的全局网络吞吐量。

1. 它采用[基于 NVIDIA GPUDirect RDMA 技术的低延迟 GPU 内存复制库 (GDRCopy)](https://github.com/NVIDIA/gdrcopy) 来协调本地 NVLink 和 EFA 网络流量。 GDRCopy是 NVIDIA 提供的低延迟 GPU 内存复制库，提供 CPU 进程和 GPU CUDA 内核之间的低延迟通信。利用这项技术，SMDDP 库就能对节点内和节点间的数据移动进行管道化处理。

1. 它减少了 GPU 流式多处理器的使用，从而提高了运行模型内核的计算能力。P4d 和 p4de 实例配备了 NVIDIA A100 GPUs，每个实例都有 108 个流媒体多处理器。NCCL 最多需要 24 个流式多处理器来运行集体操作，而 SMDDP 使用的流式多处理器不到 9 个。模型计算内核可利用保存的流式多处理器加快计算速度。

# 支持的框架 AWS 区域、和实例类型
<a name="distributed-data-parallel-support"></a>

在使用 SageMaker AI 分布式数据并行度 (SMDDP) 库之前，请检查支持的机器学习框架和实例类型以及您的账户中是否有足够的配额，以及。 AWS AWS 区域

## 支持的框架
<a name="distributed-data-parallel-supported-frameworks"></a>

下表显示了 SageMaker AI 和 SMDDP 支持的深度学习框架及其版本。SMDDP 库可在 [SageMaker AI 框架容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)中使用，也可以集成在[ SageMaker 模型并行度 (SMP) 库 v2 分发的 Docker 容器](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2)中，也可以作为二进制文件下载。

**注意**  
要查看 SMDDP 库的最新更新和版本说明，请参阅 [SageMaker AI 数据并行度库发行说明](data-parallel-release-notes.md)。

**Topics**
+ [PyTorch](#distributed-data-parallel-supported-frameworks-pytorch)
+ [PyTorch 闪电](#distributed-data-parallel-supported-frameworks-lightning)
+ [Hugging Face Transformers](#distributed-data-parallel-supported-frameworks-transformers)
+ [TensorFlow （已弃用）](#distributed-data-parallel-supported-frameworks-tensorflow)

### PyTorch
<a name="distributed-data-parallel-supported-frameworks-pytorch"></a>


| PyTorch 版本 | SMDDP 库版本 | SageMaker 预装了 SMDDP 的 AI 框架容器镜像 | 预装了 SMDDP 的 SMP Docker 映像 | 二进制文件的 URL\$1\$1 | 
| --- | --- | --- | --- | --- | 
| v2.3.1 | smdistributed-dataparallel==v2.5.0 | 不可用 | 658645717510.dkr.ecr.<us-west-2>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.4.1/cu121/2024-10-09/smdistributed\$1dataparallel-2.5.0-cp311-cp311-linux\$1x86\$164.whl | 
| v2.3.0 | smdistributed-dataparallel==v2.3.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker | 当前无可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed\$1dataparallel-2.3.0-cp311-cp311-linux\$1x86\$164.whl | 
| v2.2.0 | smdistributed-dataparallel==v2.2.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.2.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed\$1dataparallel-2.2.0-cp310-cp310-linux\$1x86\$164.whl | 
| v2.1.0 | smdistributed-dataparallel==v2.1.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed\$1dataparallel-2.1.0-cp310-cp310-linux\$1x86\$164.whl | 
| v2.0.1 | smdistributed-dataparallel==v2.0.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed\$1dataparallel-2.0.2-cp310-cp310-linux\$1x86\$164.whl | 
| v2.0.0 | smdistributed-dataparallel==v1.8.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.0-gpu-py310-cu118-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.0/cu118/2023-03-20/smdistributed\$1dataparallel-1.8.0-cp310-cp310-linux\$1x86\$164.whl | 
| v1.13.1 | smdistributed-dataparallel==v1.7.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.13.1-gpu-py39-cu117-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.13.1/cu117/2023-01-09/smdistributed\$1dataparallel-1.7.0-cp39-cp39-linux\$1x86\$164.whl | 
| v1.12.1 | smdistributed-dataparallel==v1.6.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.12.1-gpu-py38-cu113-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.1/cu113/2022-12-05/smdistributed\$1dataparallel-1.6.0-cp38-cp38-linux\$1x86\$164.whl | 
| v1.12.0 | smdistributed-dataparallel==v1.5.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.12.0-gpu-py38-cu113-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.0/cu113/2022-07-01/smdistributed\$1dataparallel-1.5.0-cp38-cp38-linux\$1x86\$164.whl | 
| v1.11.0 | smdistributed-dataparallel==v1.4.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.11.0-gpu-py38-cu113-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.11.0/cu113/2022-04-14/smdistributed\$1dataparallel-1.4.1-cp38-cp38-linux\$1x86\$164.whl | 

\$1\$1 二进制文件用于在自定义容器中安装 SMDDP 库。 URLs 有关更多信息，请参阅 [使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器](data-parallel-bring-your-own-container.md)。

**注意**  
SMDDP 库可在使用 [SageMaker AI 框架容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)和 [SMP Docker 镜像 AWS 区域](distributed-model-parallel-support-v2.md)的地方使用。

**注意**  
SMDDP 库 v1.4.0 及更高版本可用作 PyTorch 分布式（torch.distributed）数据并行性（torch.parallel）的后端。 DistributedDataParallel)。根据更改，已弃用以下 [smdistri APIs](https://sagemaker.readthedocs.io/en/stable/api/training/sdp_versions/latest/smd_data_parallel_pytorch.html#pytorch-api) bute PyTorch d 的分布式软件包。  
`smdistributed.dataparallel.torch.distributed` 已弃用。改为使用 [torch.distributed](https://pytorch.org/docs/stable/distributed.html) 软件包。
`smdistributed.dataparallel.torch.parallel.DistributedDataParallel` 已弃用。使用 [torch.nn.parallel。 DistributedDataParallel](https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html)改用 API。
如果您需要使用该库的早期版本（v1.3.0 或更早版本），请参阅 AI *SageMaker Python* SDK 文档中[存档的 SageMaker AI 分布式数据并行性文档](https://sagemaker.readthedocs.io/en/stable/api/training/sdp_versions/latest.html#documentation-archive)。

### PyTorch 闪电
<a name="distributed-data-parallel-supported-frameworks-lightning"></a>

SMDDP 库适用于以下 SageMaker AI 框架容器 PyTorch 和 SMP Docker 容器中的 L PyTorch ightning。

**PyTorch 闪电 v2**


| PyTorch 闪电版 | PyTorch 版本 | SMDDP 库版本 | SageMaker 预装了 SMDDP 的 AI 框架容器镜像 | 预装了 SMDDP 的 SMP Docker 映像 | 二进制文件的 URL\$1\$1 | 
| --- | --- | --- | --- | --- | --- | 
| 2.2.5 | 2.3.0 | smdistributed-dataparallel==v2.3.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker | 当前无可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed\$1dataparallel-2.3.0-cp311-cp311-linux\$1x86\$164.whl | 
| 2.2.0 | 2.2.0 | smdistributed-dataparallel==v2.2.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.2.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed\$1dataparallel-2.2.0-cp310-cp310-linux\$1x86\$164.whl | 
| 2.1.2 | 2.1.0 | smdistributed-dataparallel==v2.1.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed\$1dataparallel-2.1.0-cp310-cp310-linux\$1x86\$164.whl | 
| 2.1.0 | 2.0.1 | smdistributed-dataparallel==v2.0.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker | 不可用 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed\$1dataparallel-2.0.2-cp310-cp310-linux\$1x86\$164.whl | 

**PyTorch 闪电 v1**


| PyTorch 闪电版 | PyTorch 版本 | SMDDP 库版本 | SageMaker 预装了 SMDDP 的 AI 框架容器镜像 | 二进制文件的 URL\$1\$1 | 
| --- | --- | --- | --- | --- | 
|  1.7.2 1.7.0 1.6.4 1.6.3 1.5.10  | 1.12.0 | smdistributed-dataparallel==v1.5.0 | 763104351884.dkr.ecr。 <region>.amazonaws.com/pytorch-training：1.12.0-gpu-py38-cu113-ubuntu20.04-sagemaker | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.0/cu113/2022-07-01/smdistributed\$1dataparallel-1.5.0-cp38-cp38-linux\$1x86\$164.whl | 

\$1\$1 二进制文件用于在自定义容器中安装 SMDDP 库。 URLs 有关更多信息，请参阅 [使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器](data-parallel-bring-your-own-container.md)。

**注意**  
PyTorch Lightning 及其实用程序库（例如 Lightning Bolts）未预装在。 PyTorch DLCs在[步骤 2](https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html#data-parallel-framework-estimator) 中构建 A SageMaker I PyTorch 估算器并提交训练任务请求时，需要在 SageMaker AI PyTorch 训练`requirements.txt`容器`lightning-bolts`中提供安装`pytorch-lightning`和。  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
有关指定存放`requirements.txt`文件以及训练脚本和作业提交的源目录的更多信息，请参阅 *Amazon A SageMaker I Python SDK 文档*中的[使用第三方库](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)。

### Hugging Face Transformers
<a name="distributed-data-parallel-supported-frameworks-transformers"></a>

适用于 Hu AWS gging Face 的 Deep Learning Contain PyTorch er TensorFlow s 使用 SageMaker 训练容器作为基础图像。要查找 Hugging Face Transformers 库版本以及 PyTorch 配对版本 TensorFlow 和版本，请查看[最新的 Hugging Face 容器和之前的 Hu](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#huggingface-training-containers) ggin [g Fac](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#prior-hugging-face-container-versions) e 容器版本。

### TensorFlow （已弃用）
<a name="distributed-data-parallel-supported-frameworks-tensorflow"></a>

**重要**  
在 v2.11.0 之后，SMDDP 库已停止支持， TensorFlow 并且在 DLCs v2.11.0 TensorFlow 之后不再可用。下表列出了之前安装 DLCs 了 SMDDP 库的。 TensorFlow 


| TensorFlow 版本 | SMDDP 库版本 | 
| --- | --- | 
| 2.9.1、2.10.1、2.11.0 |  smdistributed-dataparallel==v1.4.1  | 
| 2.8.3 |  smdistributed-dataparallel==v1.3.0  | 

## AWS 区域
<a name="distributed-data-parallel-availablity-zone"></a>

SMDDP 库可在所有使用[ SageMaker 人工智能的 Deep Learning C AWS ontain](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) ers 和 [SMP Docker 镜像 AWS 区域](distributed-model-parallel-support-v2.md)的地方使用。

## 支持的实例类型
<a name="distributed-data-parallel-supported-instance-types"></a>

SMDDP 库需要以下实例类型之一。


| 实例类型 | 
| --- | 
| ml.p3dn.24xlarge\$1 | 
| ml.p4d.24xlarge | 
| ml.p4de.24xlarge | 

**提示**  
要在启用 EFA 的实例类型上正确运行分布式训练，您应该通过设置 VPC 的安全组来启用实例之间的流量，允许所有进出安全组的流量。要了解如何设置安全组规则，请参阅[《Amazon EC2 用户指南》](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)中的*步骤 1：准备启用 EFA 的安全组*。

**重要**  
\$1 SMDDP 库已停止支持在 P3 实例上优化其集体通信操作。虽然您仍然可以在 `ml.p3dn.24xlarge` 实例上使用 SMDDP 优化的 `AllReduce` 集合，但将不再提供进一步的开发支持，以提高此实例类型的性能。请注意，SMDDP 优化的 `AllGather` 集合仅适用于 P4 实例。

有关实例类型的规格，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)页面中的**加速计算**部分。有关实例定价的信息，请参阅 [Amazon SageMaker 定价](https://aws.amazon.com/sagemaker/pricing/)。

如果您遇到类似以下内容的错误消息，请按照[请求增加 SageMaker AI 资源的服务配额中的说明进行](https://docs.aws.amazon.com/sagemaker/latest/dg/regions-quotas.html#service-limit-increase-request-procedure)操作。

```
ResourceLimitExceeded: An error occurred (ResourceLimitExceeded) when calling
the CreateTrainingJob operation: The account-level service limit 'ml.p3dn.24xlarge
for training job usage' is 0 Instances, with current utilization of 0 Instances
and a request delta of 1 Instances.
Please contact AWS support to request an increase for this limit.
```

# 使用 SageMaker AI 分布式数据并行库进行分布式训练
<a name="data-parallel-modify-sdp"></a>

 SageMaker AI 分布式数据并行度 (SMDDP) 库专为易于使用和提供无缝集成而设计。 PyTorch

使用 SageMaker AI 上的 SMDDP 库训练深度学习模型时，您可以专注于编写训练脚本和模型训练。

要开始使用，请导入 SMDDP 库，以使用其针对 AWS优化的集体操作。以下主题将根据您要优化的集体操作，说明应在训练脚本中添加哪些内容。

**Topics**
+ [调整训练脚本以使用 SMDDP 集体操作](data-parallel-modify-sdp-select-framework.md)
+ [使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md)

# 调整训练脚本以使用 SMDDP 集体操作
<a name="data-parallel-modify-sdp-select-framework"></a>

本节提供的训练脚本示例经过简化，仅突出显示了在训练脚本中启用 SageMaker AI 分布式数据并行性 (SMDDP) 库所需的更改。有关演示如何使用 SMDDP 库运行分布式训练作业的 end-to-end Jupyter 笔记本示例，请参阅。[Amazon SageMaker AI 数据并行库示例](distributed-data-parallel-v2-examples.md)

**Topics**
+ [在训练脚本中使用 SMDDP 库 PyTorch](data-parallel-modify-sdp-pt.md)
+ [在 L PyTorch ightning 训练脚本中使用 SMDDP 库](data-parallel-modify-sdp-pt-lightning.md)
+ [在 TensorFlow 训练脚本中使用 SMDDP 库（已弃用）](data-parallel-modify-sdp-tf2.md)

# 在训练脚本中使用 SMDDP 库 PyTorch
<a name="data-parallel-modify-sdp-pt"></a>

[从 SageMaker AI 分布式数据并行度 (SMDDP) 库 v1.4.0 开始，您可以将该库用作分布式包的后端选项。PyTorch ](https://pytorch.org/tutorials/beginner/dist_overview.html)要使用 SMDDP `AllReduce` 和`AllGather`集合操作，您只需要在训练脚本的开头导入 SMDDP 库，并在进程组初始化期间将 SMDDP 设置为 PyTorch 分布式模块的后端即可。使用单行后端规范，您可以保持所有原生 PyTorch 分布式模块和整个训练脚本不变。[以下代码片段展示了如何使用 SMDDP 库作为 PyTorch基于分布式训练包的后端：分布式[PyTorch 数据并行 (DDP)、PyTorch 完全分片数据并行](https://pytorch.org/docs/stable/notes/ddp.html)[性 (FSDP) 和威震](https://pytorch.org/docs/stable/fsdp.html)天-。[DeepSpeed](https://github.com/microsoft/DeepSpeed)DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed)

## 适用于 PyTorch DDP 或 FSDP
<a name="data-parallel-enable-for-ptddp-ptfsdp"></a>

进程组初始化如下。

```
import torch.distributed as dist
import smdistributed.dataparallel.torch.torch_smddp

dist.init_process_group(backend="smddp")
```

**注意**  
（仅适用于 PyTorch DDP 作业）`smddp`后端目前不支持使用 API 创建子流程组。`torch.distributed.new_group()`您也不能同时使用 `smddp` 后端和其他进程组后端，如 `NCCL` 和 `Gloo`。

## 对于我们的 DeepSpeed 威震天-DeepSpeed
<a name="data-parallel-enable-for-deepspeed"></a>

进程组初始化如下。

```
import deepspeed
import smdistributed.dataparallel.torch.torch_smddp

deepspeed.init_distributed(dist_backend="smddp")
```

**注意**  
要将 SMDDP `AllGather` 与 [使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md) 中基于 `mpirun` 的启动器（`smdistributed` 和 `pytorchddp`）配合使用，还需要在训练脚本中设置以下环境变量。  

```
export SMDATAPARALLEL_OPTIMIZE_SDP=true
```

有关编写 PyTorch FSDP 训练脚本的一般指导，请参阅文档中的[使用完全分片数据并行 (FSDP) 进行高级模型训练](https://pytorch.org/tutorials/intermediate/FSDP_adavnced_tutorial.html)。 PyTorch

有关编写 PyTorch DDP 训练脚本的一般指导，请参阅 PyTorch 文档中的[分布式并行数据入门](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html)。

调整完训练脚本后，继续到 [使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md)。

# 在 L PyTorch ightning 训练脚本中使用 SMDDP 库
<a name="data-parallel-modify-sdp-pt-lightning"></a>

如果您想使用 [PyTorchLightning](https://pytorch-lightning.readthedocs.io/en/latest/starter/introduction.html) 训练脚本并在 SageMaker AI 中运行分布式数据并行训练作业，则只需对训练脚本进行最少更改即可运行训练作业。必要的更改包括：导入`smdistributed.dataparallel`库的 PyTorch 模块，设置 L PyTorch ightning 的环境变量以接受 SageMaker 训练工具包预设的 SageMaker AI 环境变量，以及通过将流程组后端设置为来激活 SMDDP 库。`"smddp"`要了解详情，请仔细阅读以下分别介绍了各个步骤并提供代码示例的说明。

**注意**  
 PyTorch Lightning 支持在 SageMaker AI 数据并行库 v1.5.0 及更高版本中可用。

## PyTorch Lightning == v2.1.0 和 == 2.0.1 PyTorch
<a name="smddp-pt-201-lightning-210"></a>

1. 导入 `pytorch_lightning` 库和 `smdistributed.dataparallel.torch` 模块。

   ```
   import lightning as pl
   import smdistributed.dataparallel.torch.torch_smddp
   ```

1. 实例化。[LightningEnvironment](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.plugins.environments.LightningEnvironment.html)

   ```
   from lightning.fabric.plugins.environments.lightning import LightningEnvironment
   
   env = LightningEnvironment()
   env.world_size = lambda: int(os.environ["WORLD_SIZE"])
   env.global_rank = lambda: int(os.environ["RANK"])
   ```

1. **对于 PyTorch DDP** — 使用 for `process_group_backend` 和 `"gpu"` for 创建[DDPStrategy](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.strategies.DDPStrategy.html)类`"smddp"`的对象`accelerator`，然后将其传递给 T [rainer](https://pytorch-lightning.readthedocs.io/en/stable/common/trainer.html) 类。

   ```
   import lightning as pl
   from lightning.pytorch.strategies import DDPStrategy
   
   ddp = DDPStrategy(
       cluster_environment=env, 
       process_group_backend="smddp", 
       accelerator="gpu"
   )
   
   trainer = pl.Trainer(
       max_epochs=200, 
       strategy=ddp, 
       devices=num_gpus, 
       num_nodes=num_nodes
   )
   ```

   **对于 PyTorch FSDP** — 使用 for `process_group_backend` 和 `"gpu"` for 创建[FSDPStrategy](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.strategies.FSDPStrategy.html)类的对象（可选择[包装策略](https://pytorch.org/docs/stable/fsdp.html)）`accelerator`，然后将其传递给 T [rainer](https://pytorch-lightning.readthedocs.io/en/stable/common/trainer.html) 类。`"smddp"`

   ```
   import lightning as pl
   from lightning.pytorch.strategies import FSDPStrategy
   
   from functools import partial
   from torch.distributed.fsdp.wrap import size_based_auto_wrap_policy
   
   policy = partial(
       size_based_auto_wrap_policy, 
       min_num_params=10000
   )
   
   fsdp = FSDPStrategy(
       auto_wrap_policy=policy,
       process_group_backend="smddp", 
       cluster_environment=env
   )
   
   trainer = pl.Trainer(
       max_epochs=200, 
       strategy=fsdp, 
       devices=num_gpus, 
       num_nodes=num_nodes
   )
   ```

调整完训练脚本后，继续到 [使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md)。

**注意**  
构建 A SageMaker I PyTorch 估算器并在中提交训练任务请求时[使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md)，需要在 SageMaker AI PyTorch 训练`requirements.txt`容器`lightning-bolts`中提供安装`pytorch-lightning`和。  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
有关指定存放`requirements.txt`文件以及训练脚本和作业提交的源目录的更多信息，请参阅 *Amazon A SageMaker I Python SDK 文档*中的[使用第三方库](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)。

# 在 TensorFlow 训练脚本中使用 SMDDP 库（已弃用）
<a name="data-parallel-modify-sdp-tf2"></a>

**重要**  
在 v2.11.0 之后，SMDDP 库已停止支持， TensorFlow 并且在 DLCs v2.11.0 TensorFlow 之后不再可用。要查找以前安装了 TensorFlow DLCs SMDDP 库的情况，请参阅。[支持的框架](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)

以下步骤向您展示如何修改 TensorFlow 训练脚本以利用 SageMaker AI 的分布式数据 parallel 库。  

该库 APIs 的设计类似于 Horovod APIs。有关该库提供的每个 API 的更多详细信息 TensorFlow，请参阅 [SageMaker AI 分布式数据 parallel TensorFlow API 文档](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html#api-documentation)。

**注意**  
SageMaker AI 分布式数据 parallel 适用于由除`tf.keras`模块之外的`tf`核心模块组成的 TensorFlow 训练脚本。 SageMaker 人工智能分布式数据 parallel 不支持 Ker TensorFlow as 实现。

**注意**  
 SageMaker AI 分布式数据并行度库支持开箱即用的自动混合精度 (AMP)。除了对训练脚本进行框架级别的修改之外，您无需执行额外操作即可启用 AMP。如果有梯度 FP16，则 SageMaker AI 数据并行度库将在中运行其操作。`AllReduce` FP16有关在训练脚本中实现 AMP APIs 的更多信息，请参阅以下资源：  
[框架- TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow) 在 *NVIDIA 深度学习性能文档*中
*NVIDIA 开发人员文档*中的[适用于深度学习的自动混合精度](https://developer.nvidia.com/automatic-mixed-precision)
TensorFlow *TensorFlow文档 APIs*中的@@ [精度好坏参半](https://www.tensorflow.org/guide/mixed_precision)

1. 导入库的 TensorFlow 客户端并对其进行初始化。

   ```
   import smdistributed.dataparallel.tensorflow as sdp 
   sdp.init()
   ```

1. 使用 `local_rank` 将每个 GPU 固定到一个 `smdistributed.dataparallel` 进程，这表示进程在给定节点中的相对秩。`sdp.tensorflow.local_rank()` API 向您提供设备的局部秩。领导节点的秩为 0，Worker 节点的秩为 1、2、3，依此类推。在以下代码块中将其调用为`sdp.local_rank()`。 `set_memory_growth`与分布式 SageMaker AI 没有直接关系，但必须将其设置为使用进行分布式训练 TensorFlow。

   ```
   gpus = tf.config.experimental.list_physical_devices('GPU')
   for gpu in gpus:
       tf.config.experimental.set_memory_growth(gpu, True)
   if gpus:
       tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')
   ```

1. 根据工作线程数扩展学习率。`sdp.tensorflow.size()` API 为您提供集群中工作线程的数量。以下代码块中将其作为 `sdp.size()` 调用。

   ```
   learning_rate = learning_rate * sdp.size()
   ```

1. 在训练期间，使用库的 `DistributedGradientTape` 来优化 `AllReduce` 操作。这会包装 `tf.GradientTape`。  

   ```
   with tf.GradientTape() as tape:
         output = model(input)
         loss_value = loss(label, output)
       
   # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
   tape = sdp.DistributedGradientTape(tape)
   ```

1. 将初始模型变量从领导节点（秩 0）广播到所有 Worker 节点（秩 1 到 n）。这是确保对所有工作线程秩进行一致的初始化所必需的。在模型和优化器变量初始化后使用 `sdp.tensorflow.broadcast_variables` API。以下代码块中将其作为 `sdp.broadcast_variables()` 调用。

   ```
   sdp.broadcast_variables(model.variables, root_rank=0)
   sdp.broadcast_variables(opt.variables(), root_rank=0)
   ```

1. 最后，修改脚本，仅在领导节点上保存检查点。领导节点具有同步模型。这还可以避免 Worker 节点覆盖检查点并可能损坏检查点。

   ```
   if sdp.rank() == 0:
       checkpoint.save(checkpoint_dir)
   ```

以下是使用库进行分布式 TensorFlow 训练的示例训练脚本。

```
import tensorflow as tf

# SageMaker AI data parallel: Import the library TF API
import smdistributed.dataparallel.tensorflow as sdp

# SageMaker AI data parallel: Initialize the library
sdp.init()

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
    # SageMaker AI data parallel: Pin GPUs to a single library process
    tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')

# Prepare Dataset
dataset = tf.data.Dataset.from_tensor_slices(...)

# Define Model
mnist_model = tf.keras.Sequential(...)
loss = tf.losses.SparseCategoricalCrossentropy()

# SageMaker AI data parallel: Scale Learning Rate
# LR for 8 node run : 0.000125
# LR for single node run : 0.001
opt = tf.optimizers.Adam(0.000125 * sdp.size())

@tf.function
def training_step(images, labels, first_batch):
    with tf.GradientTape() as tape:
        probs = mnist_model(images, training=True)
        loss_value = loss(labels, probs)

    # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
    tape = sdp.DistributedGradientTape(tape)

    grads = tape.gradient(loss_value, mnist_model.trainable_variables)
    opt.apply_gradients(zip(grads, mnist_model.trainable_variables))

    if first_batch:
       # SageMaker AI data parallel: Broadcast model and optimizer variables
       sdp.broadcast_variables(mnist_model.variables, root_rank=0)
       sdp.broadcast_variables(opt.variables(), root_rank=0)

    return loss_value

...

# SageMaker AI data parallel: Save checkpoints only from master node.
if sdp.rank() == 0:
    checkpoint.save(checkpoint_dir)
```

调整完训练脚本后，请继续到[使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业](data-parallel-use-api.md)。

# 使用 Python SageMaker SDK 使用 SMDDP 启动分布式训练作业
<a name="data-parallel-use-api"></a>

要使用改编后的脚本运行分布式训练作业[调整训练脚本以使用 SMDDP 集体操作](data-parallel-modify-sdp-select-framework.md)，请使用 SageMaker Python SDK 的框架或通用估算器，将准备好的训练脚本指定为入口点脚本并将分布式训练配置指定为分布式训练配置。

本页将引导你了解如何通过两种方式使用 [SageMaker AI Python SDK](https://sagemaker.readthedocs.io/en/stable/api/training/index.html)。
+ 如果您想在 SageMaker AI 中快速采用分布式训练作业，请配置 A SageMaker I [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch)或[TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator)框架估算器类。框架估算器会获取您的训练脚本，并根据为参数指定的值，自动匹配[预构建 PyTorch 或 TensorFlow 深度学习容器 (DLC)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) 的正确图像 URI。`framework_version`
+ 如果您想扩展其中一个预建容器或构建一个自定义容器来创建自己的带有 SageMaker AI 的机器学习环境，请使用 A SageMaker I 通用`Estimator`类并指定托管在亚马逊弹性容器注册表 (Amazon ECR) 中的自定义 Docker 容器的映像 URI。

您的训练数据集应存储在启动训练作业的 A [mazon S3 或 Amazon FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html) AWS 区域 中。如果您使用 Jupyter 笔记本，则应在同一个 SageMaker 笔记本实例或 SageMaker Studio Classic 应用程序中运行。 AWS 区域有关存储训练数据的更多信息，请参阅 [SageMaker Python SDK 数据输入](https://sagemaker.readthedocs.io/en/stable/overview.html#use-file-systems-as-training-input)文档。

**提示**  
我们建议您使用 Amazon f FSx or Lustre 而不是 Amazon S3 来提高训练绩效。与 Amazon S3 相比，Amazon FSx 具有更高的吞吐量和更低的延迟。

**提示**  
要在启用 EFA 的实例类型上正确运行分布式训练，您应该通过设置 VPC 的安全组来启用实例之间的流量，允许所有进出安全组的流量。要了解如何设置安全组规则，请参阅[《Amazon EC2 用户指南》](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)中的*步骤 1：准备启用 EFA 的安全组*。

选择以下主题之一，了解如何运行训练脚本的分布式训练作业。启动训练作业后，您可以使用[Amazon SageMaker 调试器](train-debugger.md)或 Amazon 监控系统利用率和模型性能 CloudWatch。

在您按照以下主题中的说明来详细了解技术细节时，我们还建议您尝试通过[Amazon SageMaker AI 数据并行库示例](distributed-data-parallel-v2-examples.md)开始试用。

**Topics**
+ [使用 Python SageMaker 软件开发工具包中的 PyTorch 框架估算器](data-parallel-framework-estimator.md)
+ [使用 SageMaker AI 通用估算器扩展预建的 DLC 容器](data-parallel-use-python-skd-api.md)
+ [使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器](data-parallel-bring-your-own-container.md)

# 使用 Python SageMaker 软件开发工具包中的 PyTorch 框架估算器
<a name="data-parallel-framework-estimator"></a>

您可以通过向 SageMaker AI 框架估算器添加`distribution`参数来启动分布式训练，[https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch)或者。[https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator)有关更多详细信息，请从以下选项中选择 SageMaker AI 分布式数据并行性 (SMDDP) 库支持的框架之一。

------
#### [ PyTorch ]

以下启动器选项可用于启动 PyTorch 分布式训练。
+ `pytorchddp`— 此选项运行`mpirun`并设置在 SageMaker AI 上运行 PyTorch 分布式训练所需的环境变量。要使用此选项，请在 `distribution` 参数中输入以下字典。

  ```
  { "pytorchddp": { "enabled": True } }
  ```
+ `torch_distributed`— 此选项运行`torchrun`并设置在 SageMaker AI 上运行 PyTorch 分布式训练所需的环境变量。要使用此选项，请在 `distribution` 参数中输入以下字典。

  ```
  { "torch_distributed": { "enabled": True } }
  ```
+ `smdistributed`— 此选项也可以运行，`mpirun`但`smddprun`可以设置在 SageMaker AI 上运行 PyTorch 分布式训练所需的环境变量。

  ```
  { "smdistributed": { "dataparallel": { "enabled": True } } }
  ```

如果您选择将 NCCL `AllGather` 替换为 SMDDP `AllGather`，则可以使用所有三个选项。选择一个适合您使用场景的选项。

如果您选择用 SMDDP `AllReduce` 替换 NCCL `AllReduce`，则应选择基于 `mpirun` 的选项之一：`smdistributed` 或 `pytorchddp`。您还可以添加以下 MPI 选项。

```
{ 
    "pytorchddp": {
        "enabled": True, 
        "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"
    }
}
```

```
{ 
    "smdistributed": { 
        "dataparallel": {
            "enabled": True, 
            "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"
        }
    }
}
```

以下代码示例显示了具有分布式训练选项的 PyTorch 估计器的基本结构。

```
from sagemaker.pytorch import PyTorch

pt_estimator = PyTorch(
    base_job_name="training_job_name_prefix",
    source_dir="subdirectory-to-your-code",
    entry_point="adapted-training-script.py",
    role="SageMakerRole",
    py_version="py310",
    framework_version="2.0.1",

    # For running a multi-node distributed training job, specify a value greater than 1
    # Example: 2,3,4,..8
    instance_count=2,

    # Instance types supported by the SageMaker AI data parallel library: 
    # ml.p4d.24xlarge, ml.p4de.24xlarge
    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
)

pt_estimator.fit("s3://bucket/path/to/training/data")
```

**注意**  
PyTorch Lightning 及其实用程序库（例如 Lightning Bolts）未预装在 SageMaker AI PyTorch DLCs 中。创建以下 `requirements.txt` 文件，并将该文件保存到用于保存训练脚本的源目录中。  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
例如，树结构目录应如下所示。  

```
├── pytorch_training_launcher_jupyter_notebook.ipynb
└── sub-folder-for-your-code
    ├──  adapted-training-script.py
    └──  requirements.txt
```
有关指定存放`requirements.txt`文件以及训练脚本和作业提交的源目录的更多信息，请参阅 *Amazon A SageMaker I Python SDK 文档*中的[使用第三方库](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)。

**启动 SMDDP 集体操作和使用正确的分布式训练启动器选项的考虑因素**
+ SMDDP `AllReduce` 和 SMDDP `AllGather` 目前并不相互兼容。
+ 在使用 `smdistributed` 或 `pytorchddp`（基于 `mpirun` 的启动器）和 NCCL `AllGather` 时，SMDDP `AllReduce` 默认为激活状态。
+ 使用 `torch_distributed` 启动器时，SMDDP `AllGather` 默认处于激活状态，而 `AllReduce` 则返回到 NCCL。
+ 在使用基于 `mpirun` 的启动器时，还可以通过如下设置的附加环境变量激活 SMDDP `AllGather`。

  ```
  export SMDATAPARALLEL_OPTIMIZE_SDP=true
  ```

------
#### [ TensorFlow ]

**重要**  
在 v2.11.0 之后，SMDDP 库已停止支持， TensorFlow 并且在 DLCs v2.11.0 TensorFlow 之后不再可用。要查找以前安装了 TensorFlow DLCs SMDDP 库的情况，请参阅。[TensorFlow （已弃用）](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks-tensorflow)

```
from sagemaker.tensorflow import TensorFlow

tf_estimator = TensorFlow(
    base_job_name = "training_job_name_prefix",
    entry_point="adapted-training-script.py",
    role="SageMakerRole",
    framework_version="2.11.0",
    py_version="py38",

    # For running a multi-node distributed training job, specify a value greater than 1
    # Example: 2,3,4,..8
    instance_count=2,

    # Instance types supported by the SageMaker AI data parallel library: 
    # ml.p4d.24xlarge, ml.p3dn.24xlarge, and ml.p3.16xlarge
    instance_type="ml.p3.16xlarge",

    # Training using the SageMaker AI data parallel distributed training strategy
    distribution={ "smdistributed": { "dataparallel": { "enabled": True } } }
)

tf_estimator.fit("s3://bucket/path/to/training/data")
```

------

# 使用 SageMaker AI 通用估算器扩展预建的 DLC 容器
<a name="data-parallel-use-python-skd-api"></a>

您可以自定义 SageMaker AI 预先构建的容器或对其进行扩展，以处理预构建的 SageMaker AI Docker 镜像不支持的算法或模型的任何其他功能要求。有关如何扩展预构建容器的示例，请参阅[扩展预构建容器](https://docs.aws.amazon.com/sagemaker/latest/dg/prebuilt-containers-extend.html)。

要扩展预构建的容器或调整您自己的容器以使用该库，您必须使用[支持的框架](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)中列出的映像之一。

**注意**  
从 TensorFlow 2.4.1 和 PyTorch 1.8.1 开始， SageMaker AI 框架 DLCs 支持启用 EFA 的实例类型。我们建议您使用包含 TensorFlow 2.4.1 或更高版本以及 PyTorch 1.8.1 或更高版本的 DLC 镜像。

例如，如果您使用 PyTorch，则您的 Dockerfile 应包含类似于以下内容的`FROM`语句：

```
# SageMaker AI PyTorch image
FROM 763104351884.dkr.ecr.<aws-region>.amazonaws.com/pytorch-training:<image-tag>

ENV PATH="/opt/ml/code:${PATH}"

# this environment variable is used by the SageMaker AI PyTorch container to determine our user code directory.
ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code

# /opt/ml and all subdirectories are utilized by SageMaker AI, use the /code subdirectory to store your user code.
COPY train.py /opt/ml/code/train.py

# Defines cifar10.py as script entrypoint
ENV SAGEMAKER_PROGRAM train.py
```

您可以使用[SageMaker 训练工具包](https://github.com/aws/sagemaker-training-toolkit)和 SageMaker AI 分布式数据 parallel 库的二进制文件进一步自定义自己的 Docker 容器以与 SageMaker AI 配合使用。要了解更多信息，请参阅以下部分中的说明。

# 使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器
<a name="data-parallel-bring-your-own-container"></a>

要构建自己的 Docker 容器进行训练并使用 SageMaker AI 数据并行库，您必须在 Dockerfile 中包含正确的依赖项和 SageMaker AI 分布式并行库的二进制文件。本节提供有关如何使用数据 parallel 库创建具有最小依赖关系的完整 Dockerfile，以便在 SageMaker AI 中进行分布式训练。

**注意**  
此自定义 Docker 选项将 SageMaker AI 数据并行库作为二进制文件仅适用于。 PyTorch

**使用 SageMaker 训练工具包和数据并行库创建 Dockerfile**

1. 使用 [NVIDIA CUDA](https://hub.docker.com/r/nvidia/cuda) 提供的 Docker 映像开始。[使用包含 CUDA 运行时和开发工具（头文件和库）的 cuDNN 开发者版本从源代码进行构建。PyTorch ](https://github.com/pytorch/pytorch#from-source)

   ```
   FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
   ```
**提示**  
官方的 AWS 深度学习容器 (DLC) 镜像是基于 [NVIDIA CUDA 基础](https://hub.docker.com/r/nvidia/cuda)镜像构建的。如果你想在按照其余说明进行操作的同时使用预构建的 DLC 镜像作为参考，请参阅[适用 PyTorch 于 Dockerfiles 的 Dee AWS p Learning Container](https://github.com/aws/deep-learning-containers/tree/master/pytorch) s。

1. 添加以下参数以指定软件包 PyTorch 和其他软件包的版本。此外，请指明指向 A SageMaker I 数据并行库和其他使用 AWS 资源的软件（例如 Amazon S3 插件）的 Amazon S3 存储桶路径。

   要使用除以下代码示例中提供的版本之外的第三方库版本，我们建议您查看[AWS 深度学习容器的官方 Dockerfiles](https://github.com/aws/deep-learning-containers/tree/master/pytorch/training/docker)， PyTorch以查找经过测试、兼容且适合您的应用程序的版本。

   要 URLs 查找`SMDATAPARALLEL_BINARY`参数，请参阅中的查找表[支持的框架](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)。

   ```
   ARG PYTORCH_VERSION=1.10.2
   ARG PYTHON_SHORT_VERSION=3.8
   ARG EFA_VERSION=1.14.1
   ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl
   ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl
   ARG CONDA_PREFIX="/opt/conda"
   ARG BRANCH_OFI=1.1.3-aws
   ```

1. 设置以下环境变量以正确构建 SageMaker 训练组件并运行数据 parallel 库。在后续步骤中，您将为组件使用这些变量。

   ```
   # Set ENV variables required to build PyTorch
   ENV TORCH_CUDA_ARCH_LIST="7.0+PTX 8.0"
   ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
   ENV NCCL_VERSION=2.10.3
   
   # Add OpenMPI to the path.
   ENV PATH /opt/amazon/openmpi/bin:$PATH
   
   # Add Conda to path
   ENV PATH $CONDA_PREFIX/bin:$PATH
   
   # Set this enviroment variable for SageMaker AI to launch SMDDP correctly.
   ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main
   
   # Add enviroment variable for processes to be able to call fork()
   ENV RDMAV_FORK_SAFE=1
   
   # Indicate the container type
   ENV DLC_CONTAINER_TYPE=training
   
   # Add EFA and SMDDP to LD library path
   ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH"
   ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH
   ```

1. 在后续步骤中安装或更新 `curl`、`wget` 和 `git`，以下载和构建软件包。

   ```
   RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
       apt-get update && apt-get install -y  --no-install-recommends \
           curl \
           wget \
           git \
       && rm -rf /var/lib/apt/lists/*
   ```

1. 安装用于 Amazon EC2 网络通信的 [Elastic Fabric Adapter (EFA)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) 软件。

   ```
   RUN DEBIAN_FRONTEND=noninteractive apt-get update
   RUN mkdir /tmp/efa \
       && cd /tmp/efa \
       && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \
       && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \
       && cd aws-efa-installer \
       && ./efa_installer.sh -y --skip-kmod -g \
       && rm -rf /tmp/efa
   ```

1. 安装 [Conda](https://docs.conda.io/en/latest/) 来处理软件包管理。

   ```
   RUN curl -fsSL -v -o ~/miniconda.sh -O  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh  && \
       chmod +x ~/miniconda.sh && \
       ~/miniconda.sh -b -p $CONDA_PREFIX && \
       rm ~/miniconda.sh && \
       $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \
       $CONDA_PREFIX/bin/conda clean -ya
   ```

1. 获取、构建、安装 PyTorch 及其依赖关系。我们[使用源代码进行](https://github.com/pytorch/pytorch#from-source)构建PyTorch ，因为我们需要控制 NCCL 版本以保证与 [AWS OFI](https://github.com/aws/aws-ofi-nccl) NCCL 插件的兼容性。

   1. 按照[PyTorch 官方 dockerfil](https://github.com/pytorch/pytorch/blob/master/Dockerfile) e 中的步骤，安装构建依赖项并设置 [ccache](https://ccache.dev/) 以加快重新编译速度。

      ```
      RUN DEBIAN_FRONTEND=noninteractive \
          apt-get install -y --no-install-recommends \
              build-essential \
              ca-certificates \
              ccache \
              cmake \
              git \
              libjpeg-dev \
              libpng-dev \
          && rm -rf /var/lib/apt/lists/*
        
      # Setup ccache
      RUN /usr/sbin/update-ccache-symlinks
      RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache
      ```

   1. 安装程序[PyTorch的常见依赖项和 Linux 依赖项](https://github.com/pytorch/pytorch#install-dependencies)。

      ```
      # Common dependencies for PyTorch
      RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
      
      # Linux specific dependency for PyTorch
      RUN conda install -c pytorch magma-cuda113
      ```

   1. 克隆[PyTorch GitHub存储库](https://github.com/pytorch/pytorch)。

      ```
      RUN --mount=type=cache,target=/opt/ccache \
          cd / \
          && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION}
      ```

   1. 安装并构建特定的 [NCCL](https://developer.nvidia.com/nccl) 版本。为此，请将默认 NCCL 文件夹 (`/pytorch/third_party/nccl`) 中的内容替换为 NVIDIA 存储库中的特定 NCCL 版本。 PyTorchNCCL 版本在本指南的第 3 步中设置。

      ```
      RUN cd /pytorch/third_party/nccl \
          && rm -rf nccl \
          && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \
          && cd nccl \
          && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \
          && make pkg.txz.build \
          && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1
      ```

   1. 构建并安装 PyTorch。完成此过程通常需要 1 个小时多一点。它使用上一步中下载的 NCCL 版本构建。

      ```
      RUN cd /pytorch \
          && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \
          python setup.py install \
          && rm -rf /pytorch
      ```

1. 构建并安装 [AWS OFI NCCL 插件](https://github.com/aws/aws-ofi-nccl)。这使得 [libfabric](https://github.com/ofiwg/libfabric) 支持 SageMaker 人工智能数据并行库。

   ```
   RUN DEBIAN_FRONTEND=noninteractive apt-get update \
       && apt-get install -y --no-install-recommends \
           autoconf \
           automake \
           libtool
   RUN mkdir /tmp/efa-ofi-nccl \
       && cd /tmp/efa-ofi-nccl \
       && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \
       && cd aws-ofi-nccl \
       && ./autogen.sh \
       && ./configure --with-libfabric=/opt/amazon/efa \
       --with-mpi=/opt/amazon/openmpi \
       --with-cuda=/usr/local/cuda \
       --with-nccl=$CONDA_PREFIX \
       && make \
       && make install \
       && rm -rf /tmp/efa-ofi-nccl
   ```

1. 构建并安装[TorchVision](https://github.com/pytorch/vision.git)。

   ```
   RUN pip install --no-cache-dir -U \
       packaging \
       mpi4py==3.0.3
   RUN cd /tmp \
       && git clone https://github.com/pytorch/vision.git -b v0.9.1 \
       && cd vision \
       && BUILD_VERSION="0.9.1+cu111" python setup.py install \
       && cd /tmp \
       && rm -rf vision
   ```

1. 安装和配置 OpenSSH。MPI 需要使用 OpenSSH 在容器之间进行通信。允许 OpenSSH 与容器通信而无需请求确认。

   ```
   RUN apt-get update \
       && apt-get install -y  --allow-downgrades --allow-change-held-packages --no-install-recommends \
       && apt-get install -y --no-install-recommends openssh-client openssh-server \
       && mkdir -p /var/run/sshd \
       && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \
       && echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \
       && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \
       && rm -rf /var/lib/apt/lists/*
   
   # Configure OpenSSH so that nodes can communicate with each other
   RUN mkdir -p /var/run/sshd && \
    sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
   RUN rm -rf /root/.ssh/ && \
    mkdir -p /root/.ssh/ && \
    ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \
    cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \
    && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config
   ```

1. 安装 PT S3 插件以高效访问 Amazon S3 中的数据集。

   ```
   RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU}
   RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt
   ```

1. 安装 [libboost](https://www.boost.org/) 库。此软件包是将 SageMaker AI 数据并行库的异步 IO 功能联网所必需的。

   ```
   WORKDIR /
   RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \
       && tar -xzf boost_1_73_0.tar.gz \
       && cd boost_1_73_0 \
       && ./bootstrap.sh \
       && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \
       && cd .. \
       && rm -rf boost_1_73_0.tar.gz \
       && rm -rf boost_1_73_0 \
       && cd ${CONDA_PREFIX}/include/boost
   ```

1. 安装以下 SageMaker AI 工具进行 PyTorch 训练。

   ```
   WORKDIR /root
   RUN pip install --no-cache-dir -U \
       smclarify \
       "sagemaker>=2,<3" \
       sagemaker-experiments==0.* \
       sagemaker-pytorch-training
   ```

1. 最后，安装 SageMaker AI 数据 parallel 二进制文件和其余依赖项。

   ```
   RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
     apt-get update && apt-get install -y  --no-install-recommends \
     jq \
     libhwloc-dev \
     libnuma1 \
     libnuma-dev \
     libssl1.1 \
     libtool \
     hwloc \
     && rm -rf /var/lib/apt/lists/*
   
   RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
   ```

1. 创建 Dockerfile 后，请参阅[调整自己的训练容器，了解如何构建 Docker 容器](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html)，将其托管在 Amazon ECR 中，以及如何使用 Python SDK 运行训练作业。 SageMaker 

以下示例代码显示了将之前所有代码块组合在一起的完整 Dockerfile。

```
# This file creates a docker image with minimum dependencies to run SageMaker AI data parallel training
FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

# Set appropiate versions and location for components
ARG PYTORCH_VERSION=1.10.2
ARG PYTHON_SHORT_VERSION=3.8
ARG EFA_VERSION=1.14.1
ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl
ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl
ARG CONDA_PREFIX="/opt/conda"
ARG BRANCH_OFI=1.1.3-aws

# Set ENV variables required to build PyTorch
ENV TORCH_CUDA_ARCH_LIST="3.7 5.0 7.0+PTX 8.0"
ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
ENV NCCL_VERSION=2.10.3

# Add OpenMPI to the path.
ENV PATH /opt/amazon/openmpi/bin:$PATH

# Add Conda to path
ENV PATH $CONDA_PREFIX/bin:$PATH

# Set this enviroment variable for SageMaker AI to launch SMDDP correctly.
ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main

# Add enviroment variable for processes to be able to call fork()
ENV RDMAV_FORK_SAFE=1

# Indicate the container type
ENV DLC_CONTAINER_TYPE=training

# Add EFA and SMDDP to LD library path
ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH"
ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH

# Install basic dependencies to download and build other dependencies
RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
  apt-get update && apt-get install -y  --no-install-recommends \
  curl \
  wget \
  git \
  && rm -rf /var/lib/apt/lists/*

# Install EFA.
# This is required for SMDDP backend communication
RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN mkdir /tmp/efa \
    && cd /tmp/efa \
    && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \
    && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \
    && cd aws-efa-installer \
    && ./efa_installer.sh -y --skip-kmod -g \
    && rm -rf /tmp/efa

# Install Conda
RUN curl -fsSL -v -o ~/miniconda.sh -O  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh  && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_PREFIX && \
    rm ~/miniconda.sh && \
    $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \
    $CONDA_PREFIX/bin/conda clean -ya

# Install PyTorch.
# Start with dependencies listed in official PyTorch dockerfile
# https://github.com/pytorch/pytorch/blob/master/Dockerfile
RUN DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
        build-essential \
        ca-certificates \
        ccache \
        cmake \
        git \
        libjpeg-dev \
        libpng-dev && \
    rm -rf /var/lib/apt/lists/*

# Setup ccache
RUN /usr/sbin/update-ccache-symlinks
RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache

# Common dependencies for PyTorch
RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses

# Linux specific dependency for PyTorch
RUN conda install -c pytorch magma-cuda113

# Clone PyTorch
RUN --mount=type=cache,target=/opt/ccache \
    cd / \
    && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION}
# Note that we need to use the same NCCL version for PyTorch and OFI plugin.
# To enforce that, install NCCL from source before building PT and OFI plugin.

# Install NCCL.
# Required for building OFI plugin (OFI requires NCCL's header files and library)
RUN cd /pytorch/third_party/nccl \
    && rm -rf nccl \
    && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \
    && cd nccl \
    && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \
    && make pkg.txz.build \
    && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1

# Build and install PyTorch.
RUN cd /pytorch \
    && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \
    python setup.py install \
    && rm -rf /pytorch

RUN ccache -C

# Build and install OFI plugin. \
# It is required to use libfabric.
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
    && apt-get install -y --no-install-recommends \
        autoconf \
        automake \
        libtool
RUN mkdir /tmp/efa-ofi-nccl \
    && cd /tmp/efa-ofi-nccl \
    && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \
    && cd aws-ofi-nccl \
    && ./autogen.sh \
    && ./configure --with-libfabric=/opt/amazon/efa \
        --with-mpi=/opt/amazon/openmpi \
        --with-cuda=/usr/local/cuda \
        --with-nccl=$CONDA_PREFIX \
    && make \
    && make install \
    && rm -rf /tmp/efa-ofi-nccl

# Build and install Torchvision
RUN pip install --no-cache-dir -U \
    packaging \
    mpi4py==3.0.3
RUN cd /tmp \
    && git clone https://github.com/pytorch/vision.git -b v0.9.1 \
    && cd vision \
    && BUILD_VERSION="0.9.1+cu111" python setup.py install \
    && cd /tmp \
    && rm -rf vision

# Install OpenSSH.
# Required for MPI to communicate between containers, allow OpenSSH to talk to containers without asking for confirmation
RUN apt-get update \
    && apt-get install -y  --allow-downgrades --allow-change-held-packages --no-install-recommends \
    && apt-get install -y --no-install-recommends openssh-client openssh-server \
    && mkdir -p /var/run/sshd \
    && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \
    && echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \
    && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \
    && rm -rf /var/lib/apt/lists/*
# Configure OpenSSH so that nodes can communicate with each other
RUN mkdir -p /var/run/sshd && \
    sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN rm -rf /root/.ssh/ && \
    mkdir -p /root/.ssh/ && \
    ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \
    cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \
    && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config

# Install PT S3 plugin.
# Required to efficiently access datasets in Amazon S3
RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU}
RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

# Install libboost from source.
# This package is needed for smdataparallel functionality (for networking asynchronous IO).
WORKDIR /
RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \
    && tar -xzf boost_1_73_0.tar.gz \
    && cd boost_1_73_0 \
    && ./bootstrap.sh \
    && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \
    && cd .. \
    && rm -rf boost_1_73_0.tar.gz \
    && rm -rf boost_1_73_0 \
    && cd ${CONDA_PREFIX}/include/boost

# Install SageMaker AI PyTorch training.
WORKDIR /root
RUN pip install --no-cache-dir -U \
    smclarify \
    "sagemaker>=2,<3" \
    sagemaker-experiments==0.* \
    sagemaker-pytorch-training

# Install SageMaker AI data parallel binary (SMDDP)
# Start with dependencies
RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
    apt-get update && apt-get install -y  --no-install-recommends \
        jq \
        libhwloc-dev \
        libnuma1 \
        libnuma-dev \
        libssl1.1 \
        libtool \
        hwloc \
    && rm -rf /var/lib/apt/lists/*

# Install SMDDP
RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
```

**提示**  
有关创建用于 SageMaker 人工智能训练的自定义 Dockerfile 的更多一般信息，请参阅[使用自己的训练算](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo.html)法。

**提示**  
如果要扩展自定义 Dockerfile 以纳入 SageMaker AI 模型并行库，请参阅。[使用 SageMaker 分布式模型并行库创建自己的 Docker 容器](model-parallel-sm-sdk.md#model-parallel-bring-your-own-container)

# Amazon SageMaker AI 数据并行库示例
<a name="distributed-data-parallel-v2-examples"></a>

本页提供了 Jupyter 笔记本，这些笔记本提供了实现 SageMaker 人工智能分布式数据并行度 (SMDDP) 库以在 AI 上运行分布式训练作业的示例。 SageMaker 

## 博客和案例研究
<a name="distributed-data-parallel-v2-examples-blog"></a>

以下博客将讨论有关使用 SMDDP 库的案例研究。

**SMDDP v2 博客**
+ [使用亚马逊 A SageMaker I 数据并行库实现更快的训练](https://aws.amazon.com/blogs/machine-learning/enable-faster-training-with-amazon-sagemaker-data-parallel-library/)，M *AWS achine Learning 博客*（2023 年 12 月 5 日）

**SMDDP v1 博客**
+ [我是如何在 SageMaker AI *中*训练稳定扩散的 10TB](https://medium.com/@emilywebber/how-i-trained-10tb-for-stable-diffusion-on-sagemaker-39dcea49ce32) 的（2022 年 11 月 29 日）
+ [在亚马逊 SageMaker 培训上运行 PyTorch Lightning 和原生 PyTorch DDP，其中包括亚马逊搜索、AWS Machine Le](https://aws.amazon.com/blogs/machine-learning/run-pytorch-lightning-and-native-pytorch-ddp-on-amazon-sagemaker-training-featuring-amazon-search/) arnin *g 博客*（2022 年 8 月 18 日）
+ [AWS 使用 PyTorch SageMaker 人工智能分布式数据并行库进行训练 YOLOv5 ](https://medium.com/@sitecao/training-yolov5-on-aws-with-pytorch-and-sagemaker-distributed-data-parallel-library-a196ab01409b)，*中等*（2022 年 5 月 6 日）
+ [使用 SageMaker PyTorch 人工智能分布式数据并行库（中）加快 SageMaker 人工智能 EfficientNet 模型训练](https://medium.com/@dangmz/speed-up-efficientnet-model-training-on-amazon-sagemaker-with-pytorch-and-sagemaker-distributed-dae4b048c01a)*（2022 年 3 月 21 日）*
+ [AWS 使用 SageMaker 人工智能分布式数据并行库《*迈向数据科学》*加快 EfficientNet 训练速度](https://towardsdatascience.com/speed-up-efficientnet-training-on-aws-by-up-to-30-with-sagemaker-distributed-data-parallel-library-2dbf6d1e18e8)（2022 年 1 月 12 日）
+ [现代汽车使用亚马逊 A SageMaker I 缩短自动驾驶模型的AWS 机器学习模型训练时间，M](https://aws.amazon.com/blogs/machine-learning/hyundai-reduces-training-time-for-autonomous-driving-models-using-amazon-sagemaker/) *achine Learning Blog*（2021 年 6 月 25 日）
+ [分布式训练：使用《变形金刚》和 Amazon A SageMaker I 训练 BART/T5 进行总结](https://huggingface.co/blog/sagemaker-distributed-training-seq2seq)，Hugging Face *网站（2021 年 4 月* 8 日）

## 示例笔记本
<a name="distributed-data-parallel-v2-examples-pytorch"></a>

[SageMaker AI 示例 GitHub 存储库中提供了示例](https://github.com/aws/amazon-sagemaker-examples/tree/master/training/distributed_training/)笔记本。要下载示例，请运行以下命令克隆库并转到 `training/distributed_training/pytorch/data_parallel`。

**注意**  
克隆并运行以下 SageMaker AI ML 中的示例笔记本 IDEs。  
[SageMaker 人工智能 JupyterLab](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-jl.html)（在 2023 年 12 月之后创建[的工作室](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html)中可用）
[SageMaker AI 代码编辑器](https://docs.aws.amazon.com/sagemaker/latest/dg/code-editor.html)（在 2023 年 12 月之后创建的 [Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html) 中可用）
[Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio.html)（可作为 2023 年 12 月之后创建的 [Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html) 中的应用程序使用）
[SageMaker 笔记本实例](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html)

```
git clone https://github.com/aws/amazon-sagemaker-examples.git
cd amazon-sagemaker-examples/training/distributed_training/pytorch/data_parallel
```

**SMDDP v2 示例**
+ [使用 SageMaker AI 分布式数据并行库 (SMDDP) 训练 Llama 2 DeepSpeed](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/deepspeed/llama2/smddp_deepspeed_example.ipynb)
+ [使用 SageMaker AI 分布式数据并行库 (SMDDP) 和 PyTorch 完全分片数据并行化 (FSDP) 训练 Falcon](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/fully_sharded_data_parallel/falcon/smddp_fsdp_example.ipynb)

**SMDDP v1 示例**
+ [CNN wit PyTorch h 和 SageMaker AI 数据并行度库](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/mnist/pytorch_smdataparallel_mnist_demo.ipynb)
+ [BERT w PyTorch ith 和 SageMaker AI 数据并行度库](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/bert/pytorch_smdataparallel_bert_demo.ipynb)
+ [带有 TensorFlow 2.3.1 的 CNN 和 SageMaker 人工智能数据并行度库](https://sagemaker-examples.readthedocs.io/en/latest/training/distributed_training/tensorflow/data_parallel/mnist/tensorflow2_smdataparallel_mnist_demo.html)
+ [带有 TensorFlow 2.3.1 的 BERT 和 SageMaker AI 数据并行度库](https://sagemaker-examples.readthedocs.io/en/latest/training/distributed_training/tensorflow/data_parallel/bert/tensorflow2_smdataparallel_bert_demo.html)
+ [HuggingFace 在 SageMaker AI PyTorch 上进行分布式数据并行训练-分布式问答](https://github.com/huggingface/notebooks/blob/master/sagemaker/03_distributed_training_data_parallelism/sagemaker-notebook.ipynb)
+ [HuggingFace 在 SageMaker AI PyTorch 上进行分布式数据并行训练-分布式文本摘要](https://github.com/huggingface/notebooks/blob/master/sagemaker/08_distributed_summarization_bart_t5/sagemaker-notebook.ipynb)
+ [HuggingFace 在 SageMaker AI TensorFlow 上进行分布式数据并行训练](https://github.com/huggingface/notebooks/blob/master/sagemaker/07_tensorflow_distributed_training_data_parallelism/sagemaker-notebook.ipynb)

# SageMaker AI 分布式数据并行库的配置提示
<a name="data-parallel-config"></a>

在使用 SageMaker AI 分布式数据并行度 (SMDDP) 库之前，请查看以下提示。此列表包括适用于各个框架的提示。

**Topics**
+ [数据预处理](#data-parallel-config-dataprep)
+ [单节点与多节点](#data-parallel-config-multi-node)
+ [使用 Debugger 调试扩展效率](#data-parallel-config-debug)
+ [批次大小](#data-parallel-config-batch-size)
+ [自定义 MPI 选项](#data-parallel-config-mpi-custom)
+ [使用 Amazon FSx 并设置最佳存储和吞吐容量](#data-parallel-config-fxs)

## 数据预处理
<a name="data-parallel-config-dataprep"></a>

如果您在训练期间使用利用 CPU 的外部库对数据进行预处理，则可能会遇到 CPU 瓶颈，因为 SageMaker AI 分布式数据 parallel 使用 CPU 进行操作。`AllReduce`您可以通过将预处理步骤移至使用的库 GPUs 或在训练前完成所有预处理来缩短训练时间。

## 单节点与多节点
<a name="data-parallel-config-multi-node"></a>

我们建议您将此库与多节点结合使用。该库可以与单主机、多设备设置一起使用（例如，具有多个节点的单个 ML 计算实例 GPUs）；但是，当您使用两个或更多节点时，库的`AllReduce`操作可以显著提高性能。此外，在单台主机上， NVLink 已经有助于`AllReduce`提高节点内效率。

## 使用 Debugger 调试扩展效率
<a name="data-parallel-config-debug"></a>

您可以使用 Amazon SageMaker Debugger 监控和可视化训练期间的 CPU 和 GPU 利用率以及其他感兴趣的指标。您可以使用 Debugger [内置规则](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-built-in-rules.html)监控计算性能问题，例如 `CPUBottleneck`、`LoadBalancing` 和 `LowGPUUtilization`。在定义 Amaz SageMaker on Python 软件开发工具包估算器时，您可以使用[调试器配置](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-configuration-for-debugging.html)来指定这些规则。如果您使用 AWS CLI 和 适用于 Python (Boto3) 的 AWS SDK 进行 SageMaker 人工智能训练，则可以启用调试器，如使用 A [ma SageMaker zon API 配置 SageMaker 调试器](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html)中所示。

要查看在 SageMaker 训练作业中使用 Debugger 的示例，可以参考 Notebook Examples [ GitHub 存储库中的一个SageMaker 笔记本示例](https://github.com/aws/amazon-sagemaker-examples/tree/master/sagemaker-debugger)。要了解有关调试器的更多信息，请参阅 [Amazon SageMaker 调试](https://docs.aws.amazon.com/sagemaker/latest/dg/train-debugger.html)器。

## 批次大小
<a name="data-parallel-config-batch-size"></a>

在分布式训练中，随着添加的节点越多，批次大小应该按比例增加。在训练作业中添加更多节点并增加全局批次大小时，要想提高收敛速度，请提高学习率。

实现这一目标的一种方法是使用渐进的学习率预热，随着训练作业的进展，学习率从较小的值逐步提高到较大的值。这种渐进式提升避免了学习率的突然提高，从而在训练开始时能够健康地收敛。例如，您可以使用*线性扩展规则*，每次将小批次大小乘以 k 时，学习率也乘以 k。要了解有关这项技术的更多信息，请参阅研究论文《[准确、大型 Minibatch SGD：1 小时 ImageNet 内训练》](https://arxiv.org/pdf/1706.02677.pdf)，第 2 部分和第 3 节。

## 自定义 MPI 选项
<a name="data-parallel-config-mpi-custom"></a>

 SageMaker AI 分布式数据并行库采用消息传递接口 (MPI)，这是一种用于管理高性能集群中节点之间通信的流行标准，并使用 NVIDIA 的 NCCL 库进行 GPU 级别的通信。当您将数据并行库与 TensorFlow 或 Pytorch 一起使用时`Estimator`，相应的容器会设置 MPI 环境并执行`mpirun`命令以在集群节点上启动作业。

您可以使用 `Estimator` 中的 `custom_mpi_options` 参数设置自定义 MPI 操作。在此字段中传递的所有`mpirun`标志都将添加到`mpirun`命令中，并由 SageMaker AI 执行以进行训练。例如，您可以通过以下方法定义 `Estimator` 的 `distribution` 参数，以使用 [https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-debug](https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-debug) 变量来在程序开始时打印 NCCL 版本：

```
distribution = {'smdistributed':{'dataparallel':{'enabled': True, "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"}}}
```

## 使用 Amazon FSx 并设置最佳存储和吞吐容量
<a name="data-parallel-config-fxs"></a>

在具有分布式数据并行性的多个节点上训练模型时，强烈建议将其用[FSx 于](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html) Lustre。Amazon FSx 是一项可扩展的高性能存储服务，支持吞吐量更快的共享文件存储。大规模使用 Amazon FSx 存储，您可以更快地跨计算节点加载数据。

通常，对于分布式数据并行性，您会期望总训练吞吐量随数量的增加近线性扩展。 GPUs但是，如果您使用的是次优的 Amazon 存储，则由于 FSx 亚马逊吞吐量低，训练性能可能会降低。 FSx 

例如，如果您使用存储容量最低为 1. [**2 TiB 的 Amazon FSx 文件系统的 SCRATCH\$1** 2 部署](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf)类型，则吞吐容量为 240。 I/O MB/s. Amazon FSx storage works in a way that you can assign physical storage devices, and the more devices assigned, the larger throughput you get. The smallest storage increment for the SRATCH\$12 type is 1.2 TiB, and the corresponding throughput gain is 240 MB/s

假设您有一个模型，在 4 个节点的集群上对超过 100 GB 的数据集进行训练。对于针对集群进行了优化的给定批次大小，假设模型可以在大约 30 秒内完成一个纪元。在这种情况下，所需的最低 I/O 速度约为 3 GB/s （100 GB/30 秒）。这显然比 240 个MB/s. With such a limited Amazon FSx capacity, scaling your distributed training job up to larger clusters might aggravate I/O瓶颈问题要高得多的吞吐量；随着缓存的积累，模型训练吞吐量可能会在以后的时期有所提高，但是 Amazon FSx 吞吐量仍可能成为瓶颈。

为了缓解此类 I/O 瓶颈问题，您应该增加 Amazon FSx 存储大小以获得更高的吞吐容量。通常，为了找到最佳 I/O 吞吐量，您可以尝试使用不同的 Amazon FSx 吞吐量，分配的吞吐量等于或略低于您的估计值，直到您发现它足以解决 I/O 瓶颈问题。在上述示例中，具有2.4 GB/s 吞吐量和67 GB RAM缓存的Amazon FSx 存储空间就足够了。如果文件系统具有最佳吞吐量，则模型训练吞吐量应立即达到最大值，或者在第一个纪元之后建立了缓存时达到最大值。

要详细了解如何增加亚马逊 FSx 存储空间和部署类型，请参阅 A *ma FSx zon for Lustre 文档*中的以下页面：
+  [如何增加存储容量](https://docs.aws.amazon.com/fsx/latest/LustreGuide/managing-storage-capacity.html#increase-storage-capacity) 
+  [聚合文件系统性能](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf) 

# Amazon SageMaker AI 分布式数据并行库常见问题
<a name="data-parallel-faq"></a>

请使用以下内容查找有关 SMDDP 库常见问题的答案。

**问：使用库时，如何管理 `allreduce` 支持的 CPU 实例？ 我是否必须创建异构 CPU-GPU 集群，或者 SageMaker AI 服务是否为使用 SMDDP 库的作业创建额外的 C5？**

SMDDP 库仅支持 GPU 实例，更具体地说，支持使用 NVIDIA A100 GPU 和 EFA 的 P4d 和 P4de 实例。不会启动额外的 C5 或 CPU 实例；如果您的 SageMaker AI 训练作业位于 8 节点 P4d 集群上，则只使用 8 个 `ml.p4d.24xlarge` 实例。无需预置其他实例。

**问：我有一项训练作业，使用一组超参数 H1（学习速率、批次大小、优化器等），在单个 `ml.p3.24xlarge` 实例上需要 5 天完成。如果使用 SageMaker AI 的数据并行库和五倍大小的集群，是否足以实现大约五倍的加速？ 还是在激活 SMDDP 库之后，必须重新查看它的训练超参数？**

库会更改整体批次大小。新的总批次大小会根据使用的训练实例数量线性扩展。因此，您必须更改学习率等超参数，以确保收敛。

**问：SMDDP 库支持竞价型实例吗？**

是。您可以使用托管式竞价型实例训练。您可以在 SageMaker 训练作业中指定检查点文件的路径。您可以在其训练脚本中启用保存和恢复检查点，如[在 TensorFlow 训练脚本中使用 SMDDP 库（已弃用）](data-parallel-modify-sdp-tf2.md)和[在训练脚本中使用 SMDDP 库 PyTorch](data-parallel-modify-sdp-pt.md)中的最后一步所述。

**问：SMDDP 库是否也可用于单主机、多设备设置？**

该库可用于单主机多设备训练，但只有在多主机训练中，该库才能实现性能改进。

**问：训练数据集应该存储在哪里？**

训练数据集可以存储在 Amazon S3 存储桶或 Amazon FSx 驱动器中。请参阅这份[有关训练作业支持的各种输入文件系统的文档](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html#sagemaker.inputs.FileSystemInput)。

**问：使用 SMDDP 库时，是否必须在 FSx 中为 Lustre 提供训练数据？ 是否可以使用 Amazon EFS 和 Amazon S3？**

我们通常建议您使用 Amazon FSx，因为它的延迟更低，吞吐量更高。如果愿意，您也可以使用 Amazon EFS 或 Amazon S3。

**问：该库能否用于 CPU 节点？** 

否。要查找 SMDDP 库支持的实例类型，请参阅 [支持的实例类型](distributed-data-parallel-support.md#distributed-data-parallel-supported-instance-types)。

**问：SMDDP 库在发布时支持哪些框架和框架版本？** 

SMDDP 库目前支持 PyTorch v1.6.0 或更高版本以及 TensorFlow v2.3.0 或更高版本。它不支持 TensorFlow 1.x。有关在 AWS Deep Learning Containers 中打包的 SMDDP 库版本的信息，请参阅[深度学习容器发行说明](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/dlc-release-notes.html)。

**问：该库是否支持 AMP？**

是，SMDDP 库支持开箱即用的自动混合精度 (AMP)。除了对训练脚本的框架级修改之外，无需执行额外操作即可使用 AMP。如果梯度位于 FP16 中，则 SageMaker AI 数据并行库会在 FP16 中运行其 `AllReduce` 操作。有关对您的训练脚本实施 AMP API 的更多信息，请参阅以下资源：
+ *NVIDIA 深度学习性能文档*中的[框架 – PyTorch](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#pytorch)
+ *NVIDIA 深度学习性能文档*中的[框架 – TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow)
+ *NVIDIA 开发人员文档*中的[适用于深度学习的自动混合精度](https://developer.nvidia.com/automatic-mixed-precision)
+ *PyTorch 博客*中的[引入 PyTorch 自动混合精度功能，用于加快 NVIDIA GPU 上的训练速度](https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/)
+ 《TensorFlow 文档》**中的 [TensorFlow 混合精度 API](https://www.tensorflow.org/guide/mixed_precision)

**问：如何确定分布式训练作业是否因为 I/O 瓶颈而减慢了速度？**

在较大的集群中，训练作业需要更多的 I/O 吞吐量，因此，训练吞吐量可能需要更长的时间（更多纪元）才能逐步提升到最高性能。这表明，随着节点扩展，I/O 正在出现瓶颈，缓存更难逐步建立（吞吐量要求更高，网络拓扑更复杂）。有关在 CloudWatch 上监控 Amazon FSx 吞吐量的更多信息，请参阅《FSx for Lustre 用户指南》**中的[监控 FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/monitoring_overview.html)。

**问：运行具有数据并行性的分布式训练作业时，如何解决 I/O 瓶颈？**

如果您使用 Amazon S3，则强烈建议您使用 Amazon FSx 作为数据通道。如果您已经在使用 Amazon FSx 但仍存在 I/O 瓶颈问题，则您可能设置了低 I/O 吞吐量和较小存储容量的 Amazon FSx 文件系统。有关如何估算和选择合适 I/O 吞吐能力的更多信息，请参阅[使用 Amazon FSx 并设置最佳存储和吞吐容量](data-parallel-config.md#data-parallel-config-fxs)。

**问：（对于库 v1.4.0 或更高版本）如何解决初始化进程组时的 `Invalid backend` 错误。**

如果您在调用 `init_process_group` 时遇到错误消息 `ValueError: Invalid backend: 'smddp'`，这是由于 SMDDP 库 v1.4.0 及更高版本中的重大更改所致。您必须导入该库的 PyTorch 客户端 `smdistributed.dataparallel.torch.torch_smddp`，这会将 `smddp` 注册为 PyTorch 的后端。要了解更多信息，请参阅[在训练脚本中使用 SMDDP 库 PyTorch](data-parallel-modify-sdp-pt.md)。

**问：（对于库 v1.4.0 或更高版本）我想调用 [https://pytorch.org/docs/stable/distributed.html](https://pytorch.org/docs/stable/distributed.html) 接口的集合基元。`smddp` 后端支持哪些基元？**

在 v1.4.0 中，SMDDP 库支持 `torch.distributed` 接口的 `all_reduce`、`broadcast`、`reduce`、`all_gather` 和 `barrier`。

**问：（对于 SMDDP 库 v1.4.0 或更高版本）这个新 API 能否与其他自定义 DDP 类或库（如 Apex DDP）一起使用？**

SMDDP 库与使用 `torch.distribtued` 模块的其他第三方分布式数据并行库和框架实现进行了测试。只要 SMDDP 库支持自定义 DDP 类使用的集体操作，那么 SMDDP 库就能与自定义 DDP 类一起使用。有关支持的集合的列表，请参阅前面的问题。如果您遇到这些使用案例并需要进一步的支持，请通过 [AWS Support Center](https://console.aws.amazon.com/support/) 或 [Amazon SageMaker AI 的 AWS 开发人员论坛](https://forums.aws.amazon.com/forum.jspa?forumID=285)联系 SageMaker AI 团队。

**问：SMDDP 库是否支持自带容器 (BYOC) 选项？ 如果支持，我该如何安装库并通过编写自定义 Dockerfile 来运行分布式训练作业？**

如果您想将 SMDDP 库及其最小依赖关系集成到自己的 Docker 容器中，BYOC 就是合适的方法。您可以使用库的二进制文件构建自己的容器。建议的流程是编写包含库及其依赖项的自定义 Dockerfile，构建 Docker 容器，将其托管在 Amazon ECR 中，然后使用 ECR 映像 URI 通过 SageMaker AI 通用估算器类启动训练作业。有关如何使用 SMDDP 库为 SageMaker AI 中的分布式训练准备自定义 Dockerfile 的更多说明，请参阅 [使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器](data-parallel-bring-your-own-container.md)。

# 在 Amazon A SageMaker I 中进行分布式训练的疑难解答
<a name="distributed-troubleshooting-data-parallel"></a>

如果您在使用库运行训练作业时遇到问题，请按照以下列表尝试进行故障排除。如果您需要进一步的支持，请通过[AWS 支持中心](https://console.aws.amazon.com/support/)或亚马逊 Amazon SageMaker AI [AWS 开发者论坛与 Amazon A SageMaker I](https://forums.aws.amazon.com/forum.jspa?forumID=285) 团队联系。

**Topics**
+ [与 Amazon SageMaker 调试器和检查点并行使用 SageMaker 人工智能分布式数据](#distributed-ts-data-parallel-debugger)
+ [意外前缀附加到模型参数键上](#distributed-ts-data-parallel-pytorch-prefix)
+ [SageMaker 初始化期间 AI 分布式训练作业停滞](#distributed-ts-data-parallel-efa-sg)
+ [SageMaker AI 分布式训练作业在训练结束时停滞不前](#distributed-ts-data-parallel-stall-at-the-end)
+ [观察到 Amazon FSx 吞吐量瓶颈导致的扩展效率下降](#distributed-ts-data-parallel-fxs-bottleneck)
+ [SageMaker 带有 PyTorch 返回弃用警告的 AI 分布式训练作业](#distributed-ts-data-parallel-deprecation-warnings)

## 与 Amazon SageMaker 调试器和检查点并行使用 SageMaker 人工智能分布式数据
<a name="distributed-ts-data-parallel-debugger"></a>

要监控系统瓶颈、分析框架操作并调试模型输出张量，以并行使用 SageMaker 人工智能分布式数据进行训练作业，请使用 Amazon D SageMaker ebugger。

但是，当您使用 SageMaker Debugger、 SageMaker AI 分布式数据 parallel 和 SageMaker AI 检查点时，可能会看到类似于以下示例的错误。

```
SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled
```

这是由于调试器和检查点之间存在内部错误，当您并行启用 SageMaker AI 分布式数据时，就会发生这种错误。
+ 如果您启用所有三个功能， SageMaker Python SDK 会通过传递自动关闭调试器`debugger_hook_config=False`，这等同于以下框架`estimator`示例。

  ```
  bucket=sagemaker.Session().default_bucket()
  base_job_name="sagemaker-checkpoint-test"
  checkpoint_in_bucket="checkpoints"
  
  # The S3 URI to store the checkpoints
  checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket)
  
  estimator = TensorFlow(
      ...
  
      distribution={"smdistributed": {"dataparallel": { "enabled": True }}},
      checkpoint_s3_uri=checkpoint_s3_bucket,
      checkpoint_local_path="/opt/ml/checkpoints",
      debugger_hook_config=False
  )
  ```
+ 如果您想继续同时使用 SageMaker AI 分布式数据 parallel 和 SageMaker Debugger，则一种解决方法是手动向训练脚本中添加检查点函数，而不是从估算器中指定`checkpoint_s3_uri`和`checkpoint_local_path`参数。有关在训练脚本中设置手动检查点的更多信息，请参阅[保存检查点](distributed-troubleshooting-model-parallel.md#distributed-ts-model-parallel-checkpoints)。

## 意外前缀附加到模型参数键上
<a name="distributed-ts-data-parallel-pytorch-prefix"></a>

对于 PyTorch 分布式训练作业，可能会在`state_dict`密钥（`model`模型参数）上附加意外前缀（例如）。当 PyTorch 训练作业保存模型工件时， SageMaker AI 数据 parallel 库不会直接更改或预置任何模型参数名称。 PyTorch的分布式训练将中的名称更改`state_dict`为通过网络，在前面加上前缀。如果您在使用 SageMaker AI 数据并行库和检查点进行训练时由于参数名称不同而遇到任何模型失败问题，请调整以下示例代码，在 PyTorch 训练脚本中加载检查点的步骤中删除前缀。

```
state_dict = {k.partition('model.')[2]:state_dict[k] for k in state_dict.keys()}
```

这会将每个 `state_dict` 键作为字符串值，在 `'model.'` 第一次出现时分隔字符串，并获取分区字符串的第三个列表项（索引 2）。

有关前缀问题的更多信息，请参阅 “[如果经过多 GPU 训练，则在保存的模型中使用前缀参数名称](https://discuss.pytorch.org/t/prefix-parameter-names-in-saved-model-if-trained-by-multi-gpu/494)？ 在*PyTorch 讨论论坛*中。

有关保存和加载模型的 PyTorch 方法的更多信息，请参阅*PyTorch文档*中的[跨设备保存和加载模型](https://pytorch.org/tutorials/beginner/saving_loading_models.html#saving-loading-model-across-devices)。

## SageMaker 初始化期间 AI 分布式训练作业停滞
<a name="distributed-ts-data-parallel-efa-sg"></a>

如果您的 SageMaker AI 分布式数据并行训练作业在初始化期间使用启用 EFA 的实例时停滞不前，则这可能是由于用于训练作业的 VPC 子网的安全组配置错误所致。EFA 需要正确的安全组配置才能启用节点之间的流量。

**配置安全组的入站和出站规则**

1. 登录 AWS 管理控制台 并打开 Amazon VPC 控制台，网址为[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在左侧导航窗格中，选择**安全组**。

1. 选择与您用于训练的 VPC 子网关联的安全组。

1. 在**详细信息**部分中复制**安全组 ID**。

1. 在 **Inbound Rules (入站规则)** 选项卡上，选择 **Edit inbound rules (编辑入站规则)**。

1. 在 **Edit inbound rules (编辑入站规则)** 页面上，执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。

   1. 对于**源**，请选择**自定义**，将安全组 ID 粘贴到搜索框中，然后选择弹出的安全组。

1. 选择**保存规则**即可完成安全组入站规则的配置。

1. 在**出站规则**选项卡上，选择**编辑出站规则**。

1. 重复步骤 6 和 7，添加相同的规则作为出站规则。

完成上述配置安全组的入站和出站规则的步骤后，请重新运行训练作业并验证停滞问题是否已解决。

有关为 VPC 和 EFA 配置安全组的更多信息，请参阅 [VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)和 [Elastic Fabric Adapter](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html)。

## SageMaker AI 分布式训练作业在训练结束时停滞不前
<a name="distributed-ts-data-parallel-stall-at-the-end"></a>

训练结束时出现停滞问题的根本原因之一是，每个纪元在不同秩之间处理的批次数量不匹配。所有 worker (GPUs) 在向后通道中同步其局部梯度，以确保在批次迭代结束时他们都有相同的模型副本。如果在训练的最后一个纪元中，将批次大小不均匀地分配给不同的工作线程组，则训练作业将停止。例如，当一个工作线程组（组 A）完成所有批次的处理并退出训练循环时，另一个工作线程组（组 B）开始处理其他批次，但仍需要来自组 A 的通信以同步梯度。这会导致组 B 等待 A 组，但组 A 已经完成训练并且没有任何梯度可供同步。

因此，在设置训练数据集时，重要的是每个工作线程获得相同数量的数据样本，这样每个工作线程在训练时都会处理相同数量的批次。确保每个秩获得相同的批次数量，以避免出现这种停滞问题。

## 观察到 Amazon FSx 吞吐量瓶颈导致的扩展效率下降
<a name="distributed-ts-data-parallel-fxs-bottleneck"></a>

扩展效率降低的一个潜在原因是 FSx 吞吐量限制。如果您在切换到更大的训练集群时发现扩展效率突然下降，请尝试使用吞吐量限制更高的更大 FSx 的 For Lustre 文件系统。有关更多信息，请参阅 *Amazon FSx for Lustre 用户指南*中的[聚合文件系统性能](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf)[和管理存储和吞吐容量](https://docs.aws.amazon.com/fsx/latest/LustreGuide/managing-storage-capacity.html)。

## SageMaker 带有 PyTorch 返回弃用警告的 AI 分布式训练作业
<a name="distributed-ts-data-parallel-deprecation-warnings"></a>

从 v1.4.0 起， SageMaker AI 分布式数据并行库可以用作分布式的后端。 PyTorch 由于在使用库时发生了重大变化 PyTorch，因此您可能会遇到一条警告消息，指出已弃用 PyTorch 分布式包的。`smdistributed` APIs 警告消息应该类似于以下内容：

```
smdistributed.dataparallel.torch.dist is deprecated in the SageMaker AI distributed data parallel library v1.4.0+.
Please use torch.distributed and specify 'smddp' as a backend when initializing process group as follows:
torch.distributed.init_process_group(backend='smddp')
For more information, see the library's API documentation at
https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-modify-sdp-pt.html
```

在 v1.4.0 及更高版本中，只需要在训练脚本顶部导入一次库，并在 PyTorch 分布式初始化期间将其设置为后端。使用单行后端规范，您可以保持 PyTorch 训练脚本不变，直接使用 PyTorch 分布式模块。[在训练脚本中使用 SMDDP 库 PyTorch](data-parallel-modify-sdp-pt.md)要了解重大更改以及使用该库的新方法，请参阅 PyTorch。

# SageMaker AI 数据并行度库发行说明
<a name="data-parallel-release-notes"></a>

要跟踪 SageMaker AI 分布式数据并行度 (SMDDP) 库的最新更新，请参阅以下发行说明。

## A SageMaker I 分布式数据并行库 v2.5.0
<a name="data-parallel-release-notes-20241017"></a>

*日期：2024 年 10 月 17 日*

**新特征**
+ 在 CUDA v12.1 中添加了 PyTorch 对 v2.4.1 的支持。

**集成到由 SageMaker AI 模型并行度 (SMP) 库分发的 Docker 容器中**

该版本的 SMDDP 库已迁移至 [SageMaker 模型并行度库 v2.6.0](model-parallel-release-notes.md#model-parallel-release-notes-20241017)。

```
658645717510.dkr.ecr.<us-west-2>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121
```

有关提供 SMP Docker 映像的区域，请参阅 [AWS 区域](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2)。

**本版本的二进制文件**

您可以使用以下 URL 下载或安装该库。

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.4.1/cu121/2024-10-09/smdistributed_dataparallel-2.5.0-cp311-cp311-linux_x86_64.whl
```

## A SageMaker I 分布式数据并行库 v2.3.0
<a name="data-parallel-release-notes-20240611"></a>

*日期：2024 年 6 月 11 日*

**新特征**
+ 在 CUDA PyTorch v12.1 和 Python v3.11 中增加了对 v2.3.0 的支持。
+ 增加了对 PyTorch Lightning v2.2.5 的支持。它已集成到 PyTorch v2.3. SageMaker 0 的 AI 框架容器中。
+ 在导入过程中添加了实例类型验证，以防止在不支持的实例类型上加载 SMDDP 库。有关与 SMDDP 库兼容的实例类型列表，请参阅 [支持的框架 AWS 区域、和实例类型](distributed-data-parallel-support.md)。

**集成到 SageMaker AI 框架容器中**

此版本的 SMDDP 库已迁移到以下 [SageMaker AI 框架](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)容器中。
+ PyTorch v2.3.0

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker
  ```

有关 SMDDP 库和与预构建容器版本的完整列表，请参阅 [支持的框架 AWS 区域、和实例类型](distributed-data-parallel-support.md)。

**本版本的二进制文件**

您可以使用以下 URL 下载或安装该库。

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed_dataparallel-2.3.0-cp311-cp311-linux_x86_64.whl
```

**其他更改**
+ SMDDP 库 v2.2.0 已集成到 v2.2.0 SageMaker 的人工智能框架容器中。 PyTorch 

## A SageMaker I 分布式数据并行库 v2.2.0
<a name="data-parallel-release-notes-20240304"></a>

*日期：2024 年 3 月 4 日*

**新特征**
+ 在 CUDA v12.1 中添加了 PyTorch 对 v2.2.0 的支持。

**集成到由 SageMaker AI 模型并行度 (SMP) 库分发的 Docker 容器中**

该版本的 SMDDP 库已迁移至 [SageMaker 模型并行度库 v2.2.0](model-parallel-release-notes.md#model-parallel-release-notes-20240307)。

```
658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121
```

有关提供 SMP Docker 映像的区域，请参阅 [AWS 区域](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2)。

**本版本的二进制文件**

您可以使用以下 URL 下载或安装该库。

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed_dataparallel-2.2.0-cp310-cp310-linux_x86_64.whl
```

## A SageMaker I 分布式数据并行库 v2.1.0
<a name="data-parallel-release-notes-20240301"></a>

*日期：2024 年 3 月 1 日*

**新特征**
+ 在 CUDA v12.1 中添加了 PyTorch 对 v2.1.0 的支持。

**错误修复**
+ 修正了 [SMDDP v2.0.1](#data-parallel-release-notes-20231207) 中的 CPU 内存泄漏问题。

**集成到 SageMaker AI 框架容器中**

此版本的 SMDDP 库通过了基准测试，并已迁移到以下 [SageMaker AI 框架](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)容器中。
+ PyTorch v2.1.0

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker
  ```

**集成到由 SageMaker AI 模型并行度 (SMP) 库分发的 Docker 容器中**

该版本的 SMDDP 库已迁移至 [SageMaker 模型并行度库 v2.1.0](model-parallel-release-notes.md#model-parallel-release-notes-20240206)。

```
658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121
```

有关提供 SMP Docker 映像的区域，请参阅 [AWS 区域](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2)。

**本版本的二进制文件**

您可以使用以下 URL 下载或安装该库。

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed_dataparallel-2.1.0-cp310-cp310-linux_x86_64.whl
```

## A SageMaker I 分布式数据并行库 v2.0.1
<a name="data-parallel-release-notes-20231207"></a>

*日期：2023 年 12 月 7 日*

**新特征**
+ 添加了针对 AWS 计算资源和网络基础设施进行了优化的全新 SMDDP `AllGather` 集体操作实现。要了解更多信息，请参阅[SMDDP `AllGather` 集体操作](data-parallel-intro.md#data-parallel-allgather)。
+ SMDDP `AllGather` 集体行动与 PyTorch FSDP 兼容，. DeepSpeed 要了解更多信息，请参阅[在训练脚本中使用 SMDDP 库 PyTorch](data-parallel-modify-sdp-pt.md)。
+ 增加了对 PyTorch v2.0.1 的支持

**已知问题**
+ 在 DDP 模式下使用 SMDDP `AllReduce` 进行训练时，CPU 内存逐渐增加，导致 CPU 内存泄漏。

**集成到 SageMaker AI 框架容器中**

此版本的 SMDDP 库通过了基准测试，并已迁移到以下 [SageMaker AI 框架](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)容器中。
+ PyTorch v2.0.1

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker
  ```

**本版本的二进制文件**

您可以使用以下 URL 下载或安装该库。

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed_dataparallel-2.0.2-cp310-cp310-linux_x86_64.whl
```

**其他更改**
+ 从本版本开始，本*亚马逊 A SageMaker I 开发者*指南中提供了有关 SMDDP 库的完整文档。为了支持*亚马逊 SageMaker 人工智能开发者指南中包含的完整的 SMDDP v2 开发者指南，不再支持 AI* P *ython* SDK 文档中[有关 SMDDP v1.x 的SageMaker 额外参考](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html)文档。如果你还需要 SMP v1.x 文档，请参阅 Pyth [SageMaker on SDK](https://sagemaker.readthedocs.io/en/v2.212.0/api/training/distributed.html#the-sagemaker-distributed-data-parallel-library) v2.212.0 文档中的以下文档快照。