Slurm Workload Manager (slurm) - AWS ParallelCluster

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

Slurm Workload Manager (slurm)

集群容量大小和更新

集群的容量由集群可以扩展的计算节点数量来定义。计算节点由 AWS ParallelCluster 配置 (Scheduling/SlurmQueues/ComputeResources) 中计算资源内定义的 Amazon EC2 实例支持,并组织成队列 (Scheduling/SlurmQueues),1:1 映射到 Slurm 分区。

在计算资源中,可以配置集群中必须始终保持运行的计算节点(实例)的最小数量(MinCount),以及计算资源可扩展到的实例最大数量(MaxCount3 )。

在创建集群时或更新集群时,AWS ParallelCluster 会为集群中定义的每个计算资源(Scheduling/SlurmQueues/ ComputeResources )启动 MinCount 中配置的尽可能多的 Amazon EC2 实例。为覆盖集群中计算资源的最小节点数量而启动的实例称为静态节点。静态节点一旦启动,就会在集群中持续存在,除非发生特定事件或情况,否则系统不会终止它们。例如,此类事件包括 Slurm 或 Amazon EC2 运行状况检查失败,以及 Slurm 节点状态变为 DRAIN 或 DOWN。

为应对集群负载增加而按需启动的 Amazon EC2 实例(范围在 1‘MaxCount - MinCount’MaxCount 减去 MinCount))之间)称为“动态节点”。这些节点的性质是短暂的,启动它们是为了处理待处理的作业,一旦它们闲置了一段时间(由集群配置中的 Scheduling/SlurmSettings/ScaledownIdletime 定义)(默认值:10 分钟),就会被终止。

静态节点和动态节点符合以下命名方案:

  • 静态节点 <Queue/Name>-st-<ComputeResource/Name>-<num>,其中 <num> = 1..ComputeResource/MinCount

  • 动态节点 <Queue/Name>-dy-<ComputeResource/Name>-<num>,其中 <num> = 1..(ComputeResource/MaxCount - ComputeResource/MinCount)

例如,给定以下 AWS ParallelCluster 配置:

Scheduling: Scheduler: Slurm SlurmQueues: - Name: queue1 ComputeResources: - Name: c5xlarge Instances: - InstanceType: c5.xlarge MinCount: 100 MaxCount: 150

将在 Slurm 中定义以下节点

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]

当计算资源的 MinCount == MaxCount 时,所有相应的计算节点都将是静态的,所有实例都将在集群创建/更新时启动并保持运行。例如:

Scheduling: Scheduler: slurm SlurmQueues: - Name: queue1 ComputeResources: - Name: c5xlarge Instances: - InstanceType: c5.xlarge MinCount: 100 MaxCount: 100
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]

集群容量更新

集群容量的更新包括添加或删除队列、计算资源或更改计算资源的 MinCount/MaxCount。从 AWS ParallelCluster 版本 3.9.0 开始,要减小队列的大小,需要在集群更新前停止计算实例集或将 QueueUpdateStrategy 设置为 TERMINATE。在以下情况下,无需停止计算实例集或将 QueueUpdateStrategy 设置为 TERMINATE:

  • 将新队列添加到 Scheduling/SlurmQueues

  • 向队列中添加新的计算资源 Scheduling/SlurmQueues/ComputeResources

  • 增加计算资源的 MaxCount

  • 增加计算资源的 MinCount,并增加同一计算资源的 MaxCount,增加的数量至少相同

注意事项和限制

本节旨在概述在调整集群容量大小时应考虑的任何重要因素、约束或限制。

在更改计算资源的 MinCount 参数时,我们可以区分两种不同的情况,一种是 MaxCountMinCount 相等(仅静态容量),另一种是 MaxCount 大于 MinCount(静态和动态混合容量)。

