Slurm多队列模式指南 - AWS ParallelCluster

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

Slurm多队列模式指南

AWS ParallelCluster版本 2.9.0 引入了多队列模式和Slurm Workload Manager (Slurm) 的新扩展架构。

以下部分概述了如何使用具有新引入的扩展架构的Slurm集群。

概览

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

云节点生命周期

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

  • 处于某种POWER_SAVING状态的节点将以~后缀(例如idle~)显示在sinfo。在此状态下,没有 EC2 实例支持该节点。但是,仍然Slurm可以向节点分配任务。

  • 过渡到POWER_UP状态的节点将出现,其#后缀为(例如idle#sinfo

  • 当向POWER_SAVING处于某个状态的节点Slurm分配任务时,该节点会自动转移到某个POWER_UP状态。否则,可以使用scontrol update nodename=nodename state=power_up命令手动将节点置于该POWER_UP状态。在此阶段,将调ResumeProgram用,然后启动 EC2 实例并将其配置为支持POWER_UP节点。

  • 当前可供使用的节点中出现没有任何后缀(例如idlesinfo。设置好节点并加入集群后,它就可以运行任务了。在此阶段,节点已正确配置并可以使用。一般而言,我们建议 EC2 中的实例数量与可用节点的数量相同。在大多数情况下,静态节点在创建集群后始终可用。

  • 将出现一个正在过渡到POWER_DOWN状态的节点,其%后缀为(例如idle%sinfo。动态节点在之后自动进入POWER_DOWN状态scaledown_idletime。相比之下,在大多数情况下,静态节点不会关闭电源。但是,可以使用scontrol update nodename=nodename state=powering_down命令手动将节点置于该POWER_DOWN状态。在此状态下,与节点关联的实例被终止,节点将重置回该POWER_SAVING状态以备future 使用scaledown_idletime。该scaledown-idletime设置作为SuspendTimeout设置保存到Slurm配置中。

  • 将显示一个脱机节点,其*后缀为(例如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)。可以使用scontrol show nodes nodename命令并检查NodeAddr字段来检索实例的私有 IP 地址。对于不可用的节点,该NodeAddr字段不应指向正在运行的 EC2 实例。相反,它应与节点名称相同。

Job 状态和提交

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

如果为任务分配的节点包括任何处于某个POWER_SAVING状态的节点,则该作业以CF、或CONFIGURING状态开头。此时,作业会等待处于状态的节点过渡到POWER_SAVINGPOWER_UP状态并变为可用。

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

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

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

  • 实例类型(例如c5.xlarge

  • 节点类型(这是dynamicstatic。)

您可以使用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

EFA队列中的一个动态节点提交任务。

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

向八 (8) 个c5.2xlarge节点提交任务,向ondemand队列提交两 (2) 个t2.xlarge节点。

$ 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-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

节点状态和功能

在大多数情况下,节点状态完全由AWS ParallelCluster本主题前面所述的云节点生命周期中的特定过程进行管理。

但是,AWS ParallelCluster也可以替换或终止状态不佳的节点DOWN以及DRAINED后备实例运行状况不佳的节点。有关更多信息,请参阅clustermgtd

分区状态

AWS ParallelCluster支持以下分区状态。Slurm分区就是队列AWS ParallelCluster。

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

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

pcluster 启动和停止

运行pcluster stop时,所有分区都处于INACTIVE状态,AWS ParallelCluster进程将分区保持INACTIVE状态。

运行pcluster start时,所有分区最初都处于该UP状态。但是,AWS ParallelCluster进程不会使分区保持UP状态。您需要手动更改分区状态。所有静态节点将在几分钟后变得可用。请注意,将分区设置为UP不会增加任何动态容量。如果大initial_countmax_count,则当分区状态更改为状态时initial_count可能无法满足。UP

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

  • STOP_REQUESTEDpcluster stop请求已发送到集群。

  • STOPPING:该pcluster进程当前正在停止集群。

  • STOPPED:该pcluster进程完成了停止过程,所有分区都处于INACTIVE状态,所有计算实例都已终止。

  • START_REQUESTEDpcluster start请求已发送到集群。

  • STARTING:该pcluster进程当前正在启动集群

  • RUNNING:该pcluster过程完成了启动过程,所有分区都处于UP状态,静态节点将在几分钟后可用。

手动控制队列

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

  • POWER_SAVING状态下启动动态节点:运行scontrol update nodename=nodename state=power_up命令或提交占位sleep 1任务,请求一定数量的节点,然后依靠它Slurm来启动所需数量的节点。

  • 之前关闭动态节点的电源scaledown_idletimeDOWN使用scontrol update nodename=nodename state=down命令将动态节点设置为。 AWS ParallelCluster自动终止并重置已关闭的动态节点。通常,我们不建议使用scontrol update nodename=nodename state=power_down命令将节点设置为POWER_DOWN直接使用。这是因为AWS 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 实例并分配的私有 IP 地址和主机名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状态,例如,通过保持 aSuspendTimeout(默认时间为 120 秒(2 分钟))。idle%clustermgtd检测到节点正在关闭电源后,它会终止后备实例。然后,它将配置queue1-dy-c5xlarge-[1-2]为空闲状态并重置私有 IP 地址和主机名,这样它们就可以重新启动以备future 任务使用。

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

  • 调度器收到的任务需要两个节点。

  • 调度器将两个云突发节点置于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等待时间。

    • 如果你的安装前/安装后过程需要差不多那么长时间,那么扩展这个范围可能会很有用。

    • 这也是出现问题时AWS ParallelCluster在替换或重置节点之前等待的最长时间。如果在启动或设置期间发生任何错误,计算节点会自行终止。接下来,当AWS ParallelCluster进程看到该实例已终止时,它还会替换该节点。

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

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

    • 时间越长SuspendTimeout会使故障节点重置的速度越慢。同时,尽Slurm量使用其他节点。如果超过几分钟,SuspendTimeout则Slurm尝试循环遍历系统中的所有节点。对于大型系统(超过 1,000 个节点)来说,更长的时间SuspendTimeout可能有利于Slurm通过经常将失败的作业重新排队来减轻stress。

    • 请注意,SuspendTimeout这不是指AWS ParallelCluster等待终止节点的后备实例的时间。power down节点的后备实例将立即终止。终止过程通常在几分钟内完成。但是,在此期间,该节点仍处于断电状态,无法在调度程序中使用。

新架构的日志

以下列表包含多队列架构的密钥日志。与 Amazon Logs 一起使用的CloudWatch日志流名称的格式为{hostname}.{instance_id}.{logIdentifier},其中 LogIdentifier 遵循日志名称。有关更多信息,请参阅与 AmazonCloudWatch 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用,请检查是否为该节点启动了实例。如果无法启动实例,则应显示明确的错误消息,说明实例无法启动的原因。

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

  • 静态节点:

    • 检查日clustermgtd志,查看是否为该节点启动了实例。如果不是,则应该有关于实例无法启动的原因的明显错误。

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

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

  • 节点意外更换/终止

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

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

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

  • 节点失败了

    • 在大多数情况下,如果节点出现故障,作业会自动重新排队。查看slurmctld日志以了解任务或节点失败的原因,然后从那里分析情况。

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

  • 通常,会clustermgtd处理所有预期的实例终止操作。查看clustermgtd日志,看看为什么它未能替换或终止节点。

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

其他问题

  • AWS ParallelCluster不做出工作分配或扩大规模的决定。它只是尝试根据指示启动、终止和维护资源。Slurm

    有关任务分配、节点分配和扩展决策的问题,请查看slurmctld日志中是否存在错误。