

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

# 使用 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")
```

------