AWS ParallelClusterについてのメモ

AWS ParallelClusterについて調べた時の備忘録です。

環境

ParallelClusterとは

ParallelClusterとは、AWS上にHPC環境を作成するためのソリューション、または環境作成用のCLIツールとなります。

AWS ParallelCluster is an AWS-supported open source cluster management tool that helps you to deploy and manage High Performance Computing (HPC) clusters in the AWS Cloud.

What is AWS ParallelCluster

Blackbeltでの説明スライドです。

f:id:goodbyegangster:20201015152240p:plain

20200408 AWS Black Belt Online Seminar AWS ParallelCluster ではじめるクラウドHPC

HPC環境の作成

ハンズオンやチュートリアル資料を参考に、ParallelClusterを利用してHPC環境を作成してみます。

AWS HPC OVERVIEW

AWS ParallelCluster ハンズオン

ParallelClusterのインストール

ParallelClusterのCLIツールを、CLIを実行したい環境(今回はUbuntu)にインストールします。公式手順のマニュアルを参考に、pip経由でインストールしています。

Install AWS ParallelCluster on Linux

$ python3 -m pip install aws-parallelcluster --upgrade --user
$ pcluster version
2.9.1

ParallelClusterにてコンフィグの作成

ParallelClusterにて、HPC作成用のコンフィグファイルを作成します。このコンフィグファイルの情報を元に、ParalleClusterがCloudFormationテンプレートを生成し、HPC環境を作成してくれます。

ParallelClusterは、CloudFormationテンプレートを生成し、CloudFormation Stackを実行する訳で、そのためのIAM権限が必要とあります。AWS CLIに登録されているDefault ProfileのIAM User情報を参照することで、ParallelClusterはそのIAM権限(IAMユーザー)を取得するようです。それを踏まえて、AWS CLIのDefault Profileに AdministratorAccess IAMポリシーをもったIAM Userを登録しておきます。(参照されるProfileをDefault Profileでなく、指定したProfileを利用できないか調べたのですが、見つかりませんでした。)

以下のコマンドにより、コンフィグ作成処理が開始されます。以降、ターミナル上で選択肢が表示されるため、利用したい設定を選択していきます。

$ pcluster configure --config sample

利用するリージョンを指定します。

Allowed values for AWS Region ID:
1. ap-east-1
2. ap-northeast-1
3. ap-northeast-2
4. ap-south-1
5. ap-southeast-1
6. ap-southeast-2
7. ca-central-1
8. eu-central-1
9. eu-north-1
10. eu-west-1
11. eu-west-2
12. eu-west-3
13. sa-east-1
14. us-east-1
15. us-east-2
16. us-west-1
17. us-west-2
AWS Region ID [us-east-1]: 2

作成されるEC2で利用されるEC2 Key Pairを指定します。

Allowed values for EC2 Key Pair Name:
1. aws-key-tech
2. eks-key-tech
EC2 Key Pair Name [aws-key-tech]: 1

利用するジョブスケジューラーを指定します。選択できるスケジューラーは表示されているものですが、 SGETorque は、今後のUpdateで利用できなくなる発表がされています。

Starting on December 31, 2021, AWS will no longer include SGE and Torque support for all released versions of AWS ParallelCluster. Previous versions of AWS ParallelCluster that support SGE and Torque will still be available for download and use. However, these versions will not be eligible for future updates or troubleshooting support from AWS service and customer support teams. Moreover, future releases of AWS ParallelCluster made before and after December 31, 2021 will not include support for either SGE or Torque.

Schedulers supported by AWS ParallelCluster

今回は Slurm を選択しています。

Allowed values for Scheduler:
1. sge
2. torque
3. slurm
4. awsbatch
Scheduler [slurm]: 3

作成されるEC2で利用されるLinux ディストリビューションを指定します。今回は Amazon Linux2 を指定しています。

Allowed values for Operating System:
1. alinux
2. alinux2
3. centos6
4. centos7
5. ubuntu1604
6. ubuntu1804
Operating System [alinux2]: 2

Clusterで利用されるEC2の数と、Instance Typeを指定します。

Minimum cluster size (instances) [0]: 0
Maximum cluster size (instances) [10]: 5
Master instance type [t2.micro]: t3.micro
Compute instance type [t2.micro]: t3.micro

ClusterのMaster NodeとCompute Nodeを配置するネットワーク情報を指定します。今回は、AWS推奨構成であるMaster NodeをPublic Subnetに配置し、Compute NodeをPrivate Subnetに配置する以下の構成としています。

f:id:goodbyegangster:20201015152517p:plain

Public Subnet + Private Subnet構成

Automate VPC creation? (y/n) [n]: n
Allowed values for VPC ID:
  #  id                     name          number_of_subnets
---  ---------------------  ----------  -------------------
  1  vpc-XXXXXXXXXXXXXXXXX  vpc-aaaa                      9
  2  vpc-XXXXXXXXXXXXXXXXX  vpc-bbbb                      8
