

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# マルチキューモードのチュートリアル
<a name="tutorial-mqm"></a>



## マルチキューモードで AWS ParallelCluster でジョブを実行する
<a name="tutorial-mqm-running-jobs"></a>

このチュートリアルでは、 AWS ParallelCluster を使用して で最初の Hello World ジョブを実行する手順を説明します[マルチキューモード](queue-mode.md)。

**前提条件**
+ AWS ParallelCluster [がインストールされます](install.md)。
+  AWS CLI [がインストールされ、設定されています。](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [EC2 キーペア](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 アドレスも出力されます。

### ヘッドノードにログインする
<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` の詳細については、*「Slurm ドキュメンテーション」*の[「sinfo」](https://slurm.schedmd.com/sinfo.html)を参照してください。

```
$ 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` コンピューティングノードが 2 台、クラスター内で利用可能であることがわかります。

**注記**  
`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) の 5 分後にスケールダウンします。

他のノードは、ノードの状態に `~` サフィックスが表示されてすべて省電力状態になり、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` オプションで 2 つのノードを要求し、ジョブが正常に送信されることを確認します。`sbatch` の詳細については、*「Slum ドキュメンテーション」*の[「sbatch」](https://slurm.schedmd.com/sbatch.html)を参照してください。

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

`squeue` コマンドでは、キューの表示やジョブの状態を確認することができます。なお、特定のキューを指定していないため、デフォルトのキュー (`spot`) が使用されます。`squeue` の詳細については、*「Slurm ドキュメンテーション」*の[「squeue」](https://slurm.schedmd.com/squeue.html)を参照してください。

```
$ 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` — 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) の状態で、インスタンスがスケールアップしてクラスターに参加するのを待っています。

約 3 分後、ノードが利用可能になり、ジョブは `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
```

ジョブが終了すると、3 つのノードはすべて `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_idletime`](scaling-section.md#scaledown-idletime) を 5 分に指定したクラスター構成では アイドル状態で 5 分経過すると、動的ノード `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 秒 (2 分) は使用できません。この時間が経過すると、ノードはパワーセーブ状態で復帰し、再び使用できるようになります。詳細については、「[マルチキューモードの 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) を 5 分に指定しました。その結果、アイドル状態が 5 分経過すると、動的ノードである `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)」を参照してください。