采用 SageMaker 最佳实践的分布式计算 - Amazon SageMaker

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

采用 SageMaker 最佳实践的分布式计算

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

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

以下列表涵盖了大规模运行 ML 训练作业时可能面临的常见挑战。

  • 您需要根据 ML 任务、要使用的软件库和计算资源来决定如何分布计算资源。

  • 并非所有 ML 任务都能够轻易地实现分布式处理。此外,并非所有 ML 库都支持分布式计算。

  • 分布式计算并不一定能够实现计算效率的线性提高。尤其是您需要确定,数据 I/O 和 GPU 间通信是否存在瓶颈或导致开销。

  • 分布式计算可能会干扰数值处理并改变模型准确性。特别是对于数据并行神经网络训练,当您纵向扩展到更大的计算集群时需要更改全局批量大小,还需要相应地调整学习率。

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

选项 1:使用支持分布式训练的 SageMaker 内置算法

SageMaker 提供了内置算法,您可以通过 SageMaker控制台或 SageMaker Python SDK 开箱即用。使用内置算法时,您无需花时间自定义代码、了解模型背后的科学知识,也无需在预置 Amazon EC2 实例上运行 Docker。

SageMaker 内置算法的子集支持分布式训练。要检查您选择的算法是否支持分布式训练,请参阅关于内置算法的常用信息表中的可并行化列。一些算法支持多实例分布式训练,而其余的可并行化算法则支持在单个实例中使用多个 GPU 进行并行处理,如可并行化列所示。

选项 2:在 SageMaker 托管训练或处理环境中运行自定义 ML 代码

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

ML 代码使用深度学习框架时

你可以使用用于训练的 Dee p Learning Containers (DLC) 启动分布式 SageMaker 训练作业,你可以通过 Python SDK 中的专用 Pyt SageMaker hon 模块或使用 SageMaker 的 API 进行AWS CLI编排。AWS SDK for Python (Boto3) SageMaker 为机器学习框架提供训练容器,包括、、Hugging Face T PyTorchr TensorFlowansformers 和 Apache MXNet。您可以通过两种方式编写深度学习代码用于分布式训练。

SageMaker 机器学习容器还预装了 MPI,因此您可以使用 mpi4py 并行化入口点脚本。当您启动第三方分布式训练启动器或在托管训练环境中编写临时并行代码时,使用 MPI 集成训练容器是一个不错 SageMaker 的选择。

在 GPU 上进行数据并行神经网络训练的注意事项

  • 在适当的时候扩展到多 GPU 和多计算机并行性

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

  • 监控收敛质量

    在使用数据并行性训练神经网络时,如果增加 GPU 数量的同时保持每个 GPU 的小批次大小不变,就会导致小批次随机梯度下降 (MSGD) 进程的全局小批次的大小增加。而 MSGD 的小批次大小已知会影响下降噪声和收敛性。为了在保持准确性的同时正确缩放,您需要调整其他超参数,例如学习率 [Goyal 等。(2017)]。

  • 监控 I/O 瓶颈

    在您增加 GPU 的数量时,读取和写入存储的吞吐量也应增加。请确保您的数据来源和管道不会成为瓶颈。

  • 根据需要修改训练脚本

    针对单 GPU 训练编写的训练脚本必须进行修改,才能用于多节点多 GPU 训练。在大多数数据并行性库中,需要修改脚本才能进行以下操作。

    • 向每个 GPU 分配训练数据批次。

    • 使用可以处理多个 GPU 上的梯度计算和参数更新的优化器。

    • 将执行检查点操作的责任分配给特定的主机和 GPU。

ML 代码涉及表格数据处理时

PySpark 是 Apache Spark 的 Python 前端,Apache Spark 是一个开源的分布式计算框架。 PySpark 已被广泛用于大规模生产工作负载的分布式表格数据处理。如果要运行表格数据处理代码,请考虑使用 Processing PySpark 容器并运行 parallel 作业。SageMaker 您还可以使用与 Amazon EMR 和 Amazon EMR 集成的 Amazon SageMaker Studio Classic 中的 SageMaker 训练和 SageMaker 处理 API 并行运行数据处理作业。AWS Glue

选项 3:编写自己的自定义分布式训练代码

当您向提交训练或处理任务时 SageMaker, SageMaker 训练和 SageMaker处理 API 会启动 Amazon EC2 计算实例。您可以通过运行自己的 Docker 容器或在 AWS 托管容器中安装其他库来自定义实例中的训练和处理环境。有关带 SageMaker 训练功能的 Docker 的更多信息,请参阅调整您自己的 Docker 容器以适应使用 SageMaker和使用自己的算法和模型创建容器。有关带 SageMaker处理功能的 Docker 的更多信息,请参阅使用自己的处理代码

每个 SageMaker 训练作业环境都包含一个位于的配置文件/opt/ml/input/config/resourceconfig.json,每个 SageMaker 处理作业环境都包含一个类似的配置文件/opt/ml/config/resourceconfig.json。您的代码可以读取此文件,从而查找 hostnames 和建立节点间通信。要了解更多信息,包括 JSON 文件的架构,请参阅分布式训练配置Amazon Process SageMaker ing 如何配置您的处理容器。您也可以安装和使用第三方分布式计算库,例如 Ray 或 DeepSpeed in SageMaker。

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

选项 4:并行或按顺序启动多个作业

您还可以将 ML 计算工作流分配到较小的并行或顺序计算任务中,每个任务都由自己的 SageMaker 训练或 SageMaker 处理任务表示。对于以下情况或任务,将一个任务拆分为多个作业可能会带来好处:

  • 当每个子任务都有特定的数据通道和元数据条目(例如超参数、模型配置或实例类型)时。

  • 当您在子任务级别实施重试步骤时。

  • 当您在运行工作负载期间改变子任务的配置时,例如增加批次大小来进行训练时。

  • 当您需要运行的 ML 任务用时比单个训练作业允许的最大训练时间(最多 28 天)更长时。

  • 当计算工作流的不同步骤需要不同的实例类型时。

对于超参数搜索的特定情况,请使用SageMaker 自动模型调整。 SageMaker Automated Model Tuning 是一个无服务器参数搜索协调器,它根据搜索逻辑代表你启动多个训练作业,搜索逻辑可以是随机、贝叶斯或。 HyperBand

此外,要编排多个训练作业,您还可以考虑使用工作流程编排工具,例如流SageMaker 水线、AWS Step Functions 和 Apache Airflow,这些工具由适用于 Apache Airflow (MWAA) 和工作流的亚马逊托管工作流程 (MWA A) 和工作流程支持。SageMaker