多队列模式教程 - AWS ParallelCluster

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

多队列模式教程

使用多队列模式运行作业AWS ParallelCluster

本教程将引导你完成你的第一个 Hello WorlAWS ParallelCluster d 任务多队列模式

先决条件
注意

仅AWS ParallelCluster版本 2.9.0 或更高版本支持多队列模式。

配置集群

首先AWS ParallelCluster,运行以下命令验证已正确安装。

$ pcluster version

有关 pcluster version 的更多信息,请参阅 pcluster version

此命令返回的运行版本AWS ParallelCluster。

接下来,运行pcluster configure以生成基本配置文件。按照此命令后面的所有提示进行操作。

$ pcluster configure

有关 pcluster configure 命令的更多信息,请参阅pcluster configure

完成此步骤后,您应能够在下面找到基本配置文件~/.parallelcluster/config。此文件应包含基本集群配置和 VPC 部分。

本教程的下一部分概述了如何修改新创建的配置和启动包含多个队列的集群。

注意

本教程中使用的某些实例不符合免费套餐条件。

在本教程中,使用以下配置。

[global] update_check = true sanity_check = true cluster_template = multi-queue [aws] aws_region_name = <Your AWS 区域> [scaling demo] scaledown_idletime = 5 # optional, defaults to 10 minutes [cluster multi-queue-special] key_name = < Your key name > base_os = alinux2 # optional, defaults to alinux2 scheduler = slurm master_instance_type = c5.xlarge # optional, defaults to t2.micro vpc_settings = <Your VPC section> scaling_settings = demo # optional, defaults to no custom scaling settings queue_settings = efa,gpu [cluster multi-queue] key_name = <Your SSH key name> base_os = alinux2 # optional, defaults to alinux2 scheduler = slurm master_instance_type = c5.xlarge # optional, defaults to t2.micro vpc_settings = <Your VPC section> scaling_settings = demo queue_settings = spot,ondemand [queue spot] compute_resource_settings = spot_i1,spot_i2 compute_type = spot # optional, defaults to ondemand [compute_resource spot_i1] instance_type = c5.xlarge min_count = 0 # optional, defaults to 0 max_count = 10 # optional, defaults to 10 [compute_resource spot_i2] instance_type = t2.micro min_count = 1 initial_count = 2 [queue ondemand] compute_resource_settings = ondemand_i1 disable_hyperthreading = true # optional, defaults to false [compute_resource ondemand_i1] instance_type = c5.2xlarge

创建集群

本节详细介绍了如何创建多队列模式集群。

首先,命名您的集群multi-queue-hello-world,然后根据上一节中定义的multi-queue集群部分创建集群。

$ pcluster create multi-queue-hello-world -t multi-queue

有关 pcluster create 的更多信息,请参阅 pcluster create

创建集群后,将显示以下输出:

Beginning cluster creation for cluster: multi-queue-hello-world Creating stack named: parallelcluster-multi-queue-hello-world Status: parallelcluster-multi-queue-hello-world - CREATE_COMPLETE MasterPublicIP: 3.130.xxx.xx ClusterUser: ec2-user MasterPrivateIP: 172.31.xx.xx

该消息CREATE_COMPLETE表明集群已成功创建。输出还提供头节点的公有和私有 IP 地址。

登录您的头节点

使用您的 SSH 私钥文件登录您的头节点。

$ pcluster ssh multi-queue-hello-world -i ~/path/to/keyfile.pem

有关 pcluster ssh 的更多信息,请参阅 pcluster ssh

登录后,运行sinfo命令以验证您的调度程序队列是否已设置和配置。

有关的更多信息sinfo,请参阅Slurm文档中的 sinfo

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 18 idle~ spot-dy-c5xlarge-[1-10],spot-dy-t2micro-[2-9] spot* up infinite 2 idle spot-dy-t2micro-1,spot-st-t2micro-1

输出显示您的集群中有两个处于该idle状态的t2.micro计算节点可用。