只有静态节点的容量变化

  • 如果 MinCount == MaxCount,当增加 MinCount(和 MaxCount)时,通过将静态节点数扩展到 MinCount <Queue/Name>-st-<ComputeResource/Name>-<new_MinCount> 的新值来配置集群,并且系统将不断尝试启动 Amazon EC2 实例来满足新的静态容量需求。

  • 如果 MinCount == MaxCount,当 MinCount(和 MaxCount)的数量减少 N 时,通过移除最后 N 个静态节点 <Queue/Name>-st-<ComputeResource/Name>-<old_MinCount - N>...<old_MinCount>] 来配置集群,系统将终止相应的 Amazon EC2 实例。

    • 初始状态 MinCount = MaxCount = 100

    • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
    • 更新 MinCountMaxCount: MinCount = MaxCount = 70 上的 -30

    • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 70 idle queue1-st-c5xlarge-[1-70]

混合节点的容量变化

如果 MinCount < MaxCount,当 MinCount 的数量增加 N 时(假设 MaxCount 保持不变),通过将静态节点数扩展到 MinCount 的新值(old_MinCount + N)来配置集群(<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount + N>),并且系统将不断尝试启动 Amazon EC2 实例来满足新的静态容量需求。此外,为了满足计算资源的 MaxCount 容量,通过删除最后 N 个动态节点来更新集群配置(<Queue/Name>-dy-<ComputeResource/Name>-[<MaxCount - old_MinCount - N>...<MaxCount - old_MinCount>]),系统将终止相应的 Amazon EC2 实例。

  • 初始状态:MinCount = 100; MaxCount = 150

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
  • 将 +30 更新为 MinCount : MinCount = 130 (MaxCount = 150)

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 20 idle~ queue1-dy-c5xlarge-[1-20] queue1* up infinite 130 idle queue1-st-c5xlarge-[1-130]

如果 MinCount < MaxCount,当 MinCountMaxCount 的数量都增加 N 时,通过将静态节点数扩展到 MinCount 的新值(old_MinCount + N)来配置集群(<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount + N>),并且系统将不断尝试启动 Amazon EC2 实例来满足新的静态容量需求。此外,动态节点的数量不会因新的

MaxCount 值。

  • 初始状态:MinCount = 100; MaxCount = 150

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
  • 将 +30 更新为 MinCount : MinCount = 130 (MaxCount = 180)

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 20 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 130 idle queue1-st-c5xlarge-[1-130]

如果 MinCount < MaxCount,当 MinCount 的数量减少 N 时(假设 MaxCount 保持不变),通过移除最后 N 个静态节点 <Queue/Name>-st-<ComputeResource/Name>-[<old_MinCount - N>...<old_MinCount> 来配置集群,系统将终止相应的 Amazon EC2 实例。此外,为了满足计算资源的 MaxCount 容量,通过扩展动态节点数来更新集群配置(MaxCount - new_MinCount: <Queue/Name>-dy-<ComputeResource/Name>-[1..<MazCount - new_MinCount>])。在这种情况下,由于这些是动态节点,因此除非调度器在新节点上有待处理的作业,否则不会启动新的 Amazon EC2 实例。

  • 初始状态:MinCount = 100; MaxCount = 150

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
  • 更新 MinCount : MinCount = 70 (MaxCount = 120) 上的 -30

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 80 idle~ queue1-dy-c5xlarge-[1-80] queue1* up infinite 70 idle queue1-st-c5xlarge-[1-70]

如果 MinCount < MaxCount,当 MinCountMaxCount 的数量都减少 N 时,通过移除最后 N 个静态节点来配置集群(<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount - N>...<oldMinCount>]),系统将终止相应的 Amazon EC2 实例。

此外,动态节点的数量不会因新的 MaxCount 值而发生变化。

  • 初始状态:MinCount = 100; MaxCount = 150

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
  • 更新 MinCount : MinCount = 70 (MaxCount = 120) 上的 -30

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 80 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 70 idle queue1-st-c5xlarge-[1-70]

