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 を用いた環境構築の一助となれば幸いです。