运行 SageMaker 分布式模型并行训练 Job - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

运行 SageMaker 分布式模型并行训练 Job

了解如何使用 SageMaker Python SDK 和适应的训练脚本与 SageMaker 的分布式模型并行库运行分布式模型并行训练作业。

SageMaker 支持以下培训环境配置。

  1. 您可以使用预构建的 TensorFlow 或 PyTorch 容器。建议使用模型并行库的新用户使用此选项,并在MNIST 与 PyTorch 1.6 和亚马逊萨格制造商的分布式模型并行库.

  2. 您可以扩展 SageMaker 预构建的容器,以满足预构建的算法或模型的任何其他功能要求,而预构建的 SageMaker 镜像不支持。要查看有关如何扩展预构建的容器的示例,请参阅扩展预构建容器.

  3. 您可以调整自己的 Docker 容器,使用SageMaker 训练工具包. 有关示例,请参阅 。调整您自己的训练容器.

有关上述列表中的选项 2 和 3,请参阅扩展或调整包含 SageMaker 分布式模型并行库的 Docker 容器,了解如何在扩展或自定义 Docker 容器中安装模型并行库。

在所有情况下,您都可以使用 SageMaker Python 开发工具包 TensorFlow 或 PyTorch 来启动您的作业Estimator初始化库并启动培训作业。要了解更多信息,请参阅以下部分:使用 SageMaker Python 开发工具包启动培训作业.

使用 SageMaker Python 开发工具包启动培训作业

SageMaker Python 软件开发工具包支持 TensorFlow 和 PyTorch 模型的托管训练。要使用这些框架之一启动培训作业,您可以定义TensorFlowEstimatorPyTorchEstimator.

温 TensorFlow 和 PyTorchEstimator对象包含distribution参数,用于启用和指定初始化 SageMaker 的分布式模型并行库的参数。库内部使用 MPI,因此为了使用模型并行性,必须使用distribution参数。

以下是如何使用库启动新的 PyTorch 培训作业的示例。

