SageMaker HyperPod 生命周期配置最佳实践 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

SageMaker HyperPod 生命周期配置最佳实践

SageMaker HyperPod 始终提供 up-and-running 计算集群,这些集群是高度可定制的,因为您可以编写生命周期脚本来告诉 SageMaker HyperPod 如何设置集群资源。以下主题是准备生命周期脚本以使用开源工作负载管理器工具设置 SageMaker HyperPod 集群的最佳实践。

为设置 Slurm 准备生命周期脚本 SageMaker HyperPod

以下主题讨论如何准备用于设置 Slurm 的生命周期脚本。 SageMaker HyperPod

高级概述

以下过程是配置 HyperPod集群并使用 Slurm 对其进行设置的主要流程。这些步骤按自下而上的方法排列。

  1. 规划如何在集群上创建 Slurm 节点。 HyperPod 例如,如果您要配置两个 Slurm 节点,则需要在集群中设置两个实例组。 HyperPod

  2. 准备一个provisioning_parameters.json文件,该文件是用于在上配置 Slurm 节点的配置表 HyperPod. provisioning_parameters.json应包含要在集群上配置的 Slurm 节点配置信息。 HyperPod这应该反映步骤 1 中对 Slurm 节点的设计。

  3. 准备一组生命周期脚本来设置 Slurm HyperPod 以安装软件包并在集群中为您的用例设置环境。您应该在中央 Python 脚本 (lifecycle_script.py) 中构建生命周期脚本,使其集体按顺序运行,并编写一个入口点 shell 脚本 (on_create.sh) 来运行 Python 脚本。稍后在步骤 5 中,您需要向 HyperPod 集群创建请求提供入口点 shell 脚本。

    另外,请注意,您应该编写预期的脚本resource_config.json,这些脚本将在集群创建 HyperPod期间生成。 resource_config.json包含 HyperPod群集资源信息,例如 IP 地址、实例类型和 ARN,是配置 Slurm 时需要使用的信息。

  4. 将前面步骤中的所有文件收集到一个文件夹中。

    └── lifecycle_files // your local folder ├── provisioning_parameters.json ├── on_create.sh ├── lifecycle_script.py └── ... // more setup scrips to be fed into lifecycle_script.py
  5. 将所有文件上传到 S3 存储桶。复制并保留 S3 存储桶路径。请注意,您应该以开头创建 S3 存储桶路径,sagemaker-因为您需要选择一个IAM 角色适用于 SageMaker HyperPod附加的 AmazonSageMakerClusterInstanceRolePolicy,该路径仅允许以前缀开头的 S3 存储桶路径sagemaker-。以下命令是将所有文件上传到 S3 存储桶的示例命令。

    aws s3 cp --recursive ./lifecycle_files s3://sagemaker-hyperpod-lifecycle/src
  6. 准备集 HyperPod 群创建请求。

    • 选项 1:如果您使用 Amazon CLI,请按照中的说明以 JSON 格式 (create_cluster.json) 编写集群创建请求创建新集群

    • 选项 2:如果您使用 SageMaker 控制台 UI,请按照中的说明在 HyperPod 控制台 UI 中填写创建集群申请表创建集 SageMaker HyperPod 群

    在此阶段,请确保按照步骤 1 和步骤 2 中计划的相同结构创建实例组。此外,请务必在请求表单中指定步骤 5 中的 S3 存储桶。

  7. 提交集群创建请求。 HyperPod 根据请求配置集群,然后在集 HyperPod 群实例中创建resource_config.json文件,并在运行生命周期脚本的集群上设置 Slurm。

以下部分将引导您完成并深入探讨如何组织配置文件和生命周期脚本以在创建 HyperPod 集群期间正常运行的详细信息。

从提供的基本生命周期脚本开始 HyperPod

本节将引导你了解以自上而下的方法开启 Slurm 的基本流程 HyperPod 的每个组成部分。它从准备用于运行 CreateCluster API 的 HyperPod 集群创建请求开始,然后深入研究生命周期脚本的层次结构。使用 Awsome 分布式训练 GitHub 存储库中提供的生命周期脚本示例。通过运行以下命令克隆存储库。

