I4i インスタンスを AWS ParallelCluster で動かしてみた
第2世代の AWS Nitro SSDを搭載した I4i インスタンスタイプが登場しました。高速・大容量のローカル AWS Nitro SSD ストレージ搭載するインスタンスタイプを AWS ParallelCluster で利用可能なのか動作検証しました。
ローカルストレージはインスタンスストアと呼ばれる非永続的なストレージです。
確認結果
- AWS ParallelCluster 3.1.3 のクラスターで I4i.8xlarge の起動を確認
- コンピュートノードのインスタンスストアは
/scratch
ディレクトリに自動マウントされる - スポットインスタンスの提供あり
- ap-northeast-1(東京)ではまだ利用できません(現時点: 2022/5/14)
相性の良い使い方
AWS ParallelCluster と組み合わせて利用する際の相性の良い点と、ローカル AWS Nitro SSD ストレージの注意事項
- 一時ファイル、中間ファイルを大量に生成するようなワークロード
- 高速なインスタンスストアを活かすのであれば単一ノードで実行するアプリケーション向き
- 最大 vCPU 128core(Hyper-Threading 無効化時は 64core)
- 最大メモリ 1TiB 最大ローカル AWS Nitro SSD ストレージ 30TB
- ストレージコストの最適化
- 高速なストレージ(インスタンスストア)を計算中の間だけ利用するためコスパが高い
- コンピュートノードの停止とともにインスタンスストアのデータは消失する
- 実行結果など残したいデータは永続ストレージ(S3 バケットなど)へ退避する必要がある
- 高速なストレージ(インスタンスストア)を計算中の間だけ利用するためコスパが高い
クラスター作成準備
キューの2番目にi4i
インスタンスタイプを起動するクラスターを作成します。
項目 | 値 |
---|---|
AWS ParallelCluster | 3.1.3 |
Job Scheduler | Slurm |
OS | Ubuntu 20.04 LTS |
CPU | Intel |
Simultaneous Multi-Threading | 無効 |
CloudWatch Dashboard | 作成しない |
Placement group | 有効 |
スポットインスタンスは提供されていましたのでコンピュートノードではスポットで利用します。
$ aws ec2 describe-instance-types --instance-types i4i.8xlarge --region us-east-2 | jq '.InstanceTypes[].SupportedUsageClasses[]' "on-demand" "spot"
サンプルコンフィグ
実行環境依存のパラメータは適時変更してご利用ください。
SubnetId:
SubnetIds:
KeyName:
BucketName:
Script:
Region: us-east-2 Image: Os: ubuntu2004 Monitoring: Logs: CloudWatch: Enabled: true RetentionInDays: 30 DeletionPolicy: "Delete" Dashboards: CloudWatch: Enabled: false Tags: - Key: Name Value: SampleCluster HeadNode: InstanceType: t3.micro Networking: ElasticIp: false SubnetId: subnet-06bef5c18e9a5f4c6 Ssh: KeyName: sandbox-key-useast2 LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 Iam: S3Access: - BucketName: hpc-dev-postinstall-files EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore Scheduling: Scheduler: slurm SlurmSettings: ScaledownIdletime: 5 SlurmQueues: # --- Queue 1 --- - Name: debug ComputeResources: - Name: debug InstanceType: t3.micro MinCount: 0 MaxCount: 10 DisableSimultaneousMultithreading: true ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-06bef5c18e9a5f4c6 # PlacementGroup: # Enabled: true CustomActions: OnNodeConfigured: Script: s3://hpc-dev-postinstall-files/sample-ubuntu-docker/postinstall.sh Iam: S3Access: - BucketName: hpc-dev-postinstall-files EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore # --- Queue 2 --- - Name: i4i ComputeResources: - Name: large8x InstanceType: i4i.8xlarge MinCount: 0 MaxCount: 10 DisableSimultaneousMultithreading: true ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-06bef5c18e9a5f4c6 PlacementGroup: Enabled: true CustomActions: OnNodeConfigured: Script: s3://hpc-dev-postinstall-files/sample-ubuntu-docker/postinstall.sh Iam: S3Access: - BucketName: hpc-dev-postinstall-files EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
コンピュートノードのCustomActions
は Docker をインストールしています。詳細は以下のリンクをご確認ください。
クラスター作成
クラスター作成コマンドを実行して10分ほど待ちます。ヘッドノードが起動したらログインします。
pcluster create-cluster -n I4iParallelcluster -c sample-i4i-parallelcluster.yml
コンピュートノードの確認
ヘッドノードからテストジョブを投げてコンピュートノードを起動させました。
ローカルストレージのマウント状況
/scratch
にマウントされていました。d
が付与されたインスタンスタイプ同様に AWS ParallelCluster はローカルストレージを自動マウントしてくれました。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 34G 18G 17G 51% / devtmpfs 124G 0 124G 0% /dev tmpfs 124G 0 124G 0% /dev/shm tmpfs 25G 1.1M 25G 1% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 124G 0 124G 0% /sys/fs/cgroup /dev/loop0 27M 27M 0 100% /snap/amazon-ssm-agent/5163 /dev/loop2 62M 62M 0 100% /snap/core20/1405 /dev/loop1 56M 56M 0 100% /snap/core18/2344 /dev/loop3 68M 68M 0 100% /snap/lxd/22753 /dev/loop4 44M 44M 0 100% /snap/snapd/15177 /dev/loop5 45M 45M 0 100% /snap/snapd/15534 10.0.1.12:/home 34G 17G 18G 49% /home 10.0.1.12:/opt/parallelcluster/shared 34G 17G 18G 49% /opt/parallelcluster/shared /dev/loop6 62M 62M 0 100% /snap/core20/1434 /dev/mapper/vg.01-lv_ephemeral 6.8T 89M 6.5T 1% /scratch 10.0.1.12:/opt/intel 34G 17G 18G 49% /opt/intel 10.0.1.12:/opt/slurm 34G 17G 18G 49% /opt/slurm tmpfs 25G 40K 25G 1% /run/user/1000
ここまでで確認できたこと
- AWS ParallelCluster 3.1.3 で
i4i
の起動をサポート - ローカル AWS Nitro SSD ストレージは
/scratch
にマウントされる
自動マウント設定はどこに入っているのか?
/scratch
のマウント設定は起動テンプレートに書き込まれています。起動テンプレートはクラスター作成時に CloudFormation(CDK)から生成されます。
こちらは実際のクラスター作成後に生成された起動テンプレートです。
ストレージ設定確認するとephemeral0 - 23
までの設定が入っています。
なぜ0から23なのか調べると、インスタンスストアの仮想デバイス数と同数でした。つまり、考えられるインスタンスストアはすべてマッピングする準備はしてある起動テンプレートになっているんですね。
Amazon EC2 インスタンスストア - Amazon Elastic Compute Cloud
実際のマウント処理はユーザーデータから呼び出している chef のスクリプトではないかと思いますがまだ動作を追いきれてないです。
2022/5/25追記マウント処理を追いかけましたのでご興味あればご覧ください
おわりに
勉強になったのは ParallelCluster 3系からは AutoScaling Group は使わなくなりましたが、2系から引き続き起動テンプレートは使われていたことを知りました。 2系はコンピュートノードの管理に AutoScaling Group を使っていましたが、3系からは Slurm ジョブスケジューラの場合は clustermgtd デーモンで管理されるように変更となっています。