动态节点的集群扩展 - AWS ParallelCluster

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

动态节点的集群扩展

ParallelCluster 支持使用SlurmSlurm的 power saver 插件动态扩展集群的方法。有关更多信息,请参阅 Slurm 文档中的 Cloud Scheduling GuideSlurm Power Saving Guide

从 ParallelCluster 版本 3.8.0 开始, ParallelCluster 使用作业级恢复作业级扩展作为默认的动态节点分配策略来扩展集群: ParallelCluster 根据每个作业的要求、分配给任务的节点数量以及需要恢复的节点数量来扩展集群。 ParallelCluster 从 SLURM_RESUME_FILE 环境变量中获取此信息。

动态节点的扩展分为两个步骤,包括启动 EC2 实例和将启动的 Amazon EC2 实例分配给Slurm节点。这两个步骤中的每一个都可以使用all-or-nothing尽力而为的逻辑来完成。

要启动 Amazon EC2 实例,请执行以下操作:

  • all-or-nothing调用启动的 Amazon EC2 API,其最小目标等于总目标容量

  • 尽力调用启动 Amazon EC2 API,最低目标等于 1,总目标容量等于请求的容量

要将 Amazon EC2 实例分配给Slurm节点,请执行以下操作:

  • all-or-nothing只有在可以为每个请求的Slurm节点分配一个 Amazon EC2 实例的情况下,才会将 Amazon EC2 实例分配给节点

  • 尽最大努力将 Amazon EC2 实例分配给Slurm节点,即使 Amazon EC2 实例容量未覆盖所有请求的节点也是如此

    上述策略的可能组合转化为 ParallelCluster发射策略。

The available ParallelCluster 发射策略 that can be set into the ScalingStrategy cluster configuration to be used with 作业级扩展 are:

all-or-nothing缩放:

此策略包括 AWS ParallelCluster 为每个任务启动 Amazon EC2 启动实例 API 调用,这要求成功启动所请求的计算节点所需的所有实例。这样可以确保集群仅在每个作业所需的容量可用时才进行扩展,从而避免在扩展过程结束时留下空闲的实例。

该策略使用一种all-or-nothing逻辑来启动每项任务的 Amazon EC2 实例,以及将 Amazon EC2 实例分配给Slurm节点的all-or-nothing逻辑。

策略组将请求分成批次,每个请求的计算资源对应一个批次,每个批处理最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求, ParallelCluster 按顺序处理多个批次。

任何单个资源的批次失败都会导致所有关联的未使用容量终止,从而确保在扩展过程结束时不会留下任何空闲的实例。

限制

  • 扩展所需的时间与每次执行Slurm恢复程序提交的作业数量成正比。

  • 扩展操作受 RunInstances 资源账户限制的限制,默认情况下设置为 1000 个实例。此限制符合 AWS EC2 API 限制政策,有关更多详细信息,请参阅 Amazon EC2 API 限制文档

  • 当您在具有单一实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,只有在单个可用区中可以提供所有容量时,all-or-nothingEC2 启动 API 调用才会成功。

  • 当您在具有多种实例类型的计算资源中提交任务时,在具有单个可用区的队列中,只有当所有容量均可由单个实例类型提供时,all-or-nothingAmazon EC2 启动 API 调用才会成功。

  • 当您在具有多种实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,不支持 all-or-nothingAmazon EC2 启动 API 调用,而是 ParallelCluster 执行尽力扩展。

greedy-all-or-nothing缩放:

该 all-or-nothing 策略的这种变体仍然可以确保集群仅在每个任务所需的容量可用时才进行扩展,从而避免在扩展过程结束时出现空闲实例,但它涉及 ParallelCluster 启动一个目标最小容量为 1 的 Amazon EC2 启动实例 API 调用,尝试将启动的节点数量最大化到请求的容量。该策略使用尽力为所有任务启动 EC2 实例的逻all-or-nothing辑,以及将 Amazon EC2 实例分配给每个任务的Slurm节点的逻辑。