VPC ID [vpc-XXXXXXXXXXXXXXXXX]: 2
Automate Subnet creation? (y/n) [y]: n
Allowed values for Master Subnet ID:
  #  id                        name           size  availability_zone
---  ------------------------  -----------  ------  -------------------
  1  subnet-XXXXXXXXXXXXXXXXX  public-a       4096  ap-northeast-1a
  2  subnet-XXXXXXXXXXXXXXXXX  public-c       4096  ap-northeast-1c
  3  subnet-XXXXXXXXXXXXXXXXX  public-d       4096  ap-northeast-1d
  4  subnet-XXXXXXXXXXXXXXXXX  protected-a    4096  ap-northeast-1a
  5  subnet-XXXXXXXXXXXXXXXXX  protected-c    4096  ap-northeast-1c
  6  subnet-XXXXXXXXXXXXXXXXX  protected-d    4096  ap-northeast-1d
  7  subnet-XXXXXXXXXXXXXXXXX  private-a      4096  ap-northeast-1a
  8  subnet-XXXXXXXXXXXXXXXXX  private-c      4096  ap-northeast-1c
Master Subnet ID [subnet-XXXXXXXXXXXXXXXXX]: 1
Allowed values for Compute Subnet ID:
  #  id                        name           size  availability_zone
---  ------------------------  -----------  ------  -------------------
  1  subnet-XXXXXXXXXXXXXXXXX  public-a       4096  ap-northeast-1a
  2  subnet-XXXXXXXXXXXXXXXXX  public-c       4096  ap-northeast-1c
  3  subnet-XXXXXXXXXXXXXXXXX  public-d       4096  ap-northeast-1d
  4  subnet-XXXXXXXXXXXXXXXXX  protected-a    4096  ap-northeast-1a
  5  subnet-XXXXXXXXXXXXXXXXX  protected-c    4096  ap-northeast-1c
  6  subnet-XXXXXXXXXXXXXXXXX  protected-d    4096  ap-northeast-1d
  7  subnet-XXXXXXXXXXXXXXXXX  private-a      4096  ap-northeast-1a
  8  subnet-XXXXXXXXXXXXXXXXX  private-c      4096  ap-northeast-1c
Compute Subnet ID [subnet-XXXXXXXXXXXXXXXXX]: 4

入力が完了すると、コマンドを実行したカレントディレクトリに、指定したコンフィグファイル名(今回の場合は sample )にてファイルが作成されています。

コンフィグファイルの編集

生成されたコンフィグファイルを編集することで、より詳細なCluster設定を可能となります。コンフィグファイルで利用されているパラメーターは、以下の公式サイトに記載されています。

Configuration

以下は、今回作成したコンフィグ内容となります。

[global]
cluster_template = default
update_check = true
sanity_check = true

[aws]
aws_region_name = ap-northeast-1

[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}

[cluster default]
base_os = alinux2
disable_hyperthreading = false            # EC2のHyper Thredingを無効としたい時に指定
# enable_efa = compute                      Elastic Fabric Adapter (EFA) を有効化したい時に指定
key_name = aws-key-tech
master_instance_type = t3.micro
# placement = compute                       指定するとCompute NodeのEC2が、同一Placement Groupに所属します
# placement_group = DYNAMIC                 利用するPlacement Groupを指定
scheduler = slurm
vpc_settings = default
queue_settings = compute

[compute_resource default]
initial_count = 0
instance_type = t3.micro
max_count = 5
min_count = 0

[queue compute]
compute_resource_settings = default
compute_type = spot                       # spotインスタンスを利用したい時に指定
enable_efa = false

[vpc default]
vpc_id = vpc-54244133
master_subnet_id = subnet-d3cdf99a
compute_subnet_id = subnet-0c1d897338ba64f8a

上記コンフィグに記載していないものとして、以下のような設定も可能です。

[cw_log XXXXX]

Node上のログをCloudwatch Logsに連携することができます。連携されるログ情報等は、以下より確認できます。

Integration with Amazon CloudWatch Logs

[dcv xxxxx]

正直このツールの利用イメージが良く分かっていないのですが。。。

作成するHPC環境に NICE DCV(NICE Desktop Cloud Visualization) を構築することができます。NICE DCVとは、以前にAWSが買収したクラウドやデータセンター環境での機器を管理したり、3D グラフィカルツールを提供してくれるもの、らしいです。

NICE DCV is a high-performance remote display protocol that provides customers with a secure way to deliver remote desktops and application streaming from any cloud or data center to any device, over varying network conditions. With NICE DCV and Amazon EC2, customers can run graphics-intensive applications remotely on EC2 instances, and stream the results to simpler client machines, eliminating the need for expensive dedicated workstations. Customers across a broad range of HPC workloads use NICE DCV for their remote visualization requirements.

NICE DCV

Connect to the head node through NICE DCV

[ebs XXXXX]/[efs XXXXX]/[fsx XXXXX]

Cluster内で利用できるStorageを指定できます。