如果 MinCount < MaxCount,当 MaxCount 的数量减少 N 时(假设 MinCount 保持不变),通过移除最后 N 个动态节点来配置集群(<Queue/Name>-dy-<ComputeResource/Name>-<old_MaxCount - N...<oldMaxCount>]),系统将终止正在运行的相应 Amazon EC2 实例。预计不会对静态节点产生影响。

  • 初始状态:MinCount = 100; MaxCount = 150

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 50 idle~ queue1-dy-c5xlarge-[1-50] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]
  • 更新 MaxCount : MinCount = 100 (MaxCount = 120) 上的 -30

  • $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST queue1* up infinite 20 idle~ queue1-dy-c5xlarge-[1-20] queue1* up infinite 100 idle queue1-st-c5xlarge-[1-100]

对作业的影响

在移除节点和终止 Amazon EC2 实例的所有情况下,在已移除节点上运行的批处理作业将重新排队,除非没有其它节点满足作业要求。在最后一种情况下,作业将以 NODE_FAIL 状态失败,并从队列中消失;如果是这种情况,则需要手动重新提交。

如果您计划执行集群大小调整更新,可以防止作业在计划更新期间将被移除的节点上运行。这可以通过将要移除的节点设置为维护状态来实现。请注意,将节点设置为维护状态不会影响最终已在该节点上运行的作业。

假设在计划的集群大小调整更新中,您将移除节点 qeueu-st-computeresource-[9-10]。您可以使用以下命令创建 Slurm 预留

sudo -i scontrol create reservation ReservationName=maint_for_update user=root starttime=now duration=infinite flags=maint,ignore_jobs nodes=qeueu-st-computeresource-[9-10]

这将在节点 qeueu-st-computeresource-[9-10] 上创建一个名为 maint_for_update 的 Slurm 预留。从创建预留开始,qeueu-st-computeresource-[9-10] 节点上就不能再运行任何作业。请注意,预留不会阻止作业最终在 qeueu-st-computeresource-[9-10] 节点上分配。

集群大小调整更新后,如果 Slurm 预留只设置在调整大小更新期间被移除的节点上,维护预留将自动删除。如果您在集群大小调整更新后仍然存在的节点上创建了 Slurm 预留,我们可能希望在执行大小调整更新后删除节点上的维护预留,方法是使用以下命令

sudo -i scontrol delete ReservationName=maint_for_update

有关 Slurm 预留的更多详情,请在此处查看 SchedMD 官方文档。

容量变更时的集群更新过程

调度器配置更改后,将在集群更新过程中执行以下步骤:

  • 停止 AWS ParallelCluster clustermgtd (supervisorctl stop clustermgtd)

  • 根据 AWS ParallelCluster 配置生成更新的 Slurm 分区配置

  • 重启 slurmctld(通过 Chef 服务配方完成)

  • 检查 slurmctld 状态 (systemctl is-active --quiet slurmctld.service)

  • 重新加载 Slurm 配置 (scontrol reconfigure)

  • 启动 clustermgtd (supervisorctl start clustermgtd)

有关 Slurm 的信息,请参阅 https://slurm.schedmd.com。有关下载,请参阅 https://github.com/SchedMD/slurm/tags。有关源代码,请参阅 https://github.com/SchedMD/slurm

AWS ParallelCluster 版本 支持的 Slurm 版本

3.11.0

23.11.10

3.9.2、3.9.3、3.10.0

23.11.7

3.9.0、3.9.1

23.11.4

3.8.0

23.02.7

3.7.2

23.02.6

3.7.1

23.02.5

3.7.0

23.02.4

3.6.0、3.6.1

23.02.2

3.5.0、3.5.1

22.05.8

3.4.0、3.4.1

22.05.7

3.3.0、3.3.1

22.05.5

3.1.4、3.1.5、3.2.0、3.2.1

21.08.8-2

3.1.2、3.1.3

21.08.6

3.1.1

21.08.5

3.0.0

20.11.8