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

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

Slurm多队列模式指南

在这里你可以学习如何做Amazon ParallelCluster和Slurm管理队列(分区)节点以及如何监控队列和节点状态。

概览

扩展架构基于Slurm的云调度指南和省电插件。有关省电插件的更多信息,请参阅Slurm节能指南. 在架构中,可能为集群提供的资源通常在Slurm配置为云节点。

云节点生命周期

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

  • 中的一个节点POWER_SAVINGstate出现时带有~后缀(例如idle~) 在sinfo. 在此状态下,没有 EC2 实例支持节点。但是Slurm仍然可以将任务分配给节点。

  • 一个节点正在过渡到POWER_UPstate出现时带有#后缀(例如idle#) 在sinfo. 节点会自动转换为POWER_UP状态,何时Slurm将任务分配给一个节点中的一个节点POWER_SAVING状态。

    或者,可以将节点过渡到POWER_UP使用手动状态为scontrol update nodename=nodename state=power_up命令。在这个阶段,ResumeProgram被调用,EC2 实例被启动和配置,节点转换到POWER_UP状态。

  • 当前可供使用的节点出现时不带后缀(例如idle) 在sinfo. 在节点设置完毕并加入群集后,它就可以运行作业了。在此阶段,节点已正确配置并可供使用。

    一般而言,我们建议 EC2 实例的数量与可用节点的数量相同。在大多数情况下,静态节点在创建集群后才可用。

  • 正在过渡到的节点POWER_DOWNstate出现时带有%后缀(例如idle%) 在sinfo. 动态节点自动进入POWER_DOWN之后的状态ScaledownIdletime. 相比之下,在大多数情况下,静态节点不会关闭电源。但是,节点可以放置在POWER_DOWN使用手动状态为scontrol update nodename=nodename state=powering_down命令。在此状态下,与节点关联的实例被终止,并且该节点被设置回POWER_SAVING状态,之后可以使用ScaledownIdletime.

    这些区域有:ScaledownIdletime设置已保存到Slurm配置SuspendTimeout设置。

  • 处于离线状态的节点出现时带有*后缀(例如down*) 在sinfo. 如果出现以下情况,则节点进入离线状态Slurm控制器无法联系节点,或者如果静态节点被禁用并且后备实例被终止。

考虑如下面的内容所示的节点状态sinfo示例。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 4 idle~ efa-dy-efacompute1-[1-4] efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 1 idle% gpu-dy-gpucompute1-1 gpu up infinite 9 idle~ gpu-dy-gpucompute1-[2-10] ondemand up infinite 2 mix# ondemand-dy-ondemandcompute1-[1-2] ondemand up infinite 18 idle~ ondemand-dy-ondemandcompute1-[3-10],ondemand-dy-ondemandcompute2-[1-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 2 idle spot-st-spotcompute2-[1-2]

这些区域有:spot-st-spotcompute2-[1-2]efa-st-efacompute1-1节点已经设置了备用实例,可供使用。这些区域有:ondemand-dy-ondemandcompute1-[1-2]节点在POWER_UP状态,应在几分钟内可用。这些区域有:gpu-dy-gpucompute1-1节点在POWER_DOWN状态,然后它会过渡到POWER_SAVING之后的状态ScaledownIdletime(默认为 10 分钟)。

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

使用可用节点

可用节点由 EC2 实例支持。默认情况下,可以使用节点名称直接 SSH 访问实例(例如ssh efa-st-efacompute1-1)。可以使用以下命令检索实例的私有 IP 地址scontrol show nodes nodename命令并检查NodeAddr字段中返回的子位置类型。

对于不提供的节点,NodeAddr字段不应指向正在运行的 EC2 实例。相反,它应与节点名称相同。

Job 状态

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

如果分配给某项任务的节点包括任务中的任何节点POWER_SAVING状态,作业开始时是CF,或CONFIGURING状态。此时,作业正在等待中的节点POWER_SAVING要过渡到的状态POWER_UP状态并变为可用。

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

