本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Slurm 3.8.0 版中的动态节点分配策略
从 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将 Amazon EC2 实例分配给 Slurm 仅当可以为每个请求的节点分配一个 Amazon EC2 实例时才有节点
-
尽最大努力将 Ama EC2 zon 实例分配给 Slurm 节点,即使 Amazon EC2 实例容量未涵盖所有请求的节点
上述策略的可能组合转化为 ParallelCluster发射策略。
all-or-nothing缩放:
此策略包括 AWS ParallelCluster 为每个任务 EC2 启动 Amazon 启动实例 API 调用,这要求成功启动所请求的计算节点所需的所有实例。这可确保集群只在每个作业所需的容量可用时才进行扩展,避免在扩展过程结束时留下闲置实例。
该策略使用all-or-nothing逻辑来启动每项任务的 Amazon EC2 实例 plus,并使用all-or-nothing逻辑将亚马逊 EC2 实例分配给 Slurm 节点。
该策略将启动请求分为若干批次,每个请求的计算资源一个批次,每个批次最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求, ParallelCluster 按顺序处理多个批次。
任何单一资源的批处理失败都会导致所有相关未使用容量的终止,从而确保在扩展过程结束时不会留下任何闲置实例。
限制
-
扩展所需的时间与每次执行提交的任务数量成正比 Slurm 恢复程序。
-
扩展操作受 RunInstances 资源账户限制的限制,默认情况下设置为 1000 个实例。此限制符合 AWS EC2 API 限制政策,有关更多详细信息,请参阅 A mazon EC2 API 限制文档
-
当您在具有单一实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,只有在单个可用区中可以提供所有容量时,all-or-nothing EC2启动 API 调用才会成功。
-
当您在具有多种实例类型的计算资源中提交任务时,在具有单个可用区的队列中,只有当所有容量均可由单个实例类型提供时,all-or-nothingAmazon La EC2 unch API 调用才会成功。
-
当您在具有多种实例类型的计算资源中提交任务时,在跨越多个可用区的队列中,all-or-nothingAmazon la EC2 unch API 调用不受支持,而是 ParallelCluster 执行尽力扩展。
greedy-all-or-nothing缩放:
该 all-or-nothing策略的这种变体仍然可以确保集群仅在每个任务所需的容量可用时才进行扩展,从而避免在扩展过程结束时出现空闲实例,但它涉及 ParallelCluster 启动一个旨在实现最低目标容量为 1 的 Amazon EC2 启动实例 API 调用,尝试将启动的节点数量最大化到请求的容量。该策略使用尽力为所有任务启动 EC2实例的逻辑,以及将 Amazon EC2 实例分配给的all-or-nothing逻辑 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 EC2 个 Amazon 实例可用于满足请求的容量 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 第一个作业的节点成功。
-
在剩下的 10 个已启动实例中,另一项尽力分配给 Slurm 即使请求的总容量为 20,第二个任务的节点也会成功。但是,由于任务请求的是 20 个节点,并且只能将 Amazon EC2 实例分配给其中 10 个节点,因此任务无法启动,实例处于空闲状态,直到找到足够的容量在稍后调用扩展过程时启动缺少的 10 个实例,或者调度器将任务安排在其他已经运行的计算节点上。