

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

# 多队列模式教程
<a name="tutorial-mqm"></a>



## 在 AWS ParallelCluster 多队列模式下运行作业
<a name="tutorial-mqm-running-jobs"></a>

本教程将引导你完成第一个 Hello World 作业[多队列模式](queue-mode.md)。 AWS ParallelCluster 

**先决条件**
+ AWS ParallelCluster [已安装](install.md)。
+  AWS CLI [已安装并配置。](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ 你有一个 [EC2 key pair](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
+ 您拥有具有运行 [`pcluster`](pcluster.md) CLI 所需的[权限](iam.md#example-parallelcluser-policies)的 IAM 角色。

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

### 配置集群
<a name="tutorial-mqm-configure-cluster"></a>

首先，通过运行以下命令验证安装 AWS ParallelCluster 是否正确。

```
$ pcluster version
```

有关 `pcluster version` 的更多信息，请参阅 [`pcluster version`](pcluster.version.md)。

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

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

```
$ pcluster configure
```

有关 `pcluster configure` 命令的更多信息，请参阅[`pcluster configure`](pcluster.configure.md)。

完成此步骤后，`~/.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
```

### 创建集群
<a name="tutorial-mqm-creating-cluster"></a>

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

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

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

有关 `pcluster create` 的更多信息，请参阅 [`pcluster create`](pluster.create.md)。

创建集群后，将显示以下输出：

```
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 地址。

### 登录到头节点
<a name="tutorial-mqm-log-into-head-node"></a>

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

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

有关 `pcluster ssh` 的更多信息，请参阅 [`pcluster ssh`](pcluster.ssh.md)。

登录后，运行命令 `sinfo` 以验证是否已设置和配置调度器队列。

有关的更多信息`sinfo`，请参阅 [sinfo](https://slurm.schedmd.com/sinfo.html) 中的 *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
```

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

**注意**  
`spot-st-t2micro-1` 的名称中包含 `st`，是静态节点。此节点始终可用，并且对应于集群配置中的 ``min_count` = 1`。
`spot-dy-t2micro-1` 的名称中包含 `dy`，是动态节点。此节点当前可用，因为根据集群配置，它对应于 ``initial_count` - `min_count` = 1`。经过五分钟的自定义 [`scaledown_idletime`](scaling-section.md#scaledown-idletime) 后，此节点将会缩减。

其他节点都处于省电状态，如节点状态的`~`后缀所示，没有 EC2实例支持它们。默认队列由队列名称后面的 `*` 后缀指定，所以您的默认作业队列是 `spot`。

### 在多队列模式下运行作业
<a name="tutorial-mqm-running-job-mqm"></a>

接下来，尝试将作业运行到睡眠模式一段时间。该作业稍后将输出自己的主机名。确保当前用户可以运行此脚本。

```
$ 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` 的更多信息，请参阅[https://slurm.schedmd.com/sbatch.html](https://slurm.schedmd.com/sbatch.html)在 *Slurm 文档*中。

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

您可以使用 `squeue` 命令查看您的队列并检查该作业的状态。请注意，由于您未指定特定队列，因此使用默认队列 (`spot`)。有关 `squeue` 的更多信息，请参阅[https://slurm.schedmd.com/squeue.html](https://slurm.schedmd.com/squeue.html) 中的 *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-1` 和 `spot-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`](scaling-section.md#scaledown-idletime)。处于空闲状态五分钟后，您的动态节点 `spot-dy-c5xlarge-1` 和 `spot-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 多队列模式指南](multiple-queue-mode-slurm-user-guide.md)。

以下应该是集群的最终状态：

```
$ 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 list`](pcluster.list.md) 和 [`pcluster delete`](pcluster.delete.md)。

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

### 在具有 EFA 和 GPU 实例的集群上运行作业
<a name="tutorial-mqm-running-job-efa-gpu"></a>

教程的这一部分详细介绍如何修改配置和启动具有多个队列并包含使用 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`](scaling-section.md#scaledown-idletime)。因此，在处于空闲状态五分钟后，您的动态节点 `spot-dy-c5xlarge-1` 和 `spot-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 多队列模式指南](multiple-queue-mode-slurm-user-guide.md)。