注意
  • spot-st-t2micro-1是一个名字里有名字st的静态节点。此节点始终可用,对应于min_count = 1您的集群配置中的。

  • spot-dy-t2micro-1是名字dy中带有的动态节点。此节点当前可用,因为它对应initial_count - min_count = 1于您的集群配置。在您自定义五分钟后,此节点scaledown_idletime会向下扩展。

其他节点都处于省电状态,如节点状态中的~后缀所示,没有 EC2 实例支持它们。默认队列由队列名称后*面的后缀指定,您的默认任务队列spot也是如此。

在多队列模式下运行作业

接下来,尝试运行一项工作以使其进入睡眠状态。该作业稍后将输出自己的主机名。确保此脚本可以由当前用户运行。

$ cat hellojob.sh #!/bin/bash sleep 30 echo "Hello World from $(hostname)" $ chmod +x hellojob.sh $ ls -l hellojob.sh -rwxrwxr-x 1 ec2-user ec2-user 57 Sep 23 21:57 hellojob.sh

使用sbatch命令提交作业。使用-N 2选项为该任务请求两个节点,并验证任务是否成功提交。有关的更多信息sbatch,请参见 sbatchSlurm 文档中的

$ sbatch -N 2 --wrap "srun hellojob.sh" Submitted batch job 2

您可以使用squeue命令查看队列并查看作业的状态。请注意,由于您未指定特定队列,因此使用默认队列 (spot)。有关的更多信息squeue,请参阅Slurm文档squeue中的。

$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 2 spot wrap ec2-user R 0:10 2 spot-dy-t2micro-1,spot-st-t2micro-1

输出显示此作业目前处于运行状态。请等候 30 秒,以便作业完成,然后再次运行 squeue

$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)

现在队列中的任务已全部完成,请在当前目录slurm-2.out中查找输出文件。

$ cat slurm-2.out Hello World from spot-dy-t2micro-1 Hello World from spot-st-t2micro-1

输出还显示我们的任务在spot-st-t2micro-1spot-st-t2micro-2节点上成功运行。

现在,使用以下命令为特定实例指定约束条件,提交相同的作业。

$ sbatch -N 3 -p spot -C "[c5.xlarge*1&t2.micro*2]" --wrap "srun hellojob.sh" Submitted batch job 3

您将这些参数用于sbatch.

  • -N 3— 请求三个节点

  • -p spot— 将作业提交到队spot列。您也可以通过指定向ondemand队列提交任务-p ondemand

  • -C "[c5.xlarge*1&t2.micro*2]"— 指定此作业的特定节点限制。这要求将一 (1) 个c5.xlarge节点和两 (2)t2.micro 个节点用于此任务。

运行sinfo命令查看节点和队列。(中的队AWS ParallelCluster列称为中的分区Slurm。)

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 1 mix# spot-dy-c5xlarge-1 spot* up infinite 17 idle~ spot-dy-c5xlarge-[2-10],spot-dy-t2micro-[2-9] spot* up infinite 2 alloc spot-dy-t2micro-1,spot-st-t2micro-1

节点正在启动。这由节点状态上的#后缀表示。运行squeue命令查看集群中作业的相关信息。

$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 3 spot wrap ec2-user CF 0:04 3 spot-dy-c5xlarge-1,spot-dy-t2micro-1,spot-st-t2micro-1

您的任务处于CF (CONFIGURING) 状态,正在等待实例扩展并加入集群。

大约三分钟后,节点应可用,任务进入R (RUNNING) 状态。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 17 idle~ spot-dy-c5xlarge-[2-10],spot-dy-t2micro-[2-9] spot* up infinite 1 mix spot-dy-c5xlarge-1 spot* up infinite 2 alloc spot-dy-t2micro-1,spot-st-t2micro-1 $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 3 spot wrap ec2-user R 0:04 3 spot-dy-c5xlarge-1,spot-dy-t2micro-1,spot-st-t2micro-1

