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

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

Slurm 多队列模式指南

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

以下各节概述了如何使用 Slurm 使用新引入的扩展架构进行集群。

概述

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

云节点生命周期

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

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

  • 正在过渡到 POWER_UP 状态的节点将在 sinfo 中显示 # 后缀(例如 idle#)。

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

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

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

  • 离线的节点将在 sinfo 中显示 * 后缀(例如 down*)。如果出现以下情况,则节点将离线 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 状态,它将在 scaledown_idletime(默认为 120 秒)之后过渡到 POWER_SAVING 状态。

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

使用可用节点

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

作业状态和提交

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

如果为作业分配的节点包括任何处于 POWER_SAVING 状态的节点,则该作业将以 CFCONFIGURING 状态开始。此时,该作业将会等待处于 POWER_SAVING 状态的节点过渡到 POWER_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

ondemand 队列的八 (8) 个 c5.2xlarge 节点和两 (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

节点状态和特征

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

但是, Amazon ParallelCluster 还会替换或终止处于不健康DRAINED状态的节点DOWN和具有不健康后备实例的节点。有关更多信息,请参阅 clustermgtd

分区状态

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

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

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

pcluster 启动和停止

运行pcluster stop时,所有分区都将置于INACTIVE状态,并且 Amazon ParallelCluster 进程会将分区保持在INACTIVE状态。

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

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_idletimeDOWN使用scontrol update nodename=nodename state=down命令将动态节点设置为。 Amazon ParallelCluster 自动终止并重置已关闭的动态节点。通常,我们不建议直接使用 scontrol update nodename=nodename state=power_down 命令将节点设置为 POWER_DOWN。这是因为 Amazon ParallelCluster 会自动处理关闭过程,无需手动干预。因此,我们建议您尽可能将节点设置为 DOWN

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

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

扩展行为和调整

下面是正常扩展工作流程的示例:

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

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

  • ResumeProgram启动两个EC2实例并分配的私有 IP 地址和主机名queue1-dy-c5xlarge-[1-2],等待ResumeTimeout(默认时段为 60 分钟(1 小时)),然后再重置节点。

  • 实例配置完成并加入集群。作业开始在实例上运行。

  • 作业完成。

  • 经过配置的 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 状态并使用节点名称(例如 queue1-dy-c5xlarge-[1-2])调用 ResumeProgram

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

  • queue1-dy-c5xlarge-1 将不受影响,并将在进入 POWER_UP 状态后上线。

  • queue1-dy-c5xlarge-2处于POWER_DOWN状态,任务会自动重新排队,因为 Slurm 检测到节点故障。

  • 经过 SuspendTimeout(默认为 120 秒(2 分钟))之后 queue1-dy-c5xlarge-2 变为可用。在此期间,作业将重新排队,并可以开始在另一个节点上运行。

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

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

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

    • 如果您的安装前/安装后过程几乎需要那么长时间的话,延长此时间可能会很有用。

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

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

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

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

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

新架构的日志

以下列表包含多队列架构的关键日志。与 Amazon 日志一起使用的 CloudWatch 日志流名称的格式为{hostname}.{instance_id}.{logIdentifier},其中 logIdentifier 遵循日志名称。有关更多信息,请参阅 与 Amazon CloudWatch 日志集成

  • 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,然后在 Logs 中查看特定实例的相应引导 CloudWatch 日志。

  • 静态节点:

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

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

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

  • 节点意外替换/终止

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

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

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

  • 节点故障

    • 在大多数情况下,如果节点出现故障,作业会自动重新排队。在 slurmctld 日志中查看作业或节点失败的原因,并在其中分析具体情况。

替换或终止实例时出现故障、关闭节点时出现故障

  • 通常,clustermgtd 会处理所有预期的实例终止操作。在 clustermgtd 日志中查看其无法替换或终止节点的原因。

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

其它问题

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

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