6.8. Singularity

Singularityの概要#

SingularityはLinux用のコンテナプラットフォームであり、アプリケーションの実行環境をコンテナ上に作成できます。 利用者自身でカスタマイズした環境を作成したり、外部機関によって公式に配布されているコンテナイメージをもとに本サービス上に同等の環境を構築し、利用することができます。

コンテナ(Singularity Image File)のダウンロード#

x86システム/GPUシステム用のSingularity Image File (SIF) はログインノードからダウンロードが可能です。pullコマンドを利用してダウンロードします。

  • x86システムの例: lolcow.sifをpullする
$ singularity pull library://lolcow
  • GPUシステムの例: tensolflow 2.11.0 のGPU版をpullする
$ singularity pull tensorflow-2.11.0-gpu.sif docker://tensorflow/tensorflow:2.11.0-gpu

Armシステム用のSingularity Image File(SIF)はSylabsのlibrary内にあるイメージのみダウンロードが可能です。ログインノードでダウンロードする場合には--arch arm64オプションを指定してください。DockerHubからダウンロードすることはできないため、Armシステム用のSIFは別途ダウンロードしてからコピーして利用してください。

  • Armシステムの例: ubuntu-20.04のarm版をpullする
$ singularity pull --arch arm64 library://library/default/ubuntu-arm64:focal

コンテナの作成#

本システムではfakeroot機能は制限されているため、定義ファイルからコンテナ(SIF)をビルドすることはできません。また、コンテナ内でyumapt-getによるパッケージのインストールも制限されています。

定義ファイルからコンテナのビルドを行う場合は、リモートビルダー機能を使用してください。リモートビルダー機能を使用する場合は接続先から発行されるトークンが必要になります。トークンはSylabsのサイトから入手していただき、singularity remote loginを実行し、以下のように設定してください。

$ singularity remote login
Generate an access token at https://cloud.sylabs.io/auth/tokens, and paste it here.
Token entered will be hidden for security.
Access Token:   # ここで発行されたトークンを入力
INFO:    Access Token Verified!
INFO:    Token stored in ${HOME}/.singularity/remote.yaml

リモートビルダー機能を使用する際の例として、以下の定義ファイル(sample.def)からコンテナを作成します。

Bootstrap: docker
From: ubuntu:16.04

%post
    apt-get -y update
    apt-get -y install cowsay lolcat

%environment
    export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    date | cowsay | lolcat

上記のファイルからビルドを行います。buildコマンドに--remoteオプションが必要です。

$ singularity build --remote sample.sif sample.def
INFO:    Access Token Verified!
INFO:    Token stored in /root/.singularity/remote.yaml
INFO:    Remote "cloud.sylabs.io" now in use.
INFO:    Starting build...
                   :
INFO:    Image uploaded successfully.
INFO:    Build complete: sample.sif

上記のコマンドでコンテナ(sample.sif)が作成されます。

コンテナの編集#

SIFファイルを展開し、ファイルの編集を行うことができます。編集はsandbox機能を使用して行います。buildコマンドに--sandboxオプションを追加してビルドを実行します。

$ singularity build --sandbox sample_sand sample.sif

上記のコマンドを実行すると、sample.sifがsample_sandディレクトリに展開されます。sample_sandディレクトリがコンテナのルートディレクトリに相当します。 ファイル編集後は以下のコマンドで展開したディレクトリをコンテナに変換します。

$ singularity build sample_new.sif sample_sand

コンテナの実行#

Singularityを使用してジョブを実行する場合にはpjsubのオプションで -L "jobenv=singularity"が必要になります。また、GPUシステムでSingularityを実行する場合は--nvオプションが必要になります。以下にx86システムとGPUシステムでtensolflowを実行する場合のサンプルスクリプトを示します。

  • x86システム向けのサンプルスクリプト
#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-medium"
#PJM -L "elapse=00:05:00"
#PJM -L "jobenv=singularity"
#PJM -s
#PJM -j

singularity exec tensorflow_latest.sif python test.py
  • GPUシステム向けのサンプルスクリプト
#PJM -L "gpu=2"
#PJM -L "rscunit=rscunit_pg02"
#PJM -L "rscgrp=gpu-medium"
#PJM -L "elapse=00:05:00"
#PJM -L "jobenv=singularity"
#PJM -s
#PJM -j

singularity exec --nv tensorflow-2.11.0-gpu.sif python test.py

MPIの実行#

SingularityとMPIを併用することは可能ですが、1ノード実行と複数ノード実行で実行方法が異なります。ただし、複数ノード実行の場合はコンテナをプロセス数だけ立ち上げる必要があり、仮想環境が複数立ち上がるため性能が出ないなどの問題があります。

  • 1ノード実行の場合

1ノード内でMPIによる並列化を行う場合はコンテナ内にMPI環境を含める必要があります。コンテナをダウンロードまたは作成するときはMPIを含むものを用意してください。 1ノードでMPI実行を行う場合はコンテナ内でmpiexecを実行します。このサンプルスクリプトを以下に示します。

#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-medium"
#PJM -L "elapse=00:05:00"
#PJM -L "jobenv=singularity"
#PJM -s
#PJM -j

singularity exec ubuntu_mpi.sif mpiexec -n 4 ./test_x86.exe

上記スクリプトでは、コンテナ内のmpiexecを使用して4並列でtest_x86.exeを実行します。

  • 複数ノードの場合

複数ノードでのMPI実行は性能やシステムリソース的におすすめできませんが、使用する場合はコンテナとホストOS側に同じMPI環境を用意する必要があります。Armシステム、x86システムおよびGPUシステムの計算ノードにインストールされているMPI環境と同じものをコンテナ内に含めるか、コンテナ内のMPI環境と同じものをユーザーのローカル環境にインストールする必要があります。 上記の準備が可能であれば、以下のようなコマンドで実行できます。

mpiexec -n 4 singularity exec ./test_x86.exe