作业完成,所有三个节点都处于idle状态。

$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 17 idle~ spot-dy-c5xlarge-[2-10],spot-dy-t2micro-[2-9] spot* up infinite 3 idle spot-dy-c5xlarge-1,spot-dy-t2micro-1,spot-st-t2micro-1

然后,在队列中没有剩余的任务后,您可以在本地目录slurm-3.out中进行检查。

$ cat slurm-3.out Hello World from spot-dy-c5xlarge-1 Hello World from spot-st-t2micro-1 Hello World from spot-dy-t2micro-1

输出还显示作业在相应的节点上成功运行。

您可以观察缩小规模的过程。在您的集群配置中,您指定了 5 分钟的自定义scaledown_idletime值。处于空闲状态五分钟后,您的动态节点spot-dy-c5xlarge-1spot-dy-t2micro-1会自动向下扩展并进入POWER_DOWN模式。请注意,静态节点spot-st-t2micro-1不会向下扩展。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 2 idle% spot-dy-c5xlarge-1,spot-dy-t2micro-1 spot* up infinite 17 idle~ spot-dy-c5xlarge-[2-10],spot-dy-t2micro-[2-9] spot* up infinite 1 idle spot-st-t2micro-1

从上面的代码中可以看出,spot-dy-c5xlarge-1并且spot-dy-t2micro-1处于POWER_DOWN模式中。这由后%缀表示。相应的实例会立即终止,但节点保持POWER_DOWN状态并且在 120 秒(两分钟)内不可用。此后,节点恢复节能状态并可以再次使用。有关更多信息,请参阅Slurm多队列模式指南

这应该是集群的最终状态:

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST ondemand up infinite 10 idle~ ondemand-dy-c52xlarge-[1-10] spot* up infinite 19 idle~ spot-dy-c5xlarge-[1-10],spot-dy-t2micro-[1-9] spot* up infinite 1 idle spot-st-t2micro-1

注销集群后,您可以运行清理pcluster delete。有关pcluster list和的更多信息pcluster delete,请参阅pcluster listpcluster delete

$ pcluster list multi-queue CREATE_COMPLETE 2.11.9 $ pcluster delete multi-queue Deleting: multi-queue ...

使用 EFA 和 GPU 实例在集群上运行作业

本部分教程详细介绍了如何修改配置和启动具有多个队列的集群,该队列包含具有 EFA 网络和 GPU 资源的实例。请注意,本教程中使用的实例是价格较高的实例。

在继续执行本教程中概述的步骤之前,请检查您的账户限制,确保您已获得使用这些实例的授权。

使用以下命令修改配置文件。

[global] update_check = true sanity_check = true cluster_template = multi-queue-special [aws] aws_region_name = <Your AWS 区域> [scaling demo] scaledown_idletime = 5 [cluster multi-queue-special] key_name = <Your SSH key name> base_os = alinux2 # optional, defaults to alinux2 scheduler = slurm master_instance_type = c5.xlarge # optional, defaults to t2.micro vpc_settings = <Your VPC section> scaling_settings = demo queue_settings = efa,gpu [queue gpu] compute_resource_settings = gpu_i1 disable_hyperthreading = true # optional, defaults to false [compute_resource gpu_i1] instance_type = g3.8xlarge [queue efa] compute_resource_settings = efa_i1 enable_efa = true placement_group = DYNAMIC # optional, defaults to no placement group settings [compute_resource efa_i1] instance_type = c5n.18xlarge max_count = 5

创建集群

$ pcluster create multi-queue-special -t multi-queue-special

创建集群后,使用您的私有 SSH 密钥文件登录您的头节点。

$ pcluster ssh multi-queue-special -i ~/path/to/keyfile.pem

这应该是集群的初始状态:

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa* up infinite 5 idle~ efa-dy-c5n18xlarge-[1-5] gpu up infinite 10 idle~ gpu-dy-g38xlarge-[1-10]

本节介绍如何提交一些任务以检查节点是否有 EFA 或 GPU 资源。

