コンテンツにスキップ

NVIDIA NGC

NVIDIA NGC(以下、NGCという)は、GPUに最適化されたディープラーニングフレームワークコンテナやHPCアプリケーションコンテナのDockerイメージと、それらを配布するためのNGCコンテナレジストリを提供しています。ABCIでは、Singularityを利用することで、NGCが提供するDockerイメージを簡便に実行することができます。

ここでは、NGCコンテナレジストリに登録されているDockerイメージをABCIで利用する手順について説明します。

前提知識

NGCコンテナレジストリ

NGCコンテナレジストリのDockerイメージは、以下の形式で指定されます。

nvcr.io/<namespace>/<repo_name>:<repo_tag>

Singularityから利用する場合には、URLスキーマとしてdocker://を指定して以下のように表します。

docker://nvcr.io/<namespace>/<repo_name>:<repo_tag>

NGC Website

NGC Websiteは、NGCコンテナレジストリのカタログの提供、NGC API Keyの生成などの機能を提供するポータルです。

NGCコンテナレジストリのDockerイメージのうち、大半は自由に利用できますが、一部はNGCアカウントとNGC API Keyがなければアクセスできません。以下に両者の例を挙げます。

NGC Websiteで、NGCアカウントでサインインしていない状態では、後者のイメージを利用するためのPull Commandなど一部情報が閲覧できず、またAPI Keyを生成することもできません。 以下では、自由に利用できるイメージを前提に説明を行います。アクセス制限されたイメージの利用については後述します。

その他、NGC Websiteに関する詳細はNGC Documentationを参照してください。

シングルノードでの実行

TensorFlowを例にとり、NGCコンテナレジストリで提供されているDockerイメージの実行方法を説明します。

イメージURLの確認

TensorFlowのイメージをNGC Wbesiteで探します。ブラウザで "https://ngc.nvidia.com/" を開き、"Search Containers" と表示されている検索フォームに "tensorflow" と入力すると、 https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow が見つけられるはずです。

Dockerで利用する際のPull Commandが以下のように示されています。

docker pull nvcr.io/nvidia/tensorflow:21.06-tf1-py3

NGCコンテナレジストリで説明したとおり、Singularityから利用する場合には、このイメージは以下のURLで指定できます。

docker://nvcr.io/nvidia/tensorflow:21.06-tf1-py3

Singularityイメージの生成

インタラクティブノード上でTensorFlowのSingularityイメージを生成します。

[username@es1 ~]$ module load singularitypro
[username@es1 ~]$ singularity pull docker://nvcr.io/nvidia/tensorflow:21.06-tf1-py3

tensorflow_21.06-tf1-py3.sifという名前のイメージファイルが生成されます。

Singularityイメージの実行

1ノード占有でインタラクティブジョブを起動し、サンプルプログラム cnn_mnist.py を実行します。

[username@es1 ~]$ qrsh -g grpname -l rt_F=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularitypro
[username@g0001 ~]$ wget https://raw.githubusercontent.com/tensorflow/tensorflow/v1.15.5/tensorflow/examples/tutorials/layers/cnn_mnist.py
[username@g0001 ~]$ singularity run --nv tensorflow_21.06-tf1-py3.sif python cnn_mnist.py
:
{'accuracy': 0.9703, 'loss': 0.10137254, 'global_step': 20000}

バッチジョブでも同様に実行できます。

#!/bin/sh
#$ -l rt_F=1
#$ -j y
#$ -cwd

source /etc/profile.d/modules.sh
module load singularitypro
wget https://raw.githubusercontent.com/tensorflow/tensorflow/v1.15.5/tensorflow/examples/tutorials/layers/cnn_mnist.py
singularity run --nv tensorflow_21.06-tf1-py3.sif python cnn_mnist.py

複数ノードでの実行

NGCのコンテナイメージのうち一部は、MPIでの並列実行に対応しています。シングルノードでの実行で使用したTensorFlowイメージも並列実行に対応しています。

MPIバージョンの確認

TensorFlowイメージにインストールされているMPIのバージョンを確認します。

[username@es1 ~]$ module load singularitypro
[username@es1 ~]$ singularity exec tensorflow_21.06-tf1-py3.sif mpirun --version
mpirun (Open MPI) 4.1.1rc1

Report bugs to http://www.open-mpi.org/community/help/

次にABCIで利用できるOpen MPIのバージョンを確認します。

[username@es1 ~]$ module avail openmpi

-------------------- /apps/modules/modulefiles/centos7/mpi ---------------------
openmpi/4.0.5          openmpi/4.1.3(default)

openmpi/4.1.3を使うのが適当のようです。少なくともメジャーバージョンが一致している必要があります。

SingularityイメージのMPI実行

2ノード占有でインタラクティブジョブを起動し、必要なモジュールを読み込みます。

