动态节点的集群扩展 - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

动态节点的集群扩展

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

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

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

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

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

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

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

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

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

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

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

all-or-nothing缩放:

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

该策略使用all-or-nothing逻辑为每个任务加上启动 EC2 实例,并使用all-or-nothing逻辑将 EC2 实例分配给 Slurm 节点。

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

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

限制

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

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

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

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

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

greedy-all-or-nothing缩放:

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

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

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

限制

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

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

尽力扩展:

此策略调用 EC2 启动实例 API 调用,其目标是将最小容量定为 1,目标是实现请求的总容量,但代价是在扩展过程执行后使实例处于空闲状态(如果并非所有请求的容量都可用)。该策略使用尽力逻辑启动所有任务的 EC2 实例,以及为每个任务将 Amazon EC2 实例分配给 Slurm 节点的最大努力逻辑。

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

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

限制

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

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

all-or-nothing缩放:

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

  • all-or-nothing 成功将启动的 20 个实例分配给 Slurm 节点以完成第一个作业

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

greedy-all-or-nothing缩放:

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

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

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

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

尽力扩展:

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

  • 成功 20 个已启动的实例分配给 Slurm 节点以完成第一个作业。

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

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

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

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

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

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

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

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

    • ll-or-nothing缩@@ 比例:

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

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

从 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-nothingEC2 启动 API 调用才会成功。

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

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

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

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

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

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

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

限制

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