首先,编写作业脚本。 efa_job.sh将休眠 30 秒。之后,在lspci命令的输出中查找 EFA。 gpu_job.sh将休眠 30 秒。之后,运行nvidia-smi以显示有关该节点的 GPU 信息。

$ cat efa_job.sh #!/bin/bash sleep 30 lspci | grep "EFA" $ cat gpu_job.sh #!/bin/bash sleep 30 nvidia-smi $ chmod +x efa_job.sh $ chmod +x gpu_job.sh

使用以下方式提交作sbatch业:

$ sbatch -p efa --wrap "srun efa_job.sh" Submitted batch job 2 $ sbatch -p gpu --wrap "srun gpu_job.sh" -G 1 Submitted batch job 3 $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 2 efa wrap ec2-user CF 0:32 1 efa-dy-c5n18xlarge-1 3 gpu wrap ec2-user CF 0:20 1 gpu-dy-g38xlarge-1 $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa* up infinite 1 mix# efa-dy-c5n18xlarge-1 efa* up infinite 4 idle~ efa-dy-c5n18xlarge-[2-5] gpu up infinite 1 mix# gpu-dy-g38xlarge-1 gpu up infinite 9 idle~ gpu-dy-g38xlarge-[2-10]

几分钟后,您应能够看到节点已联机且作业正在运行。

[ec2-user@ip-172-31-15-251 ~]$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa* up infinite 4 idle~ efa-dy-c5n18xlarge-[2-5] efa* up infinite 1 mix efa-dy-c5n18xlarge-1 gpu up infinite 9 idle~ gpu-dy-g38xlarge-[2-10] gpu up infinite 1 mix gpu-dy-g38xlarge-1 [ec2-user@ip-172-31-15-251 ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 gpu wrap ec2-user R 0:06 1 gpu-dy-g38xlarge-1 5 efa wrap ec2-user R 0:01 1 efa-dy-c5n18xlarge-1

作业完成后,查看输出。从slurm-2.out文件中的输出中,可以看到 EFA 存在于efa-dy-c5n18xlarge-1节点上。从slurm-3.out文件中的输出中,您可以看到nvidia-smi输出包含该gpu-dy-g38xlarge-1节点的 GPU 信息。

$ cat slurm-2.out 00:06.0 Ethernet controller: Amazon.com, Inc. Elastic Fabric Adapter (EFA) $ cat slurm-3.out Thu Oct 1 22:19:18 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.51.05 Driver Version: 450.51.05 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla M60 Off | 00000000:00:1D.0 Off | 0 | | N/A 28C P0 38W / 150W | 0MiB / 7618MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 1 Tesla M60 Off | 00000000:00:1E.0 Off | 0 | | N/A 36C P0 37W / 150W | 0MiB / 7618MiB | 98% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+

您可以观察缩小规模的过程。在集群配置中,您之前指定scaledown_idletime了五分钟的自定义。因此,在处于空闲状态五分钟后,您的动态节点spot-dy-c5xlarge-1spot-dy-t2micro-1会自动向下扩展并进入POWER_DOWN模式。最终,这些节点进入省电模式并可以再次使用。

$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa* up infinite 1 idle% efa-dy-c5n18xlarge-1 efa* up infinite 4 idle~ efa-dy-c5n18xlarge-[2-5] gpu up infinite 1 idle% gpu-dy-g38xlarge-1 gpu up infinite 9 idle~ gpu-dy-g38xlarge-[2-10] # After 120 seconds $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa* up infinite 5 idle~ efa-dy-c5n18xlarge-[1-5] gpu up infinite 10 idle~ gpu-dy-g38xlarge-[1-10]

注销集群后,您可以运行清理pcluster delete <cluster name>

$ pcluster list multi-queue-special CREATE_COMPLETE 2.11.9 $ pcluster delete multi-queue-special Deleting: multi-queue-special ...

有关更多信息,请参阅 Slurm多队列模式指南