默认情况下,所有作业都提交到默认队列(在中称为分区)Slurm)。这由 a 表示*队列名称后面的后缀。您可以使用以下命令选择队列-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-efacompute1-[1-4] efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 10 idle~ gpu-dy-gpucompute1-[1-10] ondemand up infinite 20 idle~ ondemand-dy-ondemandcompute1-[1-10],ondemand-dy-ondemandcompute2-[1-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 2 idle spot-st-spotcompute2-[1-2]

注意spot是默认队列。它通过以下方式指示*后缀。

向默认队列中的一个静态节点提交作业 (spot)。

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

将作业提交到中的一个动态节点EFA队列。

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

向八 (8) 人提交一份工作c5.2xlarge节点和两个 (2)t2.xlarge中的节点ondemand队列。

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

向中的一个 GPU 节点提交作业gpu队列。

$ 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-ondemandcompute1-[1-8],ondemand-dy-ondemandcompute2-[1-2] 13 gpu wrap ubuntu CF 0:05 1 gpu-dy-gpucompute1-1 7 spot wrap ubuntu R 2:48 1 spot-st-spotcompute2-1 8 efa wrap ubuntu R 0:39 1 efa-dy-efacompute1-1

Jobs 7 和 8(在spotefaqueues) 已经在运行 (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-efacompute1-[2-4] efa up infinite 1 mix efa-dy-efacompute1-1 efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 1 mix~ gpu-dy-gpucompute1-1 gpu up infinite 9 idle~ gpu-dy-gpucompute1-[2-10] ondemand up infinite 10 mix# ondemand-dy-ondemandcompute1-[1-8],ondemand-dy-ondemandcompute2-[1-2] ondemand up infinite 10 idle~ ondemand-dy-ondemandcompute1-[9-10],ondemand-dy-ondemandcompute2-[3-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 1 mix spot-st-spotcompute2-1 spot* up infinite 1 idle spot-st-spotcompute2-2

节点状态和功能

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

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

Partition

Amazon ParallelCluster支持以下分区状态。一个Slurm分区是一个队列Amazon ParallelCluster.

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

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

pclust update-compute-fleet

  • 停止计算队列-执行以下命令时,所有分区都转换为INACTIVE状态Amazon ParallelCluster进程将分区保留在INACTIVE状态。

    $ pcluster update-compute-fleet --cluster-name testSlurm \ --region eu-west-1 --status STOP_REQUESTED
  • 启动计算队列-执行以下命令时,所有分区最初转换为UP状态。但是Amazon ParallelCluster进程不会将分区保留在UP状态。你需要手动更改分区状态。所有静态节点将在几分钟后可用。请注意,将分区设置为UP不会为任何动态容量加电。

    $ pcluster update-compute-fleet --cluster-name testSlurm \ --region eu-west-1 --status START_REQUESTED

update-compute-fleet正在运行,你可以通过运行来检查集群的状态pcluster describe-compute-fleet命令并检查Status. 以下列出了几种状态:

  • STOP_REQUESTED:停止计算队列请求已发送到集群。

  • STOPPING: 那个pcluster进程当前正在停止计算队列。

  • STOPPED: 那个pclusterprocess 已完成停止过程,所有分区都在INACTIVE状态,所有计算实例都已终止。

  • START_REQUESTED:启动计算队列请求已发送到集群。

  • STARTING: 那个pcluster进程当前正在启动集群。

  • RUNNING: 那个pclusterprocess 已完成启动过程,所有分区都在UP状态和静态节点将在几分钟后可用。

  • PROTECTED:此状态表示某些分区存在持续的引导故障。受影响的分区处于非活动状态。请调查问题然后运行update-compute-fleet重新启用舰队。

手动控制队列

在某些情况下,您可能需要手动控制节点或队列(在中称为分区)Slurm) 在集群中。您可以通过以下常用过程管理集群中的节点。

  • 为中的动态节点加电POWER_SAVINGstate

    运行scontrol update nodename=nodename state=power_up命令或提交占位符sleep 1job 请求一定数量的节点然后依赖Slurm为所需数量的节点加电。

  • 之前关闭动态节点的电源ScaledownIdletime

    建议您将动态节点设置为DOWNscontrol update nodename=nodename state=down命令。Amazon ParallelCluster自动终止并重置被击落的动态节点。

    一般而言,我们建议您不要将节点设置为POWER_DOWN直接使用scontrol update nodename=nodename state=power_down命令。这是因为Amazon ParallelCluster自动处理断电过程。

  • 禁用队列(分区)或停止特定分区中的所有静态节点

    将特定队列设置为INACTIVEscontrol update partition=queuename state=inactive命令。这样做会终止分区中所有支持节点的实例。

  • 启用队列(分区)

    将特定队列设置为UPscontrol update partition=queuename state=up命令。

扩展行为和调整

以下是常规扩展工作流程示例:

  • 调度器接收到一个需要两个节点的作业。

  • 调度器将两个节点转换为POWER_UP状态和通话ResumeProgram使用节点名称(例如queue1-dy-spotcompute1-[1-2])。

  • ResumeProgram启动两个 EC2 实例并分配的私有 IP 地址和主机名queue1-dy-spotcompute1-[1-2],等待ResumeTimeout(默认时间为重置节点前 30 分钟。

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

  • 作业完成并停止运行。

  • 配置完成后SuspendTime已经过去了(设置为ScaledownIdletime),调度器将实例设置为POWER_SAVING状态。然后调度器设置queue1-dy-spotcompute1-[1-2]POWER_DOWN状态和电话SuspendProgram使用节点名称。

  • SuspendProgram被调用两个节点。节点保留在POWER_DOWN状态,例如,通过剩余idle%对于 aSuspendTimeout(默认时间段为 120 秒(2 分钟))。晚于clustermgtd检测到节点正在关闭电源,它会终止后备实例。然后,它会过渡queue1-dy-spotcompute1-[1-2]进入空闲状态并重置私有 IP 地址和主机名,以便为将future 作业做好开机准备。

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

  • 调度器接收到一个需要两个节点的作业。

  • 调度器将两个云爆发节点转换为POWER_UP状态和电话ResumeProgram使用节点名,(例如queue1-dy-spotcompute1-[1-2])。

  • ResumeProgram仅启动一 (1) 个 EC2 实例并进行配置queue1-dy-spotcompute1-1,使用一 (1) 个实例,queue1-dy-spotcompute1-2,无法启动。

  • queue1-dy-spotcompute1-1没有受到影响,到达后就上线了POWER_UP状态。

  • queue1-dy-spotcompute1-2转换为了POWER_DOWN状态,任务会自动排队,因为Slurm检测到节点故障。

  • queue1-dy-spotcompute1-2之后变为可用SuspendTimeout(默认值为 120 秒(2 分钟))。同时,任务被重新排队并可以在另一个节点上开始运行。

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

有两个定时参数可以根据需要进行调整:

  • ResumeTimeout(默认为 30 分钟)ResumeTimeout控制时间Slurm在将节点转换为关闭状态之前会等待。

    • 扩展可能会有用ResumeTimeout如果你的安装前/安装后过程花费了将近那么长的时间。

    • ResumeTimeout也是最长时间Amazon ParallelCluster如果出现问题,则在替换或重置节点之前等待。如果在启动或设置期间发生任何错误,计算节点会自行终止。Amazon ParallelCluster进程在检测到已终止的实例时替换节点。

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

    • 更短一点SuspendTimeout意味着重置节点的速度更快,而且Slurm可以尝试更频繁地启动实例。

    • 更长一点SuspendTimeout意味着故障节点的重置速度更慢。与此同时,Slurm尝试使用其他节点。如果SuspendTimeout超过了几分钟Slurm尝试循环浏览系统中的所有节点。更长一点SuspendTimeout可能有利于大型系统(超过 1,000 个节点)减轻stressSlurm当它尝试频繁地将失败的作业重新排队时。

    • 注意SuspendTimeout不是指时间Amazon ParallelCluster等待终止节点的后备实例。支持实例POWER_DOWN节点立即终止。终止过程通常在几分钟内完成。但是,在这段时间内,该节点仍在POWER_DOWN状态,并且不再可供调度程序使用。

架构日志

以下列表包含密钥日志。用于亚马逊的日志流名称 CloudWatch 日志的格式为{hostname}.{instance_id}.{logIdentifier},其中LogIdentifier遵循日志名称。

  • 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)

常见问题和调试方法:

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

  • 动态节点:

    • CheckResumeProgram登录看看是否ResumeProgram是用节点调用的。如果不是,请检查slurmctld记录以确定是否Slurm我试着打电话ResumeProgram使用节点。请注意,上的权限不正确ResumeProgram可能会导致它静默失败。

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

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

  • 静态节点:

    • Checkclustermgtd记录以查看是否为该节点启动了实例。如果实例没有启动,则应该有关于实例启动失败原因的明显错误。

    • 如果启动了实例,则引导过程存在一些问题。从中找到相应的私有 IP 和实例 IDclustermgtd登录并查看中特定实例的相应引导日志 CloudWatch 日志。

节点意外更换或终止,节点出现故障

  • 节点意外更换/终止:

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

    • 如果clustermgtd替换或终止了节点,应该有一条消息说明操作的原因。如果原因与调度器有关(例如,节点是DOWN),请查看slurmctldlogs more details 如果原因与 EC2 有关,请使用亚马逊等工具 CloudWatch 或者AmazonEC2 控制台、CLI 或 SDK,用于检查该实例的状态或日志。例如,您可以检查该实例是否有预定事件或 EC2 运行状况检查失败。

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

  • 节点故障:

    • 在大多数情况下,如果节点出现故障,作业会自动排队。在里面看slurmctld记录以查看任务或节点失败的原因,然后从那里评估情况。

更换或终止实例时失败,关闭节点电源时失败

  • 一般而言,clustermgtd处理所有预期的实例终止操作。在里面看clustermgtd记录以查看为什么它无法替换或终止节点。

  • 对于出现故障的动态节点ScaledownIdletime,看看SuspendProgram登录看看是否slurmctld进程使用特定节点作为参数进行了调用。注意SuspendProgram实际上并没有执行任何特定的操作。相反,它只在被调用时才会记录。所有实例终止NodeAddr重置完成时间为clustermgtd.Slurm转换为节点IDLE之后SuspendTimeout.

其他问题:

  • Amazon ParallelCluster不会做出工作分配或扩大规模的决策。它只尝试根据以下方式启动、终止和维护资源Slurm的指示。

    有关任务分配、节点分配和扩展决策的问题,请查看slurmctld记录错误。