import sagemaker sagemaker_session = sagemaker.session.Session(boto_session=session) smp_options = { "enabled":True, "parameters": { "partitions": 2, "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "ddp": True, } } mpi_options = { "enabled" : True, "processes_per_host" : 8, # "custom_mpi_options" : "--mca btl_vader_single_copy_mechanism none" } smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=role, instance_type='ml.p3.16xlarge', sagemaker_session=sagemaker_session, framework_version='1.8.1', # You must set py_version to py36 py_version='py36', instance_count=1, distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="SMD-MP-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

要启用该库,您需要传递"mpi""smdistributed"键指向distribution在 SageMaker Python 软件开发工具包中估计器构造函数的参数。

  • 对于"smdistributed"键,传递一个字典"modelparallel"键和以下内部字典。

    注意

    使用"modelparallel""dataparallel"在一个培训工作中不受支持。

    • "enabled"(必需)— 要启用模型并行性,请将"enabled": True.

    • "parameters"(必需)— 为模型并行度指定一组参数,请参见smdistributed参数. 在这些参数中,"partitions"键来指定需要为培训作业请求多少模型分区。

  • 对于"mpi"键,传递一个包含以下内容的字典:

    • "enabled"(必填)-True启动 MPI 培训工作。

    • "processes_per_host"(必需)— 指定 MPI 应在每台主机上启动的进程数。在 SageMaker 中,主机是一个Amazon EC2 毫升实例. SageMaker Python SDK 在模型和数据并行性上维护进程和 GPU 之间的一对一映射。这意味着 SageMaker 将每个进程安排在一个单独的 GPU 上,而且没有 GPU 包含多个进程。如果您使用 PyTorch,则必须通过torch.cuda.set_device(smp.local_rank()). 要了解更多信息,请参阅“PyTorch”。

      重要

      process_per_host 必须不大于每个实例的 GPU 数量,通常等于每个实例的 GPU 数量。

      例如,如果您使用具有 4 向模型并行性和双向数据并行性的一个实例,则processes_per_host应该是 2 x 4 = 8。因此,您必须选择至少具有 8 个 GPU 的实例,例如 ml.p3.16xlarge。

      下图说明了如何在 8 个 GPU 中分布双向数据并行性和 4 路模型并行性:这些模型在 4 个 GPU 之间进行分区,每个分区都添加到 2 个 GPU 中。

    • "custom_mpi_options"(可选)— 使用此键传递您可能需要的任何自定义 MPI 选项。如果您没有将任何 MPI 自定义选项传递给密钥,MPI 选项默认设置为以下标志。

      --mca btl_vader_single_copy_mechanism none
      注意

      您不需要将默认标志明确指定为密钥。如果您明确指定它,则分布式模型并行训练作业可能会失败,并出现以下错误:

      The following MCA parameter has been listed multiple times on the command line: MCA param: btl_vader_single_copy_mechanism MCA parameters can only be listed once on a command line to ensure there is no ambiguity as to its value. Please correct the situation and try again.
      提示

      如果您使用启用 EFA 的实例类型启动培训作业,例如ml.p4d.24xlargeml.p3dn.24xlarge,请使用以下标志以获得最佳性能:

      -x FI_EFA_USE_DEVICE_RDMA=1 -x FI_PROVIDER=efa -x RDMAV_FORK_SAFE=1

要使用 SageMaker 模型并行配置的训练脚本启动培训作业,请使用Estimator.fit()function. 您可以使用 SageMaker 笔记本实例启动 SageMaker 培训作业,也可以在本地启动。

使用以下资源了解有关将 SageMaker Python SDK 与以下框架结合使用的更多信息,请参阅以下资源:

扩展或调整包含 SageMaker 分布式模型并行库的 Docker 容器

要扩展预构建的容器,或者调整自己的容器以使用 SageMaker 的分布式模型并行库,必须使用 PyTorch 或 TensorFlow GPU 通用框架基础图像之一。分布式模型并行库包含在所有 CUDA 11 (cu11x)TensorFlow 2.3.x 和 PyTorch 1.6.x 版本化图像和更高版本。请参阅可用的 Deep Learning Containers 映像以获取可用图像的列表。

提示

建议您使用包含最新版本的 TensorFlow 或 PyTorch 的图像来访问 SageMaker 分布式模型并行库的最新版本。

例如,如果您使用的是 PyTorch 1.8.1,则您的码头文件应该包含FROM语句类似于以下所示:

# SageMaker PyTorch image FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.8.1-gpu-py36-cu111-ubuntu18.04 # Add your dependencies here RUN ... ENV PATH="/opt/ml/code:${PATH}" # this environment variable is used by the SageMaker PyTorch container to determine our user code directory. ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code # /opt/ml and all subdirectories are utilized by SageMaker, use the /code subdirectory to store your user code. COPY cifar10.py /opt/ml/code/cifar10.py

此外,当您定义一个 PyTorch 或 TensorFlowestimator,则必须指定entry_point,了解您的训练脚本。该路径应与用于标识的相同路径相同ENV SAGEMAKER_SUBMIT_DIRECTORY并将其转换为 Dockerfile。

您必须将容器推送到 Amazon Elastic Container Registry (Amazon ECR),并使用镜像 URI (image_uri)来定义一个估计器。请参阅扩展预构建容器了解更多信息。

例如,如果您的 Docker 文件是使用前面的代码块定义的,并使用名称标签将其推送到亚马逊 ECR,您需要定义一个 PyTorchestimator如下所示。此示例假设您已定义smp_optionsmpi_options.

smd_mp_estimator = PyTorch( entry_point='/opt/ml/code/pt_mnist.py', # Identify source_dir='utils', role=role, instance_type='ml.p3.16xlarge', sagemaker_session=sagemaker_session, image_uri='aws_account_id.dkr.ecr.region.amazonaws.com/name:tag' instance_count=1, distribution={ "smdistributed": smp_options, "mpi": mpi_options }, base_job_name="SMD-MP-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')