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

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

多队列模式教程

在上运行你的作业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 地址和私有 IP 地址。

登录你的 head 节点

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

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

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

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

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

$ 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

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

注意
  • 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,请参阅sbatch中的Slurm 文档.

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

您可以使用查看您的队列并检查该作业的状态squeue命令。请注意,因为你没有指定特定的队列,所以默认队列 (spot) 被使用。有关 的更多信息squeue,请参阅squeue中的Slurm文档.

$ 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— 将作业提交给spotqueue. 您也可以将作业提交到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

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

你可以观察缩小过程。在您的集群配置中,您指定了自定义scaledown_idletime5 分钟. 处于空闲状态五分钟后,您的动态节点spot-dy-c5xlarge-1spot-dy-t2micro-1自动缩小并进入POWER_DOWNmode。注意静态节点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_DOWNmode。这通过指示%sufix。相应的实例会立即终止,但节点仍保留在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 listpcluster delete,请参阅pcluster listpcluster delete.

$ pcluster list multi-queue CREATE_COMPLETE 2.11.7 $ 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 秒钟。之后,在输出中查找 EFAlspci命令。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 信息gpu-dy-g38xlarge-1节点。

$ 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_DOWNmode。最终,节点进入省电模式并可以再次使用。

$ 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.7 $ pcluster delete multi-queue-special Deleting: multi-queue-special ...

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