[username@es1 ~]$ qrsh -g grpname -l rt_F=2 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularitypro openmpi/4.1.3

1ノードあたり4基のGPUがあり、2ノード占有では計8基のGPUが使えることになります。この場合、8個のプロセスをノードあたり4個ずつ並列に起動し、サンプルプログラム tensorflow_mnist.py を実行します。

[username@g0001 ~]$ wget https://raw.githubusercontent.com/horovod/horovod/v0.22.1/examples/tensorflow/tensorflow_mnist.py
[username@g0001 ~]$ mpirun -np 8 -npernode 4 singularity run --nv tensorflow_21.06-tf1-py3.sif python tensorflow_mnist.py
:
INFO:tensorflow:loss = 0.13635147, step = 30 (0.236 sec)
INFO:tensorflow:loss = 0.16320482, step = 30 (0.236 sec)
INFO:tensorflow:loss = 0.23524982, step = 30 (0.237 sec)
INFO:tensorflow:loss = 0.1300551, step = 30 (0.236 sec)
INFO:tensorflow:loss = 0.10259462, step = 30 (0.237 sec)
INFO:tensorflow:loss = 0.04606852, step = 30 (0.237 sec)
INFO:tensorflow:loss = 0.10536947, step = 30 (0.236 sec)
INFO:tensorflow:loss = 0.09811305, step = 30 (0.237 sec)
INFO:tensorflow:loss = 0.06823079, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.0671196, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.1545426, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.13310829, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.084449895, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.10252285, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.078794435, step = 40 (0.225 sec)
INFO:tensorflow:loss = 0.17852336, step = 40 (0.225 sec)
:

バッチジョブでも同様に実行できます。

#!/bin/sh
#$ -l rt_F=2
#$ -j y
#$ -cwd

source /etc/profile.d/modules.sh
module load singularitypro openmpi/4.1.3
wget https://raw.githubusercontent.com/horovod/horovod/v0.22.1/examples/tensorflow/tensorflow_mnist.py
mpirun -np 8 -npernode 4 singularity run --nv tensorflow_21.06-tf1-py3.sif python tensorflow_mnist.py

アクセス制限されたイメージの利用

以下では、Chainerを例に、NGCコンテナレジストリ上でアクセス制限されたイメージの実行方法を説明します。

イメージURLの確認

https://ngc.nvidia.com/catalog/containers/partners:chainer でNGCアカウントにサインインすることで、Dockerで利用する際のPull Commandが得られます。

docker pull nvcr.io/partners/chainer:4.0.0b1

Singularityから利用する場合には、このイメージは以下のURLで指定できることが分かります。

docker://nvcr.io/partners/chainer:4.0.0b1

Singularityイメージの生成

イメージの生成には、NGC API Keyが必要です。下記の手順にしたがって生成してください。

インタラクティブノード上でSingularityイメージを生成します。Dockerイメージのダウンロードには、環境変数SINGULARITY_DOCKER_USERNAME, SINGULARITY_DOCKER_PASSWORDの設定が必要です。

[username@es1 ~]$ module load singularitypro
[username@es1 ~]$ export SINGULARITY_DOCKER_USERNAME='$oauthtoken'
[username@es1 ~]$ export SINGULARITY_DOCKER_PASSWORD=<NGC API Key>
[username@es1 ~]$ singularity pull docker://nvcr.io/partners/chainer:4.0.0b1

chainer_4.0.0b1.sifという名前のイメージファイルが生成されます。

環境変数の代わりに--docker-loginオプションを指定してイメージをダウンロードすることも可能です。

[username@es1 ~]$ module load singularitypro
[username@es1 ~]$ singularity pull --disable-cache --docker-login docker://nvcr.io/partners/chainer:4.0.0b1
Enter Docker Username: $oauthtoken
Enter Docker Password: <NGC API Key>

Singularityイメージの実行

通常のSingularityイメージと同じ手順で実行できます。

[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load singularitypro
[username@g0001 ~]$ wget https://raw.githubusercontent.com/chainer/chainer/v4.0.0b1/examples/mnist/train_mnist.py
[username@g0001 ~]$ singularity exec --nv chainer_4.0.0b1.sif python train_mnist.py -g 0
:
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.191976    0.0931192             0.942517       0.9712            18.7328
2           0.0755601   0.0837004             0.9761         0.9737            20.6419
3           0.0496073   0.0689045             0.984266       0.9802            22.5383
4           0.0343888   0.0705739             0.988798       0.9796            24.4332
:

参考

  1. NGC Documentation
  2. NGC Container User Guide for NGC Catalog
  3. Running Singularity Containers
  4. 日本最速のスーパーコンピュータが NGC を採用し、ディープラーニング フレームワークの利用をより簡単に | NVIDIA