Slurm多队列模式指南 - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Slurm多队列模式指南

Amazon ParallelCluster版本 2.9.0 引入多队列模式和适用于Slurm Workload Manager(Slurm)。

以下部分概述了有关使用Slurm群集与新引入的扩展体系结构。

Overview

新的扩展体系结构基于Slurms云计划指南和节能插件。有关节能插件的更多信息,请参阅Slurm节能指南。在新体系结构中,可能为群集提供的资源通常在Slurm配置为云节点。

云节点生命周期

在整个生命周期中,云节点会进入以下几种(如果不是全部)状态:POWER_SAVINGPOWER_UP(pow_up),ALLOCATED(alloc) 和POWER_DOWN(pow_dn)。在某些情况下,云节点可能会输入OFFLINE状态。下面的列表详细介绍了云节点生命周期中这些状态的几个方面。

  • 中的一个节点POWER_SAVING状态显示为~后缀(例如idle~)sinfo。在此状态下,没有支持该节点的 EC2 实例。然而,Slurm仍然可以将作业分配给节点。

  • 一个节点转换为POWER_UP状态显示为#后缀(例如idle#)sinfo

  • 何时Slurm将作业分配给POWER_SAVING状态时,节点会自动传输到POWER_UP状态。否则,节点可以放置在POWER_UP状态手动使用scontrol update nodename=nodename state=power_up命令。在这个阶段,ResumeProgram,并且 EC2 实例将启动并配置为支持POWER_UP节点。

  • 当前可供使用的节点显示不带任何后缀(例如idle)sinfo。设置该节点并加入群集后,它将可用于运行作业。在此阶段中,节点配置正确,可供使用。作为一般规则,我们建议 EC2 中的实例数与可用节点数相同。在大多数情况下,创建集群后,静态节点始终可用。

  • 一个节点,它正在转换到POWER_DOWN状态显示为%后缀(例如idle%)sinfo。动态节点自动输入POWER_DOWN后的状态scaledown_idletime。相比之下,在大多数情况下,静态节点不会关闭电源。但是,节点可以放置在POWER_DOWN状态手动使用scontrol update nodename=nodename state=powering_down命令。在此状态下,与节点关联的实例将终止,并且节点重置回POWER_SAVING状态以将来使用scaledown_idletime。这些区域有:scaledown-idletime设置保存到Slurm配置为SuspendTimeout设置。

  • 脱机的节点将显示*后缀(例如down*)sinfo。一个节点脱机,如果Slurm控制器无法联系该节点,或者如果静态节点被禁用并且支持实例被终止。

现在考虑下面显示的节点状态sinfo示例。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 4 idle~ efa-dy-c5n18xlarge-[1-4] efa up infinite 1 idle efa-st-c5n18xlarge-1 gpu up infinite 1 idle% gpu-dy-g38xlarge-1 gpu up infinite 9 idle~ gpu-dy-g38xlarge-[2-10] ondemand up infinite 2 mix# ondemand-dy-c52xlarge-[1-2] ondemand up infinite 18 idle~ ondemand-dy-c52xlarge-[3-10],ondemand-dy-t2xlarge-[1-10] spot* up infinite 13 idle~ spot-dy-c5xlarge-[1-10],spot-dy-t2large-[1-3] spot* up infinite 2 idle spot-st-t2large-[1-2]

这些区域有:spot-st-t2large-[1-2]efa-st-c5n18xlarge-1节点已经设置了备份实例,并且可以使用。这些区域有:ondemand-dy-c52xlarge-[1-2]节点位于POWER_UP状态,他们应在几分钟内可用。这些区域有:gpu-dy-g38xlarge-1节点位于POWER_DOWN状态,并且它会过渡到POWER_SAVING后的状态scaledown_idletime(默认为 120 秒)。

所有其他节点都位于POWER_SAVING状态,没有支持它们的 EC2 实例。

使用可用节点

可用节点由 EC2 实例支持。默认情况下,节点名称可用于直接 SSH 进入实例(例如ssh efa-st-c5n18xlarge-1)。实例的私有 IP 地址可以使用scontrol show nodes nodename命令并检查NodeAddr字段。对于不可用的节点,NodeAddr字段不应指向正在运行的 EC2 实例。相反,它应该与节点名称相同。

Job 状态和提交

在大多数情况下,提交的作业会立即分配给系统中的节点,如果分配了所有节点,则将其置于挂起状态。

如果为作业分配的节点包含POWER_SAVING状态时,作业开始时从CF,或者CONFIGURING状态。此时,作业将等待POWER_SAVING状态转换到POWER_UP状态并变为可用。