EBSを指定した場合、指定したEBSがMaster Nodeにアタッチされ、Compute NodeからNFSとして利用されます。

EFSを指定した場合、同時作成された/既存のEFSファイルシステムをマウントして利用できます。

FSXを指定した場合、同時作成された/既存のFSx for Lusterファイルシステムをマウントして利用できます。

post_install/post_install_args/pre_install/pre_install_args

EC2作成時に、事前用意したシェルスクリプトをEC2上で実行することができます。

Custom Bootstrap Actions

Clusterの作成

作成したコンフィグを指定して、Clusterを作成します。CloudFormationテンプレートが作成され、必要となるAWSリソースが作成されます。作成には10分くらいかかります。

$ pcluster create --config sample cluster01
Beginning cluster creation for cluster: cluster01
Creating stack named: parallelcluster-cluster01
Status: parallelcluster-cluster01 - CREATE_COMPLETE
MasterPublicIP: 54.XXX.XXX.XXX
ClusterUser: ec2-user
MasterPrivateIP: 172.31.XXX.XXX

作成されているClusterの一覧を表示。コンフィグ単位で管理できます。

$ pcluster list --config sample
cluster01  CREATE_COMPLETE  2.9.1

Clusterのステータスを確認するコマンド。

$ pcluster status --config sample cluster01
Status: CREATE_COMPLETE
MasterServer: RUNNING
MasterPublicIP: 54.XXX.XXX.XXX
ClusterUser: ec2-user
MasterPrivateIP: 172.31.XXX.XXX
ComputeFleetStatus: RUNNING

指定Cluster内で、利用されるInstance情報を確認できます。

$ pcluster instances --config sample cluster01
MasterServer         i-11111111111111111

ジョブの実行

作成したHPC環境にて処理を実行してみます。

実行スクリプトの作成

job.sh という名前でスクリプトを作成します。

job.sh

#!/bin/bash
#
#SBATCH --job-name=sample
#SBATCH --output=out.log
#
#SBATCH --nodes=2
#SBATCH --ntasks=2
#SBATCH --time=00:10:00

srun sleep 60
srun hostname
srun date

SBATCH というコマンドは、Slurmへジョブを投入するためのコマンドとなります。スクリプト内で #SBATCH と記述することで、ジョブ実行時のパラメーターをスクリプト内で指定できるようなります。上記で指定している内容は「2台のNode上で2つのタスク(プロセス)を10分以内に実行する」というものになります。

sbatch

srun というコマンドは、Slurm管理上のクラスタで並列ジョブを実行するためのコマンドです。実際の環境では、このsrunコマンドを利用してMPIプログラムのコードを実行する事になるようです。

srun

ジョブの実行

作成したスクリプトを実行してみます。

HPC環境のMasterServerにSSH接続します。ParallelCluster側でもSSHコマンドへのエイリアスにあたるオプションを用意しているようですが、僕の試した環境では動きませんでした。(config指定してClusterを作成していると動作しないぽい?)HPC作成時に指定したKey Pairが秘密鍵となっているため、通常通りSSHに接続します。

$ ssh ec2-user@XX.XX.XX.XX -i XXXX.pem

作成したスクリプトをMasterServer上にもってきて、ジョブを投入します。

$ sbatch job.sh
Submitted batch job 9

Slurm内のキューを確認すると、ジョブが投入されたことが分かります。Compute Node用SPOTインスタンス起動処理が走るため、実際の実行されるまでには若干のラグがあります。

$ squeue --long
JOBID PARTITION     NAME     USER    STATE       TIME TIME_LIMI  NODES NODELIST(REASON)
    9   compute   sample ec2-user CONFIGUR       0:34     10:00      2 compute-dy-t3micro-[1-2]

squeue

sinfo とは、Slurm側で用意されているCompute Node確認用のコマンドです。新しく2台のNodeが起動されたことが分かります。

$ sinfo --long
PARTITION AVAIL  TIMELIMIT   JOB_SIZE ROOT OVERSUBS     GROUPS  NODES       STATE NODELIST
compute*     up   infinite 1-infinite   no       NO        all      2      mixed# compute-dy-t3micro-[1-2]
compute*     up   infinite 1-infinite   no       NO        all      3       idle~ compute-dy-t3micro-[3-5]

sinfo

ParallelCluster側のコマンド結果からも、Compute NodeにあたるEC2が起動していることを確認できます。

$ pcluster instances --config sample cluster01
MasterServer         i-11111111111111111
ComputeFleet         i-22222222222222222
ComputeFleet         i-33333333333333333

しばらくすると処理が環境します。以下は出力ファイルの結果です。

$ cat out.log
compute-dy-t3micro-1
compute-dy-t3micro-2
Mon Oct 12 07:41:33 UTC 2020
Mon Oct 12 07:41:33 UTC 2020

HPC環境の削除

以下のコマンドにて、作成したHPC環境を削除できます。

$ pcluster delete --config sample cluster01