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

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

多队列模式教程

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

本教程将引导你使用运行第一个 Hello World 作业多队列模式。Amazon ParallelCluster

先决条件
注意

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

配置集群

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

$ pcluster version

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

此命令返回的正在运行的版本Amazon 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 Amazon Web Services 区域> [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,请参阅 Slurm 文档sbatch中的。

$ 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命令查看节点和队列。(中的队Amazon 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-1spot-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 Amazon Web Services 区域> [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-dy-c5n18xlarge-1节点上存在 EFA。从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多队列模式指南