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)をビルドすることはできません。また、コンテナ内でyum
やapt-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