コンテンツにスキップ

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 Getting Started Guideを参照してください。

シングルノードでの実行

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:19.06-py2

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

docker://nvcr.io/nvidia/tensorflow:19.06-py2

Singularityイメージの生成

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

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

tensorflow_19.06-py2.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.13.1/tensorflow/examples/tutorials/layers/cnn_mnist.py
[username@g0001 ~]$ singularity run --nv tensorflow_19.06-py2.sif python cnn_mnist.py
:
{'loss': 0.102341905, 'global_step': 20000, 'accuracy': 0.9696}

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

1
2
3
4
5
6
7
8
9
#!/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.13.1/tensorflow/examples/tutorials/layers/cnn_mnist.py
singularity run --nv tensorflow_19.06-py2.sif python cnn_mnist.py

複数ノードでの実行

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

MPIバージョンの確認

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

[username@es1 ~]$ module load singularitypro
[username@es1 ~]$ singularity exec tensorflow_19.06-py2.sif mpirun --version
mpirun (Open MPI) 3.1.3

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

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

[username@es1 ~]$ module avail openmpi

-------------------------------------------- /apps/modules/modulefiles/mpi ---------------------------------------------
openmpi/2.1.6          openmpi/3.1.6          openmpi/4.0.5(default)

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

SingularityイメージのMPI実行

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

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

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

[username@g0001 ~]$ wget https://raw.githubusercontent.com/horovod/horovod/v0.16.4/examples/tensorflow_mnist.py
[username@g0001 ~]$ mpirun -np 8 -npernode 4 singularity run --nv tensorflow_19.06-py2.sif python tensorflow_mnist.py
:
INFO:tensorflow:loss = 2.227471, step = 30 (0.151 sec)
INFO:tensorflow:loss = 2.2297306, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.2236195, step = 30 (0.151 sec)
INFO:tensorflow:loss = 2.2085133, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.2206438, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.2315774, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.2195148, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.2279806, step = 30 (0.152 sec)
INFO:tensorflow:loss = 2.0452738, step = 40 (0.152 sec)
INFO:tensorflow:loss = 2.0309064, step = 40 (0.152 sec)
INFO:tensorflow:loss = 2.0354269, step = 40 (0.152 sec)
INFO:tensorflow:loss = 2.0014856, step = 40 (0.152 sec)
INFO:tensorflow:loss = 2.0149295, step = 40 (0.153 sec)
INFO:tensorflow:loss = 2.0528066, step = 40 (0.153 sec)
INFO:tensorflow:loss = 1.962772, step = 40 (0.153 sec)
INFO:tensorflow:loss = 2.0659132, step = 40 (0.153 sec)
:

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

1
2
3
4
5
6
7
8
9
#!/bin/sh
#$ -l rt_F=2
#$ -j y
#$ -cwd

source /etc/profile.d/modules.sh
module load singularitypro openmpi/3.1.6
wget https://raw.githubusercontent.com/horovod/horovod/v0.16.4/examples/tensorflow_mnist.py
mpirun -np 8 -npernode 4 singularity run --nv tensorflow_19.06-py2.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 Getting Started Guide
  2. NGC Container User Guide
  3. Running NGC Containers Using Singularity
  4. 日本最速のスーパーコンピュータが NGC を採用し、ディープラーニング フレームワークの利用をより簡単に | NVIDIA