策略组将请求分成批次,每个请求的计算资源对应一个批次,每个批处理最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求,Parellelcluster 会按顺序处理多个批次。

它通过在扩展过程中以临时超额扩展为代价来最大限度地提高吞吐量,从而确保在扩展过程结束时不会留下任何空闲的实例。

限制

  • 临时超额扩展是可能的,这会给在扩展完成之前过渡到运行状态的实例带来额外的成本。

  • 与 all-or-nothing 策略中相同的实例限制适用,具体取决于 AWS的 RunInstances 资源账户限制。

尽力扩展:

此策略调用 Amazon EC2 启动实例 API 调用,目标为最小容量为 1,目标是实现请求的总容量,但代价是在扩展过程执行完毕后留下闲置实例(如果请求的容量不是全部可用)。该策略使用尽力逻辑启动所有任务的 Amazon EC2 实例,以及为每个任务将 Amazon EC2 实例分配给 Slurm 节点的最大努力逻辑。

策略组将请求分成批次,每个请求的计算资源对应一个批次,每个批处理最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求, ParallelCluster 按顺序处理多个批次。

这种策略允许在多个扩展流程执行中进行远远超过默认 1000 个实例限制的扩展,但代价是不同扩展过程中的空闲实例。

限制

  • 在无法分配任务请求的所有节点的情况下,扩展过程结束时可能处于空闲运行状态。

以下示例显示了使用不同的ParallelCluster 启动策略扩展动态节点的行为。假设您提交了两个任务,每个任务请求了 20 个节点,总共有 40 个相同类型的节点,但只有 30 个 Amazon EC2 实例可用来满足 EC2 上请求的容量。

all-or-nothing缩放:

  • 对于第一项任务,调用了 A all-or-nothingmazon EC2 启动实例 API,请求了 20 个实例。成功调用会导致 20 个实例启动

  • all-or-nothing 成功将 20 个已启动的实例分配给第一个任务的Slurm节点

  • 调用了另一个 all-or-nothingAmazon EC2 启动实例 API,为第二个任务请求 20 个实例。调用不成功,因为只有另外 10 个实例的容量。目前未启动任何实例

greedy-all-or-nothing缩放:

  • 调用了尽力而为 Amazon EC2 启动实例 API,请求了 40 个实例,这是所有任务请求的总容量。这会导致启动 30 个实例

  • 成功将 20 个已启动的实例all-or-nothing分配给第一个任务的Slurm节点

  • 尝试将剩余已启动的实例再次all-or-nothing分配给第二个任务的Slurm节点,但由于任务请求的总共 20 个实例中只有 10 个可用实例,因此分配不成功

  • 10 个未分配的已启动实例已终止

尽力扩展:

  • 调用了尽力而为 Amazon EC2 启动实例 API,请求了 40 个实例,这是所有任务请求的总容量。这会导致启动 30 个实例。

  • 成功将 20 个已启动的实例分配给第一个任务的Slurm节点。

  • 即使请求的总容量为 20,也成功地将剩余的 10 个已启动实例分配给第二个任务的Slurm节点。但是,由于任务请求的是 20 个节点,并且只能将 Amazon EC2 实例分配给其中 10 个节点,因此任务无法启动,实例处于空闲状态,直到找到足够的容量在稍后调用扩展过程时启动缺失的 10 个实例,或者调度器将任务安排在其他已经运行的计算节点上。

