9. Linuxコンテナ

Singularity

Warning

Singularity 2.6 は3月末に提供を停止します。

ABCIシステムではSingularityが利用可能です。 利用可能なバージョンはSingularity version 2.6とSingularityPRO 3.5となります。 利用するためには事前にmoduleコマンドを用いて利用環境を設定する必要があります。

Singularity 2.6

[username@g0001~]$ module load singularity/2.6.1

SingularityPRO 3.5

[username@g0001~]$ module load singularitypro/3.5

より網羅的なユーザガイドは、以下にあります。

Singularityを用いて、NGCが提供するDockerイメージをABCIで実行する方法は、NVIDIA NGC で説明しています。

Singularityイメージファイルの作成(pull)

Singularityコンテナイメージはファイルとして保存することが可能です。 ここでは、pullを用いたSingularityイメージファイルの作成手順を示します。

pullによるSingularityイメージファイルの作成例)

Singularity 2.6

[username@es1 ~]$ module load singularity/2.6.1
[username@es1 ~]$ singularity pull --name caffe2.img docker://caffe2ai/caffe2:latest
Docker image path: index.docker.io/caffe2ai/caffe2:latest
Cache folder set to /fs3/home/username/.singularity/docker
...
[username@es1 ~]$ ls caffe2.img
caffe2.img

SingularityPRO 3.5

[username@es1 ~]$ module load singularitypro/3.5
[username@es1 ~]$ singularity pull caffe2.img docker://caffe2ai/caffe2:latest
INFO:    Converting OCI blobs to SIF format
INFO:    Starting build...
...
[username@es1 ~]$ ls caffe2.img
caffe2.img

Singularityイメージファイルの作成(build)

ABCIシステムのSingularityPRO 3.5環境ではfakerootオプションを使用することによりbuildを使ったイメージ構築が可能です。

Note

SingularityPRO 3.5環境ではリモートビルドも利用可能です。詳細はこちらを参照下さい。

Warning

Singularity 2.6環境ではrecipeファイルを用いたイメージのbuildは実行できません。 利用者自身でカスタムしたコンテナイメージを利用したい場合は、 ABCIの環境(Singularity、フレームワーク、MPIのバージョン等)に合わせたユーザ環境で イメージを作成後、イメージファイルをABCI上に転送する必要があります。

buildによるSingularityイメージファイルの作成例)

SingularityPRO 3.5

[username@es1 ~]$ module load singularitypro/3.5
[username@es1 ~]$ singularity build --fakeroot ubuntu.sif ubuntu.def
INFO:    Starting build...
(snip)
INFO:    Creating SIF file...
INFO:    Build complete: ubuntu.sif
[username@es1 singularity]$

なお、 上記コマンドにおいてイメージファイル(ubuntu.sif)の出力先をグループ領域(/groups1, /groups2)にするとエラーが発生します。その場合、singularityコマンドを実行する前に以下のようにidコマンドでイメージ出力先グループ領域の所有グループを確認の上、newgrpコマンドを実施いただくことで回避可能です。 下記例のgaa00000の箇所がイメージ出力先グループ領域の所有グループとなります。

[username@es1 groupname]$ id -a
uid=0000(aaa00000aa) gid=0000(aaa00000aa) groups=0000(aaa00000aa),00000(gaa00000)
[username@es1 groupname]$ newgrp gaa00000

コンテナの実行

Singularityを利用する場合、ジョブ中にsingularity runコマンドを実行しSingularityコンテナを起動します。 イメージファイルをコンテナで実行する場合はsingularity runコマンドの引数でイメージファイルを指定します。 また、singularity runコマンドではDocker Hubで公開されているコンテナイメージを指定して実行することも可能です。

インタラクティブジョブにおけるSingularityイメージファイルを使用したコンテナの実行例)

Singularity 2.6