分配给某个作业的所有节点都可用后,该作业将进入RUNNING(R) 状态。

默认情况下,所有作业都会提交到默认队列(称为Slurm)。这表示为*队列名称后面的后缀。您可以使用-p作业提交选项。

所有节点都配置了以下功能,这些功能可用于作业提交命令:

  • 实例类型(例如c5.xlarge

  • 节点类型(这是dynamic或者static。)

您可以查看特定节点可用的所有功能,方法是使用scontrol show nodes nodename命令并检查AvailableFeatures列表。

另一个考虑因素是工作。首先考虑群集的初始状态,您可以通过运行sinfo命令。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 4 idle~ efa-dy-c5n18xlarge-[1-4] efa up infinite 1 idle efa-st-c5n18xlarge-1 gpu up infinite 10 idle~ gpu-dy-g38xlarge-[1-10] ondemand up infinite 20 idle~ ondemand-dy-c52xlarge-[1-10],ondemand-dy-t2xlarge-[1-10] spot* up infinite 13 idle~ spot-dy-c5xlarge-[1-10],spot-dy-t2large-[1-3] spot* up infinite 2 idle spot-st-t2large-[1-2]

请注意,spot是默认队列。它通过*后缀。

将作业提交到一个静态节点到默认队列(spot)。

$ sbatch --wrap "sleep 300" -N 1 -C static

将作业提交到一个动态节点EFAqueue.

$ sbatch --wrap "sleep 300" -p efa -C dynamic

将工作提交给八 (8)c5.2xlarge节点和两 (2)t2.xlarge节点添加到ondemandqueue.

$ sbatch --wrap "sleep 300" -p ondemand -N 10 -C "[c5.2xlarge*8&t2.xlarge*2]"

将作业提交到一个 GPU 节点gpuqueue.

$ sbatch --wrap "sleep 300" -p gpu -G 1

现在考虑使用squeue命令。

$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 12 ondemand wrap ubuntu CF 0:36 10 ondemand-dy-c52xlarge-[1-8],ondemand-dy-t2xlarge-[1-2] 13 gpu wrap ubuntu CF 0:05 1 gpu-dy-g38xlarge-1 7 spot wrap ubuntu R 2:48 1 spot-st-t2large-1 8 efa wrap ubuntu R 0:39 1 efa-dy-c5n18xlarge-1

作业 7 和 8(在spotefa队列)已运行(R)。作业 12 和 13 仍在配置(CF),可能会等待实例变为可用。

# Nodes states corresponds to state of running jobs $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 3 idle~ efa-dy-c5n18xlarge-[2-4] efa up infinite 1 mix efa-dy-c5n18xlarge-1 efa up infinite 1 idle efa-st-c5n18xlarge-1 gpu up infinite 1 mix~ gpu-dy-g38xlarge-1 gpu up infinite 9 idle~ gpu-dy-g38xlarge-[2-10] ondemand up infinite 10 mix# ondemand-dy-c52xlarge-[1-8],ondemand-dy-t2xlarge-[1-2] ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[9-10],ondemand-dy-t2xlarge-[3-10] spot* up infinite 13 idle~ spot-dy-c5xlarge-[1-10],spot-dy-t2large-[1-3] spot* up infinite 1 mix spot-st-t2large-1 spot* up infinite 1 idle spot-st-t2large-2

节点状态和功能

在大多数情况下,节点状态完全由Amazon ParallelCluster根据本主题前面介绍的云节点生命周期中的特定流程。

然而,Amazon ParallelCluster还会替换或终止DOWNDRAINED状态和具有运行状况不佳的支持实例的节点。有关更多信息,请参阅 clustermgtd

分区状态

Amazon ParallelCluster支持以下分区状态。ASlurm分区是Amazon ParallelCluster。

  • UP:表示分区处于活动状态。这是分区的默认状态。在此状态下,分区中的所有节点都处于活动状态,可供使用。

  • INACTIVE:表示分区处于非活动状态。在此状态下,支持非活动分区节点的所有实例都将终止。不会为非活动分区中的节点启动新实例。

pcluster 启动和停止

何时pcluster stop时,所有分区都会放置在INACTIVE状态和Amazon ParallelCluster进程将分区保留在INACTIVE状态。

何时pcluster start,则所有分区最初放在UP状态。然而,Amazon ParallelCluster进程不会将分区保存在UP状态。您需要手动更改分区状态。所有静态节点在几分钟后可用。请注意,将分区设置为UP不会启动任何动态容量。如果initial_count大于max_count,然后initial_count可能无法满足分区状态更改为UP状态。

何时pcluster startpcluster stop正在运行,则可以通过运行pcluster status命令并检查ComputeFleetStatus。以下列出了可能的状态:

  • STOP_REQUESTEDpcluster stop请求发送到集群。

  • STOPPINGpcluster进程当前正在停止集群。

  • STOPPEDpcluster进程完成了停止过程,所有分区都在INACTIVE状态,并且所有计算实例都将终止。

  • START_REQUESTEDpcluster start请求发送到集群。

  • STARTINGpcluster进程当前正在启动集群

  • RUNNINGpcluster进程完成启动过程,所有分区都在UP状态,并且静态节点将在几分钟后可用。

手动控制队列

在某些情况下,您可能希望手动控制节点或队列(在Slurm)中的一个集群。您可以通过以下常见过程管理群集中的节点。

  • 打开动态节点的电源POWER_SAVING状态:运行scontrol update nodename=nodename state=power_up命令或提交占位符sleep 1作业请求一定数量的节点,并依赖Slurm以打开所需数量的节点电源。

  • 之前关闭动态节点的电源scaledown_idletime:将动态节点设置为DOWN使用scontrol update nodename=nodename state=down命令。Amazon ParallelCluster会自动终止和重置已消失的动态节点。通常,我们建议不要将节点设置为POWER_DOWN直接使用scontrol update nodename=nodename state=power_down命令。这是因为Amazon ParallelCluster会自动处理断电过程。无需手动干预。因此,我们建议您尝试将节点设置为DOWN尽可能.

  • 禁用队列(分区)或停止特定分区中的所有静态节点:将特定队列设置为INACTIVE使用scontrol update partition=queue name state=inactive命令。执行此操作将终止分区中支持节点的所有实例。

  • 启用队列(分区):将特定队列设置为INACTIVE使用scontrol update partition=queue name state=up命令。

扩展行为和调整

下面是普通缩放工作流程示例:

  • 调度程序接收需要两个节点的作业。

  • 调度程序将两个节点转换为POWER_UP状态,并调用ResumeProgram与节点名称(例如queue1-dy-c5xlarge-[1-2])。

  • ResumeProgram启动两个 EC2 实例,并将queue1-dy-c5xlarge-[1-2],等待ResumeTimeout(默认时间段为 60 分钟(1 小时)),然后再重置节点。

  • 实例已配置并加入集群。Job 开始在实例上运行。

  • Job 完成。

  • 在配置SuspendTime已经过去(设置为scaledown_idletime),则实例将放在POWER_SAVING状态。计划程序位数queue1-dy-c5xlarge-[1-2]进入POWER_DOWN状态和呼叫SuspendProgram替换为节点名称。

  • SuspendProgram为两个节点调用。节点保留在POWER_DOWN状态,例如,其余idle%对于SuspendTimeout(默认时间段为 120 秒(2 分钟))。晚于clustermgtd检测到节点正在关闭电源,则会终止备用实例。然后,它配置queue1-dy-c5xlarge-[1-2]进入空闲状态,并重置私有 IP 地址和主机名,以便它们可以重新启动以后的作业。

现在,如果出现问题,并且由于某种原因无法启动特定节点的实例,则会发生以下情况。

  • 调度程序接收需要两个节点的作业。

  • 调度程序将两个云突发节点放入POWER_UP状态和呼叫ResumeProgram与节点名(例如queue1-dy-c5xlarge-[1-2])。

  • ResumeProgram仅启动一 (1) 个 EC2 实例并配置queue1-dy-c5xlarge-1,但未能为queue1-dy-c5xlarge-2

  • queue1-dy-c5xlarge-1将不会受到影响,并在达到POWER_UP状态。

  • queue1-dy-c5xlarge-2被放置在POWER_DOWN状态,并且该作业会自动被请求,因为Slurm将检测到节点故障。

  • queue1-dy-c5xlarge-2变为可用SuspendTimeout(默认值为 120 秒(2 分钟))。与此同时,该作业被请求,并可以在另一个节点上开始运行。

  • 上述过程将重复执行,直到作业可以在可用节点上运行,而不会发生故障。

有两个时序参数可根据需要进行调整。

  • ResumeTimeout(默认值为 60 分钟(1 小时)):ResumeTimeout控制时间Slurm在将节点置于关闭状态之前等待。

    • 如果您的安装前/安装后过程需要几乎这么长时间,则扩展此操作可能会很有用。

    • 这也是Amazon ParallelCluster在替换或重置节点之前等待,如果出现问题。如果在启动或安装过程中发生任何错误,计算节点会自动终止。下一步:Amazon ParallelCluster进程也会在看到实例终止时替换节点。

  • SuspendTimeout(默认值为 120 秒(2 分钟)):SuspendTimeout控制节点重新放置到系统中并准备再次使用的速度。

    • 一个较短的SuspendTimeout将意味着节点将更快地重置,并且Slurm能够尝试更频繁地启动实例。

    • 更长的时间SuspendTimeout会使失败的节点重置更慢。与此同时,Slurm轮胎使用其他节点。如果SuspendTimeout超过几分钟,Slurm尝试循环遍历系统中的所有节点。更长的时间SuspendTimeout可能有利于大型系统(超过 1,000 个节点)减少压力Slurm通过频繁重新排队失败的作业。

    • 请注意,SuspendTimeout不指的是时间Amazon ParallelCluster等待终止节点的支持实例。备份的实例power down节点将立即终止。终止过程通常在几分钟内完成。但是,在此期间,节点仍处于关闭电源状态,不可在调度程序中使用。

新体系结构的日志

以下内容包含多队列体系结构的密钥日志。与 Amazon CloudWatch Logs 一起使用的日志流名称的格式为{hostname}.{instance_id}.{logIdentifier},其中,logIdentifier跟随日志名称。有关更多信息,请参阅 与 Amazon CloudWatch Logs 集成

  • ResumeProgram:

    /var/log/parallelcluster/slurm_resume.log (slurm_resume)

  • SuspendProgram:

    /var/log/parallelcluster/slurm_suspend.log (slurm_suspend)

  • clustermgtd:

    /var/log/parallelcluster/clustermgtd.log (clustermgtd)

  • computemgtd:

    /var/log/parallelcluster/computemgtd.log (computemgtd)

  • slurmctld:

    /var/log/slurmctld.log (slurmctld)

  • slurmd:

    /var/log/slurmd.log (slurmd)

常见问题以及如何调试:

无法启动、启动或加入群集的节点:

  • 动态节点:

    • 检查ResumeProgram日志以查看是否ResumeProgram曾经与节点一起调用。如果没有,请检查slurmctld日志以确定Slurm曾经试图调用ResumeProgram与节点一起。请注意,不正确的权限ResumeProgram可能会导致它无声失败。

    • 如果ResumeProgram,请检查是否为节点启动了实例。如果无法启动实例,则应有明确的错误消息,说明实例启动失败的原因。

    • 如果启动了实例,则在引导过程中可能出现了一些问题。查找相应的私有 IP 地址和实例 ID,请从ResumeProgram日志,并查看 CloudWatch 日志中特定实例的相应引导日志。

  • 静态节点:

    • 检查clustermgtd日志以查看是否为节点启动了实例。如果没有,那么实例启动失败的原因应该有明显的错误。

    • 如果启动了实例,则在引导过程中会出现一些问题。查找相应的私有 IP 和实例 ID,请从clustermgtd日志,并查看 CloudWatch 日志中特定实例的相应引导日志。

节点意外替换或终止,节点故障

  • 意外更换/终止的节点

    • 在大多数情况下,clustermgtd处理所有节点维护操作。检查是否clustermgtd替换或终止节点,请选中clustermgtd日志。

    • 如果clustermgtd替换或终止节点,则应显示一条消息,指示操作的原因。如果原因与调度程序相关(例如,节点DOWN),请检入slurmctld日志以获取更多详细信息。如果原因与 EC2 相关,使用工具检查该实例的状态或日志。例如,您可以检查实例是否有计划事件或 EC2 运行状况检查失败。

    • 如果clustermgtd没有终止节点,请检查computemgtd终止节点,或者 EC2 终止实例以回收竞价型实例。

  • 节点故障

    • 在大多数情况下,如果节点出现故障,将自动重新申请作业。查看slurmctld日志,查看作业或节点失败的原因,并从那里分析情况。

替换或终止实例时失败,关闭节点电源时出现故障

  • 一般来说,clustermgtd处理所有预期的实例终止操作。查看clustermgtd日志,查看它无法替换或终止节点的原因。

  • 对于动态节点失败scaledown_idletime,请查看SuspendProgram日志以查看程序是否通过slurmctld以特定节点作为参数。注意SuspendProgram实际上没有执行任何特定的操作。相反,它只在调用时记录。所有实例终止和NodeAddr重置完成clustermgtd。Slurm将节点放入IDLEAFTERSuspendTimeout

其他问题

  • Amazon ParallelCluster不会做出作业分配或扩展决策。它简单地尝试启动,终止和维护资源根据Slurm的说明。

    有关作业分配、节点分配和扩展决策的问题,请参阅slurmctld日志中查找错误。