【AWS】ParallelClusterを使ってみよう(1)
この記事は「Megazone Japan Advent Calendar 2024」1日目の記事です。
ParallelClusterはオープンソースのクラスタ管理ツールです。SlurmやAWS Batchなどのジョブスケジューラを利用して、複数の計算ノードによる処理を行うクラスタを簡単に作成することができます。
本記事ではParallelClusterのメリットと利用方法を紹介します。
目次
- ParallelClusterとは
- ParallelClusterの良いところ
- とりあえず使ってみる
- 注意
- pipのインストール
- Python仮想環境の作成
- ParallelClusterのインストール
- Node.jsのインストール
- AWS認証情報のセット
- ParallelCluster用VPCとconfig作成
- クラスタの作成
- ヘッドノードへのログイン
- ジョブの実行
- クラスタの削除
- ParallelCluster用VPCの削除
- さいごに
- 参考URL
ParallelClusterとは
ParallelClusterはオープンソースのクラスタ管理ツールです。クラスタを管理するPCやサーバにセットアップすることで、AWS環境にクラスタを作成したり、削除したりすることができます。
いくつかのAWSサービスと連携することもできるので、より高機能なクラスタを作成することができます。
ParallelClusterの良いところ
ParallelClusterの良いところをいくつか挙げてみます。
[1] AWSやITインフラの知識があまり必要ない
AWSの基本的な理解、そしてParallelClusterのConfigの内容が理解できればクラスタの作成や利用に問題ありません。組織で複数人が利用するという場合はクラスタの管理を行う管理者を用意し、他の利用者は計算に利用するだけということも多いと思います。
クラスタの利用者は煩わしいインフラ管理から解放され、自身の計算や研究に集中することができます。
[2] クラスタを作って壊してが簡単にできる
1つのクラスタを複数人で利用することもできますが、用途ごとにクラスタを作成することも可能です。利用者ごとにOSや性能の異なるクラスタを作成し、計算が終わったらそのクラスタを削除するということも簡単にできます。
[3] AWSサービスとの連携ができる
FSx for Lustreとの連携で高性能なLustreファイルシステムを作成/マウントする、ログをCloudWatch Logsに保存する、ジョブを実行している最中だけ計算ノードを起動するなど、AWSサービスとの連携が可能です。
とりあえず使ってみる
今回は以下のスペックのEC2インスタンスにParallelClusterをセットアップしてクラスタの作成を行います。
Region | ap-northeast-1 |
OS | Amazon Linux 2023 |
Instance Type | t3.micro |
Storage | EBS 30GB(gp3) |
内容はAWSドキュメントおよびGitHubのQuick Startに沿ったものとなります。
注意
pipのインストール
Amazon Linux 2023はpipがインストールされていないため、以下のコマンドを実行してインストールします。
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py
$ pip --version
---------------------------------------------------------
pip 24.3.1 from /home/ec2-user/.local/lib/python3.9/site-packages/pip (python 3.9)
---------------------------------------------------------
Python仮想環境の作成
virtualenvのインストール
$ python3 -m pip install --upgrade pip
$ python3 -m pip install --user --upgrade virtualenv
仮想環境の作成
$ python3 -m virtualenv ~/apc-ve
仮想環境をアクティブ化
$ source ~/apc-ve/bin/activate
ParallelClusterのインストール
(apc-ve) $ pip3 install aws-parallelcluster
(apc-ve) $ pcluster version
---------------------------------------------------------
{
"version": "3.11.1"
}
---------------------------------------------------------
Node.jsのインストール
(apc-ve) $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
(apc-ve) $ chmod ug+x ~/.nvm/nvm.sh
(apc-ve) $ source ~/.nvm/nvm.sh
(apc-ve) $ nvm install --lts
(apc-ve) $ node --version
---------------------------------------------------------
v22.11.0
---------------------------------------------------------
AWS認証情報のセット
$ aws configure
---------------------------------------------------------
AWS Access Key ID [None]: {アクセスキーを入力}
AWS Secret Access Key [None]: {シークレットアクセスキーを入力}
Default region name [None]: ap-northeast-1
Default output format [None]: {入力せずEnterキーを押す}
---------------------------------------------------------
今回はAdministratorAccessの権限を持つIAM Userのアクセスキーを利用しています。権限を絞りたい場合は「AWS ParallelCluster pcluster ユーザーポリシーの例」をご参考下さい。
ParallelCluster用VPCとconfig作成
クラスタ用のconfigを作成します。途中でVPCの自動作成も行います。
config作成コマンドの実行
(apc-ve)$ mkdir ~/pcluster-config
(apc-ve)$ pcluster configure --config ~/pcluster-config/cluster-config-01.yaml
リージョンの選択
AWS Region ID [ap-northeast-1]:ap-northeast-1
クラスタを作成するリージョンを選択します。今回は東京リージョン(ap-northeast-1)を選択します。
キーペアの選択
1. keypair-1
2. keypair-2
EC2 Key Pair Name [keypair-1]:{ノードに利用するキーペアを選択}
既存のキーペアがリストアップされるのでノード(EC2インスタンス)に利用するキーペアを選択します。キーペアの秘密鍵はヘッドノードや計算ノードへログインする際に必要となります。
スケジューラの選択
Allowed values for Scheduler:
1. slurm
2. awsbatch
Scheduler [slurm]: slurm
クラスタで利用するジョブスケジューラを選択します。今回はslurmを選択します。
OSの選択
Allowed values for Operating System:
1. alinux2
2. alinux2023
3. ubuntu2004
4. ubuntu2204
5. rhel8
6. rocky8
7. rhel9
8. rocky9
Operating System [alinux2]: alinux2023
クラスタのノード(EC2インスタンス)に利用するOSを選択します。今回はalinux2023(Amazon Linux 2023)を選択します。
Head Nodeのインスタンスタイプの選択
Head node instance type [t2.micro]: t3.micro
Head Nodeに利用するEC2インスタンスタイプを入力します。今回はt3.microを入力します。
Queueの構成の選択
Number of queues [1]: 1
Name of queue 1 [queue1]: queue1
Number of compute resources for queue1 [1]: 1
Compute instance type for compute resource 1 in queue1 [t2.micro]: t3.micro
Maximum instance count [10]: 5
今回はQueueを1つ、Queue内の計算リソースも1つにします。計算ノードのインスタンスタイプはt3.micro、計算ノードの最大起動数は5にします。
VPCの自動作成
Automate VPC creation? (y/n) [n]: y
ここでyを選ぶとParallelCluster用のVPCを自動作成します。既存のVPC内にParallelClusterのクラスタを作成する場合はnを選びます。
AZの選択
Allowed values for Availability Zone:
1. ap-northeast-1a
2. ap-northeast-1c
3. ap-northeast-1d
Availability Zone [ap-northeast-1a]: ap-northeast-1a
クラスタを作成するAZを選択します。選択したAZにサブネットが作成されます。
Head NodeとCompute Nodeの構成を選択
Allowed values for Network Configuration:
1. Head node in a public subnet and compute fleet in a private subnet
2. Head node and compute fleet in the same public subnet
Network Configuration [Head node in a public subnet and compute fleet in a private subnet]: Head node in a public subnet and compute fleet in a private subnet
1は「ヘッドノードをパブリックサブネット、計算ノードをプライベートサブネット」という構成。2は「ヘッドノードと計算ノードの両方ともパブリックサブネット」という構成になります。
今回は1の構成を選択します。
ここまでの選択/入力が終わるとVPCのセットアップが始まります。VPCと共にサブネットやルートテーブルの設定も行われます。計算ノードをプライベートサブネットに設置する構成の場合はNAT Gatewayが作成されるため、クラスタを作成しなくとも費用が発生する点に注意して下さい。
VPCのセットアップはCloudFormationで行われます。進捗はコマンドライン上に表示されますが、AWSマネジメントコンソールのCloudFormationページのスタックステータスで確認することもできます。
クラスタconfigファイルの確認
(apc-ve) $ less ~/pcluster-config/cluster-config-01.yaml
=================================================================
Region: ap-northeast-1
Image:
Os: alinux2023
HeadNode:
InstanceType: t3.micro
Networking:
SubnetId: subnet-091d392xxxxxxxxxx(パブリックサブネット)
Ssh:
KeyName: keypair-1 (ノードに利用するキーペア)
Scheduling:
Scheduler: slurm
SlurmQueues:
- Name: queue1
ComputeResources:
- Name: t3micro
Instances:
- InstanceType: t3.micro
MinCount: 0
MaxCount: 5
Networking:
SubnetIds:
- subnet-0afcfb9xxxxxxxxxx(プライベートサブネット)
=================================================================
クラスタの作成
(apc-ve)$ pcluster create-cluster --cluster-name cluster01 --cluster-configuration ~/pcluster-config/cluster-config-01.yaml
先ほど作成したconfigファイルを基に「cluster01」という名前のクラスタを作成します。
クラスタのステータス確認
(apc-ve)$ pcluster describe-cluster --cluster-name cluster01 |grep "cloudFormationStackStatus"
「cloudFormationStackStatus」が「CREATE_IN_PROGRESS」の場合はまだ作成進行中です。「CREATE_COMPLETE」となっていればクラスタの作成は完了しています。
クラスタ作成完了時間はクラスタと共に作成されるリソースにより変わりますが、シンプルな構成で10分程度、FSx for Lustreなどが含まれる場合は20分程度かかります。
クラスタの作成はCloudFormationで行われているので、AWSマネジメントコンソールのCloudFormationのページで進捗を確認することもできます。
ヘッドノードへのログイン
ParallelCluster実行端末からクラスタのヘッドノードへSSHログインします。
秘密鍵の保存
キーペアの秘密鍵をParallelCluster実行端末に保存します。
(apc-ve)$ vi ~/.ssh/private-key.pem
***** キーペアの秘密鍵の文字列を貼り付ける *****
秘密鍵のパーミッションを変更します。
(apc-ve)$ chmod 600 ~/.ssh/private-key.pem
ヘッドノードへSSH接続
(apc-ve)$ pcluster ssh --cluster-name cluster01 -i ~/.ssh/private-key.pem
ジョブの実行
Slurmを利用してジョブを投入、実行します。これらはヘッドノード上で行います。
テストスクリプトの作成
$ vi sleep.sh
================================
#!/bin/bash
echo "sleeping..."
sleep 60
echo "done!"
================================
ジョブの投入
$ sbatch sleep.sh
---------------------------------------------------------
Submitted batch job 1
---------------------------------------------------------
$ squeue
---------------------------------------------------------
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
1 queue1 sleep.sh ec2-user CF 0:05 1 queue1-dy-t3micro-1
---------------------------------------------------------
squeueコマンドでジョブを実行する計算ノードを確認することができます。今回はノード数の指定を行っていないため、計算ノード 1台で実行します。
ジョブ実行中
AWSマネジメントコンソールのEC2インスタンス一覧を見ると計算ノード用EC2インスタンスが1台作成開始されています。このEC2インスタンスが起動するとジョブが実行されます。
ジョブの完了
$ cat slurm-1.out
---------------------------------------------------------
sleeping...
done!
---------------------------------------------------------
ジョブが完了するとカレントディレクトリにslurm-1.outという出力ファイルが作成されます。ファイル名の数字はジョブIDによって変わります。
計算ノードの終了
ジョブが完了して一定時間経過すると計算ノードは自動的に終了します。クラスタのconfigファイルでパラメータを変更すると「計算ノードを常に1台起動、ジョブ実行時に最大5台起動」という運用も可能です。
クラスタの削除
ヘッドノードからログアウトし、ParallelCluster実行端末でクラスタ削除コマンドを実行します。
(apc-ve)$ pcluster delete-cluster --region ap-northeast-1 --cluster-name cluster01
クラスタのステータス確認
(apc-ve)$ pcluster describe-cluster --cluster-name cluster01 |grep "cloudFormationStackStatus"
「cloudFormationStackStatus」が「DELETE_IN_PROGRESS」の場合はクラスタ削除中です。クラスタ削除完了していた場合は何も出力されません。
ParallelCluster用VPCの削除
ParallelClusterのconfig作成時にVPCと関連リソースも自動作成しました。このVPCはCloudFormationによって作成されているので、CloudFormationスタックを削除、その後VPCを削除します。
スタックの確認
(apc-ve)$ aws --region ap-northeast-1 cloudformation list-stacks --stack-status-filter "CREATE_COMPLETE" --query "StackSummaries[].StackName" |grep -e "parallelclusternetworking-"
---------------------------------------------------------
"parallelclusternetworking-pubpriv-2024xxxxxxxxxx",
---------------------------------------------------------
スタックの削除
(apc-ve)$ aws --region ap-northeast-1 cloudformation delete-stack --stack-name parallelclusternetworking-pubpriv-2024xxxxxxxxxx
VPCの削除
VPC用のCloudFormationスタック削除後にVPCを削除します。
さいごに
今回はチュートリアルに沿ったParallelClusterの基本的な利用方法を紹介しました。次回からはオプションやSlurmアカウンティングなど応用についての記事を書く予定です。
ご覧いただきありがとうございました。
参考URL
Discussion