git clone https://github.com/aws-samples/awsome-distributed-training/

用于在上设置 Slurm 集群的基本生命周期脚本 SageMaker HyperPod可在中找到。1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

以下流程图详细概述了应如何设计基本生命周期脚本。图表下方的描述和程序指南解释了它们在 HyperPod CreateCluster API 调用期间的工作原理。

图: HyperPod 集群创建和生命周期脚本结构的详细流程图。(1) 虚线箭头指向方框 “调入” 的位置,显示配置文件和生命周期脚本的准备流程。它从准备脚本provisioning_parameters.json和生命周期脚本开始。然后对它们进行编码,lifecycle_script.py以便按顺序进行集体执行。lifecycle_script.py脚本的执行由 on_create.sh shell 脚本完成,该脚本将在 HyperPod 实例终端中运行。(2) 实心箭头显示了主 HyperPod 集群的创建流程以及方框是如何 “调入” 或 “提交给” 的。 on_create.sh是创建集群请求的必填项,可以在控制台用户界面中的创建集群请求表中找到。create_cluster.json提交请求后,根据请求和生命周期脚本中的给定配置信息 HyperPod 运行 CreateCluster API。(3) 虚线箭头表示 HyperPod 平台在集群资源配置期间resource_config.json在集群中创建的实例。 resource_config.json包含 HyperPod 群集资源信息,例如集群 ARN、实例类型和 IP 地址。请务必注意,在创建集群期间,您应该准备好生命周期脚本,resource_config.json以备不时之需。有关更多信息,请参阅下面的程序指南。

