View a markdown version of this page

使用 Slurm 持续配置以增强集群操作 - 亚马逊 SageMaker AI

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

使用 Slurm 持续配置以增强集群操作

使用 Slurm 编排创建的 Amazon SageMaker HyperPod 集群现在支持持续配置,该功能可在运行大规模工作负载时提高灵活性和效率。 AI/ML 持续预调配功能可让您快速启动训练、无缝扩展、在不中断操作的情况下执行维护,并对集群操作拥有精细可见性。

注意

对于使用 Slurm 编排创建的 HyperPod 集群,可将持续配置作为可选配置提供。

工作原理

持续配置系统引入了理想状态架构,取代了传统的 “要么全有要么全无” 扩展模型。在之前的模型中,如果无法完全配置任何实例组,则整个集群的创建或更新操作将失败并回滚。通过持续配置,系统会接受部分容量,并继续异步配置剩余的实例。

持续预调配系统:

  • 接受请求:记录每个实例组的目标实例数。

  • 启动配置:开始并行启动所有实例组的实例。

  • 首先配置优先级节点:成功配置至少一个控制器节点(如果指定了登录实例组,则还包括一个登录节点)InService后,集群将过渡到。

  • 跟踪进度:监控每次实例启动尝试并记录状态。

  • 处理失败:自动异步重试工作节点失败的启动。

默认情况下,持续预调配功能处于禁用状态。要使用此功能,请在NodeProvisioningModeCreateCluster请求Continuous中设置为。

启用持续预调配功能后,您可以同时启动多个扩展操作,无需等待之前的操作完成。这使您能够同时扩展同一个集群中不同的实例组,并向同一个实例组提交多个扩展请求。

Priority-based 配置

Slurm 集群需要控制器节点才能运行,然后工作节点才能注册和接受作业。持续资源调配通过基于优先级的资源调配自动处理此问题:

  1. 首先配置控制器实例组。

  2. 一旦一个控制器节点运行正常,登录节点和工作节点就会开始并行配置。

  3. InService当一个控制器节点启动而一个登录节点已启动时(如果指定了登录实例组),则集群将过渡到。如果未指定登录实例组,则集群将在配置控制器节点后立即转换为。InService

  4. 由于容量限制而无法立即配置的工作节点会进入异步重试循环,并在可用时自动添加到 Slurm 集群。

控制器故障处理

在创建集群期间,如果控制器节点无法配置,则行为取决于错误是可重试还是不可重试。

可重试的错误(例如,不健康的实例或暂时性故障):

  • HyperPod 持续替换实例并重试配置,直到控制器启动为止。

  • 已经配置的工作节点和登录节点仍然可用,但是InService直到控制器运行状况良好,集群才会过渡到。

Non-retryable 错误(例如,控制器实例类型没有可用容量或生命周期脚本故障):

  • 该群集被标记为Failed

  • 您将收到失败原因的通知,并且必须采取纠正措施,例如选择不同的实例类型、修复生命周期脚本或在其他可用区重试。

先决条件

持续配置要求通过每个实例组字段中的 API 负载提供 Slurm 配置参数(节点类型、分区名称)。SlurmConfig依赖于 Amazon S3 中旧provisioning_parameters.json文件的集群与持续配置不兼容。

注意

Slurm 集群的持续配置目前不支持以下功能:通过 Slurm 拓扑进行多头节点配置, API-based 以及。SlurmConfigStrategy持续资源调配仅在合并模式下运行,便于slurm.conf管理。

使用计量

HyperPod 具有持续预配功能的集群使用实例级计量来提供反映实际资源使用情况的准确账单。这种计量方法不同于传统的集群级别计费,它会对每个实例进行独立跟踪。

Instance-level 计费

