AWS ParallelCluster で Apptainer を実行する Apptainer on ParallelCluster の実装方法

2024.04.14

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

参考