ParallelCluster 使用 2 种类型的动态节点分配策略来扩展集群:

  • 根据可用的请求节点信息进行分配:
    • 所有节点恢复节点列表扩展:

      ParallelCluster ResumeProgram运行时仅根据请求Slurm的节点列表名称Slurm来扩展集群。它仅按节点名称向节点分配计算资源。节点名称列表可以跨越多个作业。

    • 作业级别恢复作业级别扩展:

      ParallelCluster 根据每个作业的要求、当前分配给该任务的节点数以及需要恢复的节点来扩展集群。 ParallelCluster 从SLURM_RESUME_FILE环境变量中获取此信息。

  • 使用 Amazon EC2 启动策略进行分配:
    • 最大努力扩展:

      ParallelCluster 使用最小目标容量等于 1 的 Amazon EC2 启动实例 API 调用来扩展集群,启动支持请求的节点所需的部分但不一定是全部实例。

    • 缩ll-or-nothing放:

      ParallelCluster 使用 Amazon EC2 启动实例 API 调用扩展集群,只有在支持请求的节点所需的所有实例都启动后,该调用才会成功。在这种情况下,它调用 Amazon EC2 启动实例 API,其最小目标容量等于请求的总容量。

默认情况下, ParallelCluster 使用节点列表扩展和尽力而为 Amazon EC 2 启动策略来启动支持请求的节点所需的部分实例,但不一定是全部实例。它会尝试预置尽可能多的容量来处理所提交的工作负载。

从 3.7.0 ParallelCluster 版开始, ParallelCluster 使用作业级扩展和 all-or-nothingEC2 启动策略来处理以独占模式提交的任务。当您在独占模式下提交作业时,该作业对其分配的节点拥有独占访问权限。有关更多信息,请参阅 Slurm 文档中的 EXCLUSIVE

要以独占模式提交作业,请执行以下操作:

  • 向集群提交 Slurm 作业时传递独占标志。例如 sbatch ... --exclusive

  • JobExclusiveAllocation 设置为 true 的已配置集群队列提交作业。

以独占模式提交作业时:

  • ParallelCluster 目前批量启动请求最多包含 500 个节点。如果任务请求的节点超过 500 个, ParallelCluster 则为每组 500 个节点发出启动请求,为其余节点发出额外的启动请求。all-or-nothing

  • 如果节点分配在单个计算资源中, ParallelCluster 则为每组 500 个节点发出启动请求,为其余节点发出额外的启动请求。all-or-nothing如果启动请求失败,则 ParallelCluster 终止所有启动请求创建的未使用容量。

  • 如果节点分配跨越多个计算资源,则 ParallelCluster 需要为每个计算资源发出all-or-nothing启动请求。这些请求也会进行批处理。如果其中一个计算资源的启动请求失败,则 ParallelCluster 终止所有计算资源启动请求创建的未使用容量。

使用all-or-nothing启动策略进行@@ 作业级扩展已知局限性:

  • 当您在具有单一实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,只有在单个可用区中可以提供所有容量时,all-or-nothingEC2 启动 API 调用才会成功。

  • 当您在具有多种实例类型的计算资源中提交任务时,在具有单个可用区的队列中,只有当所有容量均可由单个实例类型提供时,all-or-nothingAmazon EC2 启动 API 调用才会成功。

  • 当您在具有多种实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,不支持 all-or-nothingAmazon EC2 启动 API 调用,而是 ParallelCluster执行尽力扩展。

AWS ParallelCluster 仅使用一种类型的动态节点分配策略来扩展集群:

  • 根据可用的请求节点信息进行分配:

    • 所有节点恢复节点列表扩 ParallelCluster 展:仅根据运行时Slurm请求Slurm的节点列表名称来扩展集群。ResumeProgram它仅按节点名称向节点分配计算资源。节点名称列表可以跨越多个作业。

  • 使用 Amazon EC2 启动策略进行分配:

    • 尽力扩 ParallelCluster 展:使用最小目标容量等于 1 的 Amazon EC2 启动实例 API 调用来扩展集群,启动支持请求的节点所需的部分但不一定是全部实例。

ParallelCluster 使用节点列表扩展和尽力而为 Amazon EC 2 启动策略来启动支持请求的节点所需的部分实例,但不一定是全部实例。它会尝试预置尽可能多的容量来处理所提交的工作负载。

限制

  • 在无法分配任务请求的所有节点的情况下,扩展过程结束时可能处于空闲运行状态。