本システムでは、Singularity 3.7を用いた、コンテナによるプログラム実行環境を整えることが可能です。本項では、コンテナイメージの準備、およびコンテナのカスタマイズとビルドの方法について説明します。
事前準備
-
Singularityをwork領域を使用する場合は実行前に必ずnewgrpコマンドを実行してください。
1 2 3 |
$ groups ocean G12345 # 所属するグループを表示します。"ocean"や"hpci"は管理用のグループです。 $ newgrp G12345 |
1 |
$ export SINGULARITY_CACHEDIR=/sqfs/work/(グループ名)/(ユーザ名)/(任意のディレクトリ) |
1 |
$ singularity cache clean |
コンテナイメージの準備
-
コンテナイメージの取得方法について説明します。コンテナイメージは、SQUID内のローカルレジストリ(HPDAフロントエンドからのみ)や、インターネット上の公開レジストリから取得することが可能です。また、ご自身で作成したコンテナイメージをSQUID内にアップロードすることもできます。
ローカルレジストリからの取得
-
ローカルレジストリのsingularityコンテナイメージを取得し、sandboxを作成します。本操作はHPDAフロントエンドでのみ可能です。例として、ローカルレジストリ/master_imageに登録したtestというコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。
1 2 3 |
$ singularity build -f --sandbox --fix-perms <sandbox名> oras://cntm:5000/<コンテナイメージパス>:<tag名> #以下はイメージ"test"を取得する場合のサンプルです。 $ singularity build -f --sandbox --fix-perms test oras://cntm:5000/master_image/test:1.0 |
コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではtest)が作成されます。
Singularity Libraryからの取得
-
singularity libraryからsingularityコンテナイメージを取得し、sandboxを作成します。
例として、singularity libraryより、centosのコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。
1 2 3 |
$ singularity build -f --sandbox --fix-perms <sandbox名> library://<コンテナイメージパス>:<tag名> #以下はCentOSのイメージを取得する場合のサンプルです。 $ singularity build -f --sandbox --fix-perms centos library://emmeff/centos/centos:8 |
コンテナイメージの取得が成功すると、カレントディレクトリにsandbox(上記の例ではcentos)が作成されます。
Docker Hubからの取得
-
Docker HubからDockerコンテナイメージを取得し、singularityのsandboxを作成します。
例として、Docker Hubより、centosのコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。
1 2 3 |
$ singularity build -f --sandbox --fix-perms <sandbox名> docker://docker.io/<コンテナイメージパス>:<tag名> #以下はCentOSのイメージを取得する場合のサンプルです。 $ singularity build -f --sandbox --fix-perms centos docker://docker.io/library/centos:latest |
コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではcentos)が作成されます。
コンテナイメージのカスタマイズ・ビルド
-
コンテナイメージのカスタマイズ、およびビルドの方法について説明します。SQUIDでコンテナイメージをビルドするには、sandboxを直接カスタマイズしビルドする方法と、defファイルにカスタマイズ内容を記載しビルド時にカスタマイズする方法の二種類があります。
sandboxを直接カスタマイズする方法
-
sandboxを直接カスタマイズし、ビルドする方法について説明します。まずは、カスタマイズしたいベースコンテナイメージの取得を行い、予めsandboxを作成しておきます。次に、sandboxをコンテナとして起動します。例として、testというsandboxをカスタマイズするには、以下のコマンドを実行します。
1 2 3 |
$ singularity run -f -w test 書式は以下のとおりです。 $ singularity run -f -w <sandbox名> |
続いて、コンテナイメージのビルドを行い、sifファイルを生成します。例として、testというsandboxをビルドし、test.sifを作成するには、以下のコマンドを実行します。
1 2 3 |
$ singularity build -f test.sif test コマンドの書式は以下の通りです。 $ singularity build -f <sifファイル名> <sandbox名> |
defファイルにカスタマイズ内容を記載する方法
defファイルにカスタマイズ内容を記載し、ビルド時にカスタマイズする方法について説明します。まずは、ビルドに使用するdefファイルを作成します。
例として、ローカルレジストリに登録されたtestをベースコンテナイメージとしてカスタマイズを行う場合、defファイルは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Bootstrap: oras From: cntm:5000/master_image/test:1.0 %files ./test.conf /opt/test.conf ./test_start.sh /opt/test_start.sh %post dnf install -y net-tools chmod 755 /opt/test_start.sh %runscript /opt/test_start.sh |
defファイルの概要 ※詳細はsingularityのマニュアルをご参照ください。 | |
---|---|
Bootstrap、From | ベースイメージの種類、場所を記載します。 |
%file | ホストOSからコンテナにコピーしたいファイルを記載します。 |
%post | カスタマイズ用のコマンドを記載します。 |
%runscript | コンテナ起動時に自動実行する処理を記載します。 |
defファイルの作成完了後、コンテナイメージのビルドを行い、sifファイルを生成します。例として、test.defというdefファイルを使用してビルドを行い、test.sifを作成するには、以下のコマンドを実行します。
1 2 3 |
$ singularity build -f test.sif test.def コマンドの書式は以下の通りです。 $ singularity build -f <sifファイル名> <defファイル名> |
ビルドに成功すると、カレントディレクトリにsifファイルが作成されます。
コンテナイメージの利用
-
以下はNVIDIAの提供するNGCからPytorchのコンテナイメージを取得し、SQUIDの計算ノードで実行する手順です。
フロントエンドでPytorchのコンテナイメージを取得します。
1 |
singularity pull docker://nvcr.io/nvidia/pytorch:21.06-py3 |
SQUIDで実行するためのジョブスクリプトを作成します。以下はPytorchのexample:mnistを使用しています。SQUIDの計算ノードはインターネットに接続されておりません。学習に必要なデータはフロントエンドで予めダウンロードしてください。
環境変数SINGULARITY_BINDには、実行に必要なデータを置いているパスを設定する必要があります。以下の例ではwork領域とジョブ投入時のディレクトリを指定しています。
1 2 3 4 5 6 7 8 |
#!/bin/bash #PBS -q SQUID #PBS --group=[グループ名] #PBS -l elapstim_req=1:00:00 #PBS -l gpunum_job=8 cd $PBS_O_WORKDIR export SINGULARITY_BIND="`readlink -f /sqfs/work/[グループ名]/[ユーザ名]`,$PBS_O_WORKDIR" singularity run --nv pytorch_21.06-py3.sif python mnist/main.py --epochs 10 |
qsubコマンドで上記のジョブスクリプトをSQUIDに転送すると、Singularityを使ってPytorchが実行されます。