本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SageMaker HyperPod 生命周期配置最佳实践
SageMaker HyperPod 始终提供 up-and-running 计算集群,这些集群是高度可定制的,因为您可以编写生命周期脚本来告诉 SageMaker HyperPod 如何设置集群资源。以下主题是准备生命周期脚本以使用开源工作负载管理器工具设置 SageMaker HyperPod 集群的最佳实践。
为设置 Slurm 准备生命周期脚本 SageMaker HyperPod
以下主题讨论如何准备用于设置 Slurm
主题
高级概述
以下过程是配置 HyperPod集群并使用 Slurm 对其进行设置的主要流程。这些步骤按自下而上的方法排列。
-
规划如何在集群上创建 Slurm 节点。 HyperPod 例如,如果您要配置两个 Slurm 节点,则需要在集群中设置两个实例组。 HyperPod
-
准备一个
provisioning_parameters.json
文件,该文件是用于在上配置 Slurm 节点的配置表 HyperPod.provisioning_parameters.json
应包含要在集群上配置的 Slurm 节点配置信息。 HyperPod这应该反映步骤 1 中对 Slurm 节点的设计。 -
准备一组生命周期脚本来设置 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 时需要使用的信息。 -
将前面步骤中的所有文件收集到一个文件夹中。
└── 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 存储桶。复制并保留 S3 存储桶路径。请注意,您应该以开头创建 S3 存储桶路径,
sagemaker-
因为您需要选择一个IAM 角色适用于 SageMaker HyperPod附加的 AmazonSageMakerClusterInstanceRolePolicy,该路径仅允许以前缀开头的 S3 存储桶路径sagemaker-
。以下命令是将所有文件上传到 S3 存储桶的示例命令。aws s3 cp --recursive
./lifecycle_files
s3://sagemaker-hyperpod-lifecycle/src
-
准备集 HyperPod 群创建请求。
-
选项 1:如果您使用 Amazon CLI,请按照中的说明以 JSON 格式 (
create_cluster.json
) 编写集群创建请求创建新集群。 -
选项 2:如果您使用 SageMaker 控制台 UI,请按照中的说明在 HyperPod 控制台 UI 中填写创建集群申请表创建集 SageMaker HyperPod 群。
在此阶段,请确保按照步骤 1 和步骤 2 中计划的相同结构创建实例组。此外,请务必在请求表单中指定步骤 5 中的 S3 存储桶。
-
-
提交集群创建请求。 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 集群创建期间发生的事情以及基本生命周期脚本是如何设计的。
-
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
;相反,请确保在创建集群提交表单中指定正确的集群配置信息。 -
on_create.sh
— 对于每个实例组,您需要提供一个入口点 shell 脚本,以运行命令on_create.sh
、运行脚本来安装软件包,以及使用 Slurm 设置 HyperPod 集群环境。您需要准备的两件事是设置 Slurm 所provisioning_parameters.json
HyperPod 必需的,以及一组用于安装软件包的生命周期脚本。编写此脚本是为了查找和运行以下文件,如中的示例脚本所示on_create.sh
。 注意
确保将整组生命周期脚本上传到您在中指定的 S3 位置
create_cluster.json
。你还应该把你的provisioning_parameters.json
放在同一个位置。-
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.json
和provisioning_parameters.json
以将 HyperPod 实例组分配给 Slurm 节点的示例。在此示例中,我们假设设置了三个 Slurm 节点:控制器(管理)节点、登录节点(可选)和计算(工作节点)。提示
为了帮助您验证这两个 JSON 文件, HyperPod 服务团队提供了一个验证脚本
validate-config.py
。要了解更多信息,请参阅在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod。 -
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" } ] } ] }
-
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.sh
setup_rds_accounting.sh
您还可以添加更多脚本,将它们打包到同一个目录下,然后向中添加代码行 lifecycle_script.py
以让脚本 HyperPod 运行。有关基本生命周期脚本的更多信息,另请参阅 Awsome Distributed Training GitHub 存储库中的 3.1 生命周期脚本。 除了默认设置外,该
utils
文件夹下还有更多用于安装以下软件的脚本。该 lifecycle_script.py
文件已经准备好包含用于运行安装脚本的代码行,因此请参阅以下项目来搜索这些行并取消注释以激活它们。-
以下代码行用于安装 Docker
、Enroot 和 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)
-
您可以将集 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()
-
-
确保将步骤 2 中的所有配置文件和安装脚本上传到您在步骤 1 的
CreateCluster
请求中提供的 S3 存储桶。例如,假设你create_cluster.json
有以下几点。"LifeCycleConfig": { "SourceS3URI": "
s3://sagemaker-hyperpod-lifecycle/src
", "OnCreate": "on_create.sh
" }然后,你
"s3://sagemaker-hyperpod-lifecycle/src"
应该包含on_create.sh
lifecycle_script.py
、provisioning_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 设置以下基本参数: ClusterName
SlurmctldHost
、PartitionName
、和NodeName
。此外,要启用该自动恢复功能, HyperPod 需要按以下方式设置
TaskPlugin
和SchedulerParameters
参数。默认情况下, 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 到您的集群,请进行以下设置。
-
使用您的亚马逊 VPC。
-
要使 HyperPod 集群实例在您的 VPC 内进行通信,请确保将附加(可选)用于亚马逊 Virtual Priv SageMaker HyperPod ate Cloud 的额外权限到的 IAM 角色 SageMaker HyperPod。
-
在中
create_cluster.json
,包括以下 VPC 信息。"VpcConfig": { "SecurityGroupIds": [ "
string
" ], "Subnets": [ "string
" ] }有关设置 Amazon VPC 的更多提示,请参阅(可选) SageMaker HyperPod 使用您的亚马逊 VPC 进行设置。
-
-
要完成使用 Amazon FSx for Lustre 配置 Slurm,请在中指定 Amazon FSx DNS 名称和亚马逊 FS
provisioning_parameters.json
x 挂载名称,如本节中的图所示。从提供的基本生命周期脚本开始 HyperPod您可以从账户中的亚马逊 FSx for Lustre 控制台或通过运行以下命令来找到亚马逊 FSx 信息。 Amazon CLIaws 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
create_cluster.json
和provisioning_parameters.json
文件,请按如下方式运行验证脚本。
python3 validate-config.py --cluster-config
create_cluster.json
--provisioning-parametersprovisioning_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
要同时在多个节点上运行脚本,请使用srun
以下示例命令在由 8 个节点组成的 Slurm 集群上运行脚本。
# The following command runs on 8 nodes srun -N
8
python3 hyperpod-precheck.py
注意
要了解有关验证脚本的更多信息,例如该脚本提供的运行时验证功能以及解决未通过验证的问题的指南,请参阅在 Awsome Distributed Tra GitHub ining 存储库中运行工作负载之前的运行时验证
在群集节点上以交互方式开发生命周期脚本
本节介绍如何在不重复创建和删除 HyperPod 集群的情况下以交互方式开发生命周期脚本。
-
使用基本生命周期脚本创建 HyperPod 集群。
-
登录到群集节点。
-
通过编辑脚本 (
configure_xyz.sh
) 并在节点上重复运行来开发脚本 ()。-
HyperPod 以 root 用户身份运行生命周期脚本,因此我们建议您在开发时以 root 用户身份运行,以确保脚本在运行时在相同的条件下进行测试 HyperPod。
configure_xyz.sh
-
-
lifecycle_script.py
通过添加类似于以下内容的代码行将脚本集成到。ExecuteBashScript("./utils/
configure_xyz.sh
").run() -
将更新的生命周期脚本上传到最初用于上传基本生命周期脚本的 S3 存储桶。
-
lifecycle_script.py
通过创建新集 HyperPod 群来测试的集成版本。
使用新的或更新的生命周期脚本更新集群
有三种方法可以更新 HyperPod 软件。
-
用于修补 HyperPod 软件
UpdateClusterSoftware
的 API 会在整个实例组上重新运行生命周期脚本。 -
UpdateCluster
API 仅运行新实例组的生命周期脚本。 -
您也可以直接在 HyperPod实例中运行生命周期脚本。
注意事项
使用时请考虑以下几点 SageMaker HyperPod。
-
HyperPod 在集群的每个实例SageMaker HyperPod DLAMI上运行,并且 AMI 已预先安装了软件包,这些软件包符合它们与功能之间的兼容性。 HyperPod请注意,如果您重新安装任何预安装的软件包,则需要负责安装兼容的软件包,并且请注意,某些 HyperPod 功能可能无法按预期运行。