以下程序指南解释了 HyperPod 集群创建期间发生的事情以及基本生命周期脚本是如何设计的。

  1. create_cluster.json— 要提交 HyperPod 集群创建请求,您需要准备一个 JSON 格式的CreateCluster请求文件。在此最佳实践示例中,我们假设请求文件已命名create_cluster.json。写信create_cluster.json给集 HyperPod 群配置实例组。最佳做法是添加与您计划在集群上配置的 Slurm 节点数量相同的实例组。 HyperPod确保为要分配给计划设置的 Slurm 节点的实例组指定唯一的名称。

    此外,您还需要指定 S3 存储桶路径,以将整组配置文件和生命周期脚本存储到CreateCluster请求表单InstanceGroups.LifeCycleConfig.SourceS3Uri中的字段名,并将入口点 shell 脚本的文件名(假设已命名on_create.sh)指定到。InstanceGroups.LifeCycleConfig.OnCreate

    注意

    如果您在 HyperPod 控制台用户界面中使用创建集群提交表单,则控制台会代表您管理填写和提交CreateCluster请求,并在后端运行 CreateCluster API。在这种情况下,您无需创建create_cluster.json;相反,请确保在创建集群提交表单中指定正确的集群配置信息。

  2. on_create.sh— 对于每个实例组,您需要提供一个入口点 shell 脚本,以运行命令on_create.sh、运行脚本来安装软件包,以及使用 Slurm 设置 HyperPod 集群环境。您需要准备的两件事是设置 Slurm 所provisioning_parameters.json HyperPod 必需的,以及一组用于安装软件包的生命周期脚本。编写此脚本是为了查找和运行以下文件,如中的示例脚本所示on_create.sh

    注意

    确保将整组生命周期脚本上传到您在中指定的 S3 位置create_cluster.json。你还应该把你的provisioning_parameters.json放在同一个位置。

    1. provisioning_parameters.json— 这是一个用于在上配置 Slurm 节点的配置表 HyperPod. 该on_create.sh脚本会找到此 JSON 文件并定义用于标识其路径的环境变量。通过这个 JSON 文件,你可以配置 Slurm 节点和要与之通信的存储选项,例如 Amazon for Lustre for Lustre for Slurm 的存储选项。在中provisioning_parameters.json,请确保根据计划设置方式,使用您在中create_cluster.json指定的名称将 HyperPod 集群实例组适当地分配给 Slurm 节点。

      下图显示了如何编写两个 JSON 配置文件create_cluster.jsonprovisioning_parameters.json以将 HyperPod 实例组分配给 Slurm 节点的示例。在此示例中,我们假设设置了三个 Slurm 节点:控制器(管理)节点、登录节点(可选)和计算(工作节点)。

      提示

      为了帮助您验证这两个 JSON 文件, HyperPod 服务团队提供了一个验证脚本validate-config.py。要了解更多信息,请参阅在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod

      图: HyperPod集群创建和 Slurm 配置之间的create_cluster.json直接比较。provisiong_params.json中的实例组数量create_cluster.json应与您要配置为 Slurm 节点的节点数量相匹配。对于图中的示例,将在由三个实例组组组成的 HyperPod 集群上配置三个 Slurm 节点。您应通过相应地指定实例组名称将 HyperPod 集群实例组分配给 Slurm 节点。
    2. resource_config.json— 在创建集群期间,编写lifecycle_script.py脚本是为了期望有来自的resource_config.json文件 HyperPod。此文件包含有关集群的信息,例如实例类型和 IP 地址。

      运行 CreateCluster API 时, HyperPod 会/opt/ml/config/resource_config.json根据该文件在上创建资源配置create_cluster.json文件。文件路径保存到名为的环境变量中SAGEMAKER_RESOURCE_CONFIG_PATH

      重要

      resource_config.json文件由 HyperPod 平台自动生成,您无需创建。以下代码将显示一个示例resource_config.json,说明将根据上create_cluster.json一步创建的集群进行创建,并帮助您了解后端会发生什么以及自动生成的resource_config.json会是什么样子。

      { "ClusterConfig": { "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde01234yz", "ClusterName": "your-hyperpod-cluster" }, "InstanceGroups": [ { "Name": "controller-machine", "InstanceType": "ml.c5.xlarge", "Instances": [ { "InstanceName": "controller-machine-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "login-group", "InstanceType": "ml.m5.xlarge", "Instances": [ { "InstanceName": "login-group-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "compute-nodes", "InstanceType": "ml.trn1.32xlarge", "Instances": [ { "InstanceName": "compute-nodes-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-2", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-3", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-4", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] } ] }
    3. lifecycle_script.py— 这是主要 Python 脚本,它在配置时共同运行在 HyperPod 集群上设置 Slurm 的生命周期脚本。此脚本读取中provisioning_parameters.json指定或标识的路径on_create.sh,将相关信息传递给每个生命周期脚本,然后按顺序运行生命周期脚本。resource_config.json

      生命周期脚本是一组脚本,您可以完全灵活地对其进行自定义,以便在集群创建期间安装软件包并设置必要的或自定义配置,例如设置 Slurm、创建用户、安装 Conda 或 Docker。该示例lifecycle_script.py脚本已准备好在存储库中运行其他基本生命周期脚本,例如启动 Slurm deamons (start_slurm.sh)、为 Lustre 挂载 Amazon FSx () 以及设置 MariaDB 会计 (mount_fsx.sh) 和 RDS 会计 ()。setup_mariadb_accounting.shsetup_rds_accounting.sh您还可以添加更多脚本,将它们打包到同一个目录下,然后向中添加代码行lifecycle_script.py以让脚本 HyperPod 运行。有关基本生命周期脚本的更多信息,另请参阅 Awsome Distributed Training GitHub 存储库中的 3.1 生命周期脚本

      除了默认设置外,该utils文件夹下还有更多用于安装以下软件的脚本。该lifecycle_script.py文件已经准备好包含用于运行安装脚本的代码行,因此请参阅以下项目来搜索这些行并取消注释以激活它们。

      1. 以下代码行用于安装 DockerEnroot 和 Pyxis。这些软件包是在 Slurm 集群上运行 Docker 容器所必需的。

        要启用此安装步骤,请在config.py文件True中将enable_docker_enroot_pyxis参数设置为。

        # Install Docker/Enroot/Pyxis if Config.enable_docker_enroot_pyxis: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_enroot_pyxis.sh").run(node_type)
      2. 您可以将集 HyperPod 群与适用于 Prometheus 的亚马逊托管服务和 Amazon Managed Grafana 集成,将有关 HyperPod集群和集群节点的指标导出到亚马逊托管 Grafana 控制面板。要导出指标并使用 Slurm 控制面板、NVIDIA DCGM导出器控制面板和 Amazon Managed Grafana 上的 EFA 指标控制面板,你需要安装 Prometheus 的 Slurm 导出器、NVIDIA DCGM 导出器和 E FA 节点导出器。有关在亚马逊托管 Grafana 工作空间上安装导出器包和使用 Grafana 控制面板的更多信息,请参阅。监控 SageMaker HyperPod 集群资源

        要启用此安装步骤,请在config.py文件True中将enable_observability参数设置为。

        # Install metric exporting software and Prometheus for observability if Config.enable_observability: if node_type == SlurmNodeType.COMPUTE_NODE: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_dcgm_exporter.sh").run() ExecuteBashScript("./utils/install_efa_node_exporter.sh").run() if node_type == SlurmNodeType.HEAD_NODE: wait_for_scontrol() ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_slurm_exporter.sh").run() ExecuteBashScript("./utils/install_prometheus.sh").run()
  3. 确保将步骤 2 中的所有配置文件和安装脚本上传到您在步骤 1CreateCluster请求中提供的 S3 存储桶。例如,假设你create_cluster.json有以下几点。

    "LifeCycleConfig": { "SourceS3URI": "s3://sagemaker-hyperpod-lifecycle/src", "OnCreate": "on_create.sh" }

    然后,你"s3://sagemaker-hyperpod-lifecycle/src"应该包含on_create.shlifecycle_script.pyprovisioning_parameters.json、和所有其他安装脚本。假设您已在本地文件夹中准备好文件,如下所示。

    └── lifecycle_files // your local folder ├── provisioning_parameters.json ├── on_create.sh ├── lifecycle_script.py └── ... // more setup scrips to be fed into lifecycle_script.py

    要上传文件,请按如下方式使用 S3 命令。

    aws s3 cp --recursive ./lifecycle_scripts s3://sagemaker-hyperpod-lifecycle/src

Slurm 配置 HyperPod 文件中管理哪些特定的配置

当您在上创建 Slurm 集群时 HyperPod, HyperPod 代理会根据您的集群创建请求slurm.conf和生命周期脚本设置和gres.conf文件,/opt/slurm/etc/以管理 Slurm HyperPod 集群。以下列表显示了 HyperPod 代理处理和覆盖的特定参数。

重要

我们强烈建议您不要更改这些由管理的参数 HyperPod。

  • 在中 slurm.conf, HyperPod 设置以下基本参数:ClusterNameSlurmctldHostPartitionName、和NodeName

    此外,要启用该自动恢复功能, HyperPod 需要按以下方式设置TaskPluginSchedulerParameters参数。默认情况下, HyperPod 代理将这两个参数设置为所需的值。

    TaskPlugin=task/none SchedulerParameters=permit_job_expansion
  • 在中 gres.conf, HyperPod 管理 G NodeName PU 节点。

将 Amazon FSx for Lu HyperPod stre 挂载到你的集群上

要将 Amazon FSx for Lustre 的共享文件系统挂载 HyperPod 到您的集群,请进行以下设置。

  1. 使用您的亚马逊 VPC。

    1. 要使 HyperPod 集群实例在您的 VPC 内进行通信,请确保将附加(可选)用于亚马逊 Virtual Priv SageMaker HyperPod ate Cloud 的额外权限到的 IAM 角色 SageMaker HyperPod。

    2. 在中create_cluster.json,包括以下 VPC 信息。

      "VpcConfig": { "SecurityGroupIds": [ "string" ], "Subnets": [ "string" ] }

      有关设置 Amazon VPC 的更多提示,请参阅(可选) SageMaker HyperPod 使用您的亚马逊 VPC 进行设置

  2. 要完成使用 Amazon FSx for Lustre 配置 Slurm,请在中指定 Amazon FSx DNS 名称和亚马逊 FS provisioning_parameters.json x 挂载名称,如本节中的图所示。从提供的基本生命周期脚本开始 HyperPod您可以从账户中的亚马逊 FSx for Lustre 控制台或通过运行以下命令来找到亚马逊 FSx 信息。 Amazon CLI aws fsx describe-file-systems

    "fsx_dns_name": "fs-12345678a90b01cde.fsx.us-west-2.amazonaws.com", "fsx_mountname": "1abcdefg"

在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod

要在提交集群创建请求之前验证 JSON 配置文件,请使用配置验证脚本validate-config.py。该脚本解析并比较您的 HyperPod 集群配置 JSON 文件和 Slurm 配置 JSON 文件,并确定这两个文件之间以及亚马逊 EC2、Amazon VPC 和 Amazon FSx 资源之间是否存在任何资源配置错误。例如,要验证从提供的基本生命周期脚本开始 HyperPod部分中的create_cluster.jsonprovisioning_parameters.json文件,请按如下方式运行验证脚本。

python3 validate-config.py --cluster-config create_cluster.json --provisioning-parameters provisioning_parameters.json

以下是成功验证的输出示例。

✔️ Validated instance group name worker-group-1 is correct ... ✔️ Validated subnet subnet-012345abcdef67890 ... ✔️ Validated security group sg-012345abcdef67890 ingress rules ... ✔️ Validated security group sg-012345abcdef67890 egress rules ... ✔️ Validated FSx Lustre DNS name fs-012345abcdef67890.fsx.us-east-1.amazonaws.com ✔️ Validated FSx Lustre mount name abcdefgh ✅ Cluster Validation succeeded

在 Slurm 集群上运行生产工作负载之前验证运行时间 HyperPod

要在 Slurm 集群上运行任何生产工作负载之前检查运行时间 HyperPod,请使用运行时验证脚本。hyperpod-precheck.py该脚本检查 Slurm 集群是否安装了用于运行 Docker 的所有软件包,该集群是否有正确安装的 FSx for Lustre 文件系统和共享文件系统的用户目录,以及 Slurm 守护程序是否在所有计算节点上运行。

要同时在多个节点上运行脚本,请使用srun以下示例命令在由 8 个节点组成的 Slurm 集群上运行脚本。

# The following command runs on 8 nodes srun -N 8 python3 hyperpod-precheck.py
注意

要了解有关验证脚本的更多信息,例如该脚本提供的运行时验证功能以及解决未通过验证的问题的指南,请参阅在 Awsome Distributed Tra GitHub ining 存储库中运行工作负载之前的运行时验证

在群集节点上以交互方式开发生命周期脚本

本节介绍如何在不重复创建和删除 HyperPod 集群的情况下以交互方式开发生命周期脚本。

  1. 使用基本生命周期脚本创建 HyperPod 集群。

  2. 登录到群集节点。

  3. 通过编辑脚本 (configure_xyz.sh) 并在节点上重复运行来开发脚本 ()。

    1. HyperPod 以 root 用户身份运行生命周期脚本,因此我们建议您在开发时以 root 用户身份运行,以确保脚本在运行时在相同的条件下进行测试 HyperPod。configure_xyz.sh

  4. lifecycle_script.py通过添加类似于以下内容的代码行将脚本集成到。

    ExecuteBashScript("./utils/configure_xyz.sh").run()
  5. 将更新的生命周期脚本上传到最初用于上传基本生命周期脚本的 S3 存储桶。

  6. lifecycle_script.py通过创建新集 HyperPod 群来测试的集成版本。

使用新的或更新的生命周期脚本更新集群

有三种方法可以更新 HyperPod 软件。

  • 用于修补 HyperPod 软件UpdateClusterSoftware的 API 会在整个实例组上重新运行生命周期脚本。

  • UpdateClusterAPI 仅运行新实例组的生命周期脚本。

  • 您也可以直接在 HyperPod实例中运行生命周期脚本。

注意事项

使用时请考虑以下几点 SageMaker HyperPod。

  • HyperPod 在集群的每个实例SageMaker HyperPod DLAMI上运行,并且 AMI 已预先安装了软件包,这些软件包符合它们与功能之间的兼容性。 HyperPod请注意,如果您重新安装任何预安装的软件包,则需要负责安装兼容的软件包,并且请注意,某些 HyperPod 功能可能无法按预期运行。