[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularity/2.6.1
[username@g0001 ~]$ singularity run ./caffe2.img

SingularityPRO 3.5

[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularitypro/3.5
[username@g0001 ~]$ singularity run ./caffe2.img

バッチジョブにおけるSingularityイメージファイルを使用したコンテナの実行例)

Singularity 2.6

[username@es1 ~]$ cat job.sh
(snip)
source /etc/profile.d/modules.sh
module load singularity/2.6.1 openmpi/3.1.6

mpiexec -n 4 singularity exec --nv ./caffe2.img \
    python sample.py

[username@es1 ~]$ qsub -g grpname ./job.sh

SingularityPRO 3.5

[username@es1 ~]$ cat job.sh
(snip)
source /etc/profile.d/modules.sh
module load singularitypro/3.5 openmpi/3.1.6

mpiexec -n 4 singularity exec --nv ./caffe2.img \
    python sample.py

[username@es1 ~]$ qsub -g grpname ./job.sh

Docker Hubで公開されているコンテナイメージの実行例)

以下の例はDocker Hubで公開されているcaffe2のコンテナイメージを使用しSingularityを実行しています。 singularity runコマンドにより起動したSingularityコンテナ上でpython sample.pyが実行されます。 コンテナイメージは初回起動時にダウンロードされ、ホーム領域にキャッシングされます。 2回目以降の起動はキャッシュされたデータを使用することで起動が高速化されます。

Singularity 2.6

[username@es1 ~]$ qrsh -g grpname -l rt_F=1 -l h_rt=1:00:00
[username@g0001~]$ module load singularity/2.6.1
[username@g0001~]$ singularity run --nv docker://caffe2ai/caffe2:latest
Docker image path: index.docker.io/caffe2ai/caffe2:latest
Cache folder set to /fs3/home/username/.singularity/docker
Creating container runtime...
...
[username@g0001~]$ python sample.py
True

SingularityPRO 3.5

[username@es1 ~]$ qrsh -g grpname -l rt_F=1 -l h_rt=1:00:00
[username@g0001~]$ module load singularitypro/3.5
[username@g0001~]$ singularity run --nv docker://caffe2ai/caffe2:latest
...
Singularity> python sample.py
True

DockerfileからのSingularityイメージファイルの作成方法

Singularityでは、Dockerfileから直接Singularityで利用できるコンテナイメージを作成できません。 Dockerfileしかない場合には、次の2通りの方法にて、ABCIシステム上のSingularityで利用できるコンテナイメージを作成できます。

Docker Hubを経由

Dockerの実行環境があるシステム上でDockerfileからDockerコンテナイメージを作成し、Docker Hubにアップロードすることで、作成したDockerコンテナイメージをABCIシステム上で利用することができるようになります。

以下の例では、NVIDIA社によるSSD300 v1.1モデル学習用コンテナイメージをDockerfileから作成し、Docker Hubにアップロードしています。

[user@pc ~]$ git clone https://github.com/NVIDIA/DeepLearningExamples
[user@pc ~]$ cd DeepLearningExamples/PyTorch/Detection/SSD
[user@pc SSD]$ cat Dockerfile
ARG FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:20.06-py3
FROM ${FROM_IMAGE_NAME}

# Set working directory
WORKDIR /workspace

ENV PYTHONPATH "${PYTHONPATH}:/workspace"

COPY requirements.txt .
RUN pip install --no-cache-dir git+https://github.com/NVIDIA/dllogger.git#egg=dllogger
RUN pip install -r requirements.txt
RUN python3 -m pip install pycocotools==2.0.0

# Copy SSD code
COPY ./setup.py .
COPY ./csrc ./csrc
RUN pip install .

COPY . .
[user@pc SSD]$ docker build -t user/docker_name .
[user@pc SSD]$ docker login && docker push user/docker_name

作成したDockerコンテナイメージをABCI上で起動する方法についてはコンテナの実行をご参照ください。

DockerfileをSingularity recipeファイルに変換

DockerfileをSingularity recipeファイルに変換することで、ABCIシステム上でSingularityコンテナイメージを作成できます。 変換にはSingularity Pythonを使うことができます。

Warning

Singularity Pythonを使うことでDockerfileとSingularity recipeファイルの相互変換を行うことができますが、完璧ではありません。 変換されたSingularity recipeファイルにてsingularity buildに失敗する場合は、手動でrecipeファイルを修正してください。

