多队列模式教程 - AWS ParallelCluster

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

多队列模式教程

在具有多队列模式的 AWS ParallelCluster 上运行作业

本教程将引导您完成在 AWS ParallelCluster 上运行第一个 Hello World 作业的过程。

先决条件
注意

仅对 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 地址和私有 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 队列。您也可以通过指定 -p ondemand,将作业提交到 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-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 listpcluster 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-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 多队列模式指南