AWS ParallelCluster で Apptainer を実行する Apptainer on ParallelCluster の実装方法
AWS ParallelCluster を使用して Apptainer(旧称 Singularity)の実行環境を構築する方法を、クラスターの設定からコンピュートノードへの Apptainer のインストール、そして動作確認までを解説します。
Apptainer の概要
Apptainer は HPC 向けのコンテナ実行環境として利用されています。アプリケーションの実行環境構築の手間を省くためにコンテナを活用が進んでいます。 近年では国内の主要なスパコンでも Apptainer は利用可能になっています。
AWS には Apptainer を実行するマネージサービスはありません。Docker コンテナであれば、AWS Batch があるのですが、Apptainer コンテナとなると自前で環境を構築するしかありません。
HPC 向けのコンテナということもあり、計算リソースは柔軟にスケールしてくれるに越したことはありません。今回は AWS の HPC サービス ParallelCluster に Apptainer を組み込み、スケーラブルな Apptainer 実行環境を構築します。
Apptainer on ParallelCluster
検証で使用したクラスターのコンフィグと、Apptainer インストール用のスクリプトを紹介します。
項目 | 値 |
---|---|
AWS ParallelCluster | 3.9.0 |
OS | Ubuntu 22.04 LTS |
CPU | Intel |
Simultaneous Multi-Threading | 無効 |
Apptainer 用クラスターコンフィグの設定
Apptainer on ParallelCluster 用のサンプルコンフィグです。
- Apptainer のインストールはカスタムブートストラップスクリプト(
install.sh
)で実施 - ヘッドノードに Apptainer はインストールしていません
Region: ap-northeast-1 Image: Os: ubuntu2204 Tags: - Key: Name Value: TokoroScalpo390 # ---------------------------------------------------------------- # Head Node Settings # ---------------------------------------------------------------- HeadNode: InstanceType: t3.micro Networking: ElasticIp: false SubnetId: subnet-0c82bb28e119e2aa8 Ssh: KeyName: org-sandbox-keypair LocalStorage: RootVolume: Size: 40 Encrypted: true VolumeType: gp3 Iops: 3000 Throughput: 125 Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3 S3Access: - BucketName: hpc-custom-boostrap-files EnableWriteAccess: false # ---------------------------------------------------------------- # Compute Node Settings # ---------------------------------------------------------------- Scheduling: Scheduler: slurm SlurmSettings: ScaledownIdletime: 5 SlurmQueues: # ------ Compute ------ - Name: partiton2 ComputeResources: - Name: p2 Instances: - InstanceType: m7i-flex.xlarge - InstanceType: m7i.xlarge MinCount: 0 MaxCount: 10 DisableSimultaneousMultithreading: true ComputeSettings: LocalStorage: RootVolume: Size: 40 Encrypted: true VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT AllocationStrategy: capacity-optimized Networking: SubnetIds: - subnet-0c82bb28e119e2aa8 - subnet-0296a0c8515ed3bdc - subnet-0089ff187d1f54258 PlacementGroup: Enabled: false CustomActions: OnNodeConfigured: Sequence: - Script: s3://hpc-custom-boostrap-files/apptainer/install.sh Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3 S3Access: - BucketName: hpc-custom-boostrap-files EnableWriteAccess: false # ---------------------------------------------------------------- # Shared Storage Settings # ---------------------------------------------------------------- SharedStorage: - MountDir: /mnt/hpc-dev-efs-for-parallelcluster Name: efs1 StorageType: Efs EfsSettings: FileSystemId: fs-0846dc947572a66a1 # ---------------------------------------------------------------- # Other Settings # ---------------------------------------------------------------- Monitoring: Logs: CloudWatch: Enabled: true RetentionInDays: 180 DeletionPolicy: "Delete" Dashboards: CloudWatch: Enabled: true
Apptainer インストール設定
コンピュートノードの起動時に以下のスクリプト(install.sh
)を実行し、Apptainer のインストールを行います。
#! /bin/bash # Ubuntuシステムのパッケージリストを更新し、必要なリポジトリを追加します。 sudo apt update sudo apt install -y software-properties-common # Apptainerの公式PPAからApptainerをインストールします。 sudo add-apt-repository -y ppa:apptainer/ppa sudo apt update sudo apt install -y apptainer
install.sh
はクラスター作成のコンフィグ内で指定する所定の S3 バケットに保存します。本記事のサンプルコンフィグでは S3 バケット(hpc-custom-boostrap-files
)内のapptainer/
配下にinstall.sh
が保存しています。
また、 コンピュートノードから対象の S3 バケットへアクセスする権限が必要です。S3Access:
セクションで対象のバケットに対して読み取り専用の権限を付与しています。
CustomActions: OnNodeConfigured: Sequence: - Script: s3://hpc-custom-boostrap-files/apptainer/install.sh Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3 S3Access: - BucketName: hpc-custom-boostrap-files EnableWriteAccess: false
Apptainer 動作確認
テストジョブをサブミットしてコンピュートノード上の Apptainer でコンテナが起動するか確認します。
Apptainer コンテナ起動テスト
ParallelCluster 上で Apptainer が正常にインストールされ、機能しているかを確認するためのコンテナ起動テストを行います。 以下のスクリプトを使用して、Docker Hub から取得したイメージを利用しコンテナを起動します。
#! /bin/bash #SBATCH -p partiton2 #SBATCH -N 1 # Apptainerのバージョンを確認 apptainer version # Docker Hubからlolcowイメージを取得しコンテナを起動 apptainer run docker://sylabsio/lolcow:latest
実行結果
Apptainer が正常に機能していることが確認できました。以下の出力から、インストールされている Apptainer のバージョンと、コンテナの起動成功が確認できます。
1.3.0 INFO: Using cached SIF image ______________________________ < Sun Apr 14 06:23:22 UTC 2024 > ------------------------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Apptainer ディレクトリマウント検証
次に、Apptainer がローカルのディレクトリをコンテナにマウントできるかを検証します。以下のスクリプトを使用して、コンピュートノードの /mnt
ディレクトリをコンテナ内で参照します。
#! /bin/bash #SBATCH -p partiton2 #SBATCH -N 1 MOUNT_PATH="/mnt/" apptainer exec --bind ${MOUNT_PATH}:/mnt docker://ubuntu:noble-20240225 ls apptainer exec --bind ${MOUNT_PATH}:/mnt docker://ubuntu:noble-20240225 ls /mnt
実行結果
コンテナからコンピュートノードのローカルディレクトリ /mnt
を参照できることが確認できました。以下の出力から、マウントされたディレクトリ内のファイル一覧が表示されています。
INFO: Using cached SIF image slurm-1.out slurm-5.out slurm-6.out slurm-7.out slurm-8.out test-apptainer.sh test-mount.sh test.sh work INFO: Using cached SIF image hpc-dev-efs-for-parallelcluster
ホストのローカルディレクトリをマウントしコンテナから参照可能でした。
マウントしたディレクトリに書き込み検証
コンテナからマウントした EFS へ書き込みできるか検証します。
以下のテストジョブのスクリプトを作成しサブミットしました。
touch
コマンドで空ファイルを作成
#! /bin/bash #SBATCH -p partiton2 #SBATCH -N 1 MOUNT_PATH="/mnt/" apptainer exec --bind ${MOUNT_PATH}:/mnt docker://ubuntu:noble-20240225 touch /mnt/hpc-dev-efs-for-parallelcluster/write-ok.txt
実行結果
標準出力の出力結果を見てもわかりません。
INFO: Using cached SIF image
ヘッドノードからマウントしている EFS を確認します。werite-ok.txt
の作成が確認できました。
$ ls -l /mnt/hpc-dev-efs-for-parallelcluster/ total 12 drwxrwxr-x 2 ubuntu ubuntu 6144 Apr 14 02:52 images drwxrwxr-x 3 ubuntu ubuntu 6144 Dec 27 04:19 work -rw-rw-r-- 1 ubuntu ubuntu 0 Apr 14 07:19 write-ok.txt
コンテナからホストにマウントしている外部ストレージに書き込み可能でした。
まとめ
AWS ParallelCluster と Apptainer を組み合わせて、Apptainer on ParallelCluster 実行環境の構築方法について紹介しました。
おわりに
Apptainer は多くのスパコンで採用されています。特に研究やデータ分析の分野で活用されており、AWS ParallelCluster と組み合わせることで、クラウド環境でも同様の計算環境を利用できます。 クラウドの柔軟な計算リソースを活用して、大規模なシミュレーションやデータ分析をジョブの実行待ちに悩むことなく実行できるのは魅力ではないでしょうか。
この記事が、AWS ParallelCluster と Apptainer を用いた環境構築の一助となれば幸いです。