Singularity Pythonのインストール例)

[username@es1 ~]$ module load python/3.6/3.6.5
[username@es1 ~]$ python3 -m venv work
[username@es1 ~]$ source work/bin/activate
(work) [username@es1 ~]$ pip3 install spython

以下の例では、NVIDIA社によるSSD300 v1.1モデル学習用コンテナイメージのDockerfileをSingularity recipeファイル(ssd.def)に変換し、正常にイメージを作成できるよう修正します。

Dockerfileから変換しただけでは次の2点の問題が発生するため、それぞれの対処が必要となります。

  • WORKDIRにファイルがコピーされない => コピー先をWORKDIRの絶対パスに設定
  • pipにパスが通らない => %postセクションにDockerイメージの環境変数を引き継ぐ設定を追加
[username@es1 ~]$ module load python/3.6/3.6.5
[username@es1 ~]$ source work/bin/activate
(work) [username@es1 ~]$ git clone https://github.com/NVIDIA/DeepLearningExamples
(work) [username@es1 ~]$ cd DeepLearningExamples/PyTorch/Detection/SSD
(work) [username@es1 SSD]$ spython recipe Dockerfile ssd.def
(work) [username@es1 SSD]$ cp -p ssd.def ssd_org.def
(work) [username@es1 SSD]$ vi ssd.def
Bootstrap: docker
From: nvcr.io/nvidia/pytorch:20.06-py3
Stage: spython-base

%files
requirements.txt /workspace                     <- コピー先を相対パス(.)から絶対パスに変更
./setup.py /workspace                           <- コピー先を相対パス(.)から絶対パスに変更
./csrc /workspace/csrc                          <- コピー先を相対パス(.)から絶対パスに変更
. /workspace                                    <- コピー先を相対パス(.)から絶対パスに変更
%post
FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:20.06-py3
. /.singularity.d/env/10-docker2singularity.sh  <- 追加

# Set working directory
cd /workspace

PYTHONPATH="${PYTHONPATH}:/workspace"

pip install --no-cache-dir git+https://github.com/NVIDIA/dllogger.git#egg=dllogger
pip install -r requirements.txt
python3 -m pip install pycocotools==2.0.0

# Copy SSD code
pip install .

%environment
export PYTHONPATH="${PYTHONPATH}:/workspace"
%runscript
cd /workspace
exec /bin/bash "$@"
%startscript
cd /workspace
exec /bin/bash "$@"

Singularity recipeファイルからのコンテナイメージの作成方法については、Singularityイメージファイルの作成(build)をご参照ください。

Docker

ABCIシステムではDockerコンテナ上でのジョブ実行が可能です。 Dockerを利用する場合、ジョブ投入時に-l dockerオプションと-l docker_imagesオプションを指定する必要があります。

オプション 説明
-l docker ジョブをDockerコンテナ上で実行します。
-l docker_images 利用するDockerイメージを指定します。

Warning

ABCIシステムでは、メモリインテンシブノードではDockerを利用できません。

利用可能なDockerイメージはshow_docker_imagesコマンドで参照可能です。

[username@es1 ~]$ show_docker_images
REPOSITORY                TAG             IMAGE ID     CREATED       SIZE
jcm:5000/dhub/ubuntu      latest          113a43faa138 3 weeks ago   81.2MB

Warning

ABCIシステムでは、システム内で公開されているDockerイメージのみ利用可能です。

Dockerジョブのジョブスクリプト例)

以下のジョブスクリプトではpython3 ./test.pyがDockerコンテナ上で実行されます。

[username@es1 ~]$ cat run.sh
#!/bin/sh
#$-cwd
#$-j y
#$-l rt_F=1
#$-l docker=1
#$-l docker_images="*jcm:5000/dhub/ubuntu*"

python3 ./sample.py

Dockerジョブの投入例)

[username@es1 ~]$ qsub run.sh
Your job 12345 ("run.sh") has been submitted

Warning

Dockerコンテナはノード占有ジョブでのみ利用可能です。