利用持续预调配功能,计费将在单个实例级别开始和停止,而不是等待集群级别的状态变化。此方法具有以下优势:

  • 精准的计费准确性:生命周期脚本开始执行时,开始计费。如果生命周期脚本失败,则将重试实例配置,并向您收取生命周期脚本运行时间的费用。

  • 独立计量:每个实例的账单生命周期均单独管理,防止出现级联计费错误。

  • Real-time 账单更新:计费从实例开始执行其生命周期配置脚本时开始,在实例进入终止状态时停止。

计费生命周期

HyperPod 集群中的每个实例都遵循以下账单生命周期:

  • 计费开始:当实例成功启动并开始执行其生命周期配置脚本时。

  • 继续计费:在实例的整个运行生命周期内。

  • 计费停止:当实例进入终止状态时,无论终止原因如何。

注意

对于启动失败的实例,不会开始计费。如果因容量不足或其他问题导致实例启动失败,您无需为失败的尝试付费。计费在实例级别计算,费用将汇总并显示在集群的 Amazon 资源名称(ARN)下。

创建一个已启用持续预调配的集群

注意

准备生命周期配置脚本并将其上传到您的执行角色可以访问的 Amazon S3 存储桶。有关更多信息,请参阅 SageMaker HyperPod Slurm 集群操作

准备一个 JSON 格式的 CreateCluster API 请求文件。设置NodeProvisioningModeContinuous并在每个实例组的字段中提供 Slurm 拓扑信息。SlurmConfig

// create_cluster.json { "ClusterName": "my-training-cluster", "NodeProvisioningMode": "Continuous", "Orchestrator": { "Slurm": {} }, "InstanceGroups": [ { "InstanceGroupName": "controller-group", "InstanceType": "ml.m5.xlarge", "InstanceCount": 1, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Controller" } }, { "InstanceGroupName": "login-group", "InstanceType": "ml.m5.xlarge", "InstanceCount": 1, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Login" } }, { "InstanceGroupName": "worker-gpu-a", "InstanceType": "ml.p5.48xlarge", "InstanceCount": 16, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Compute", "PartitionNames": ["gpu-training"] } } ], "VpcConfig": { "SecurityGroupIds": ["sg-12345678"], "Subnets": ["subnet-12345678"] } }

运行create-cluster命令提交请求。

aws sagemaker create-cluster \ --cli-input-json file://complete/path/to/create_cluster.json

这将返回新集群的 ARN。

{ "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde12345" }

Slurm 配置管理

持续资源调配仅在合并模式下运行,用于slurm.conf分区管理。在合并模式下 HyperPod,将其分区配置更改添加到您所修改的内容之上。slurm.conf HyperPod 仅更新与分区相关的部分slurm.conf(例如分区名称和节点名称条目);其他 Slurm 配置参数不会被修改。这意味着:

  • 您对的手动编辑slurm.conf将被保留。

  • 无法自动检测偏差,也无法解决您的修改与 HyperPod预期状态之间的冲突。

持续配置不支持SlurmConfigStrategy参数 (ManagedMerge,,Overwrite)。传递任何SlurmConfigStrategy值都会导致 API 错误。

最低容量要求 (MinCount)

该 MinCount 功能允许您指定在实例组转换为InService状态之前必须成功配置的最小实例数量。此功能可以更好地控制扩展操作,并有助于防止出现部分预配置的实例组无法有效用于训练工作负载的情况。

重要

MinCount 并不能永久保证最低容量。它只能确保当实例组首次变为时,可用的实例数量达到指定的最小数量InService。在正常操作期间,例如不健康的实例更换或维护活动, MinCount 可能会出现短暂的下滑。

如何 MinCount 运作

当您创建或更新 MinCount 启用状态的实例组时,会发生以下行为:

  • 新实例组:实例组将保持Creating状态,直到至少成功配置 MinCount 实例并准备就绪。达到此阈值后,实例组将转换为InService

  • 现有实例组:更新 MinCount 现有实例组时,状态将更改为,Updating直到满足新 MinCount 要求为止。

  • 持续扩展:如果大 TargetCount 于 MinCount,则持续扩展系统将继续尝试启动其他实例,直到达到 TargetCount 该值。

  • 超时和回滚:如果在 3 小时内 MinCount 无法满足,系统会自动将实例组回滚到其上次已知的良好状态。有关回滚行为的更多信息,请参阅自动回滚行为。

MinCount 操作期间的实例组状态

MinCount 已配置的实例组表现出以下状态行为:

Creating

对于新的实例组 CurrentCount < MinCount. 在满足最低容量要求之前,实例组将保持此状态。

Updating

对于现有实例组 MinCount ,当修改时和 CurrentCount < MinCount. 在满足新的最低容量要求之前,实例组将保持此状态。

InService

当 MinCount ≤ CurrentCount ≤ TargetCount 时 实例组已准备就绪,所有变更操作均已解锁。

CreatingUpdating状态期间,以下限制适用:

  • 诸如BatchAddClusterNodesBatchDeleteClusterNodes或之类的变异操作UpdateClusterSoftware被阻止

  • 您仍然可以修改 MinCount 和 TargetCount 值以更正配置错误

  • 始终允许删除集群和实例组

自动回滚行为

如果某个实例组无法 MinCount 在 3 小时内到达其状态,则系统会自动启动回滚以防止无限期等待:

  • 新实例组: MinCount 和重置 TargetCount 为 (0, 0)

  • 现有实例组: MinCount TargetCount 和从上次InService状态恢复到其值

  • 选择要终止的实例:如果需要在回滚期间终止实例,则系统会先选择运行状况不佳的实例,然后选择最近配置的实例。

  • 状态转换:实例组在启动回滚后立即转换为InService状态,允许持续扩展系统根据回滚设置管理容量

每次更新时,3 小时的超时 MinCount 都会重置。例如,如果您 MinCount 多次更新,则超时时间将从最近一次更新重新开始。

MinCount 事件

系统会发出特定事件来帮助您跟踪 MinCount 操作:

  • 已达到最低容量:当实例组成功到达其容量 MinCount 并过渡到时发出 InService

  • 已启动回滚:在 3 小时超时到期且自动回滚开始时发出

您可以使用监控这些事件ListClusterEvents来跟踪 MinCount 操作进度。

API 使用

MinCount 使用实例组配置中的MinInstanceCount参数指定:

aws sagemaker create-cluster \ --cluster-name $HP_CLUSTER_NAME \ --instance-groups '[ { "InstanceGroupName": "controller-machine", "InstanceType": "ml.c5.xlarge", "InstanceCount": 1, "SlurmConfig": {"NodeType": "Controller"}, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 2 }, { "InstanceGroupName": "my-login-group", "InstanceType": "ml.c5.xlarge", "InstanceCount": 1, "SlurmConfig": {"NodeType": "Login"}, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 1 }, { "InstanceGroupName": "worker-group-1", "InstanceType": "ml.c5.xlarge", "MinInstanceCount": 1, "InstanceCount": 2, "SlurmConfig": { "NodeType": "Compute", "PartitionNames": ["p1"] }, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 1 } ]' \ --vpc-config '{ "SecurityGroupIds": ["'$SECURITY_GROUP'"], "Subnets": ["'$SUBNET'"] }' \ --node-provisioning-mode Continuous

MinCount 使用时的关键注意事项:

  • MinInstanceCount必须介于CreateClusterUpdateCluster请求中指定的实例组的 0 和InstanceCount(含)值之间

  • 设置MinInstanceCount为 0(默认)可保留标准的连续缩放行为

  • 创建集群期间,“控制器和登录” 的默认值MinInstanceCount设置 InstanceGroup 为 1

  • 设置为MinInstanceCount等于InstanceCount提供要么全有要么全无的缩放行为

  • MinCount 仅适用于设置为的NodeProvisioningMode集群 Continuous