ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博...

45
山崎和博 ディープラーニングのための GPU講習会 - 九州大学スーパーコンピュータシステム ITOによる実習 - ハンズオン#2: マルチ GPUを用いた ディープラーニングの高速化 NVIDIA, ディープラーニング ソリューションアーキテクト

Transcript of ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博...

Page 1: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

山崎和博

ディープラーニングのための GPU講習会- 九州大学スーパーコンピュータシステム ITOによる実習 -

ハンズオン#2: マルチ GPUを用いたディープラーニングの高速化

NVIDIA, ディープラーニング ソリューションアーキテクト

Page 2: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

AGENDA

ハンズオン#2のテーマ: 分散学習

タスク#1: マルチGPUでの学習

(option)タスク#2: マルチノードでの学習

Page 3: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

ハンズオン#2のゴール

• ITOの複数ノードを利用してジョブを流す方法を把握する

• マルチGPU/マルチノードでの学習方法を理解する

複数のGPU/ノードを利用できるようになる

3

Page 4: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

ハンズオン#2のテーマ: 分散学習

4

Page 5: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習モデル/データの大規模化

5

LeNet5layers

GoogLeNet24layers

ResNet152layers

?

モデルの複雑化 データの拡大?

ImageNet256x256, 1M imgs

MNIST28x28,60K imgs

Page 6: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習マルチGPU/マルチノードで分散して学習

6

データ並列(data parallelism) モデル並列(model parallelism)

Large Scale Distributed Deep Networks より

Page 7: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習マルチGPU/マルチノードで分散して学習

7

データ並列(data parallelism)

• 複数GPUで同じネットワーク(パラメータ)を共有

• データを分割してそれぞれ勾配計算し、パラメータを更新

→学習時間の短縮が期待できる

Large Scale Distributed Deep Networks より

Page 8: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習マルチGPU/マルチノードで分散して学習

8

モデル並列(model parallelism)

• ネットワーク(パラメータ)を複数GPUで分散して保持

• 同じデータに対し、各GPUが協調してパラメータを更新

→ 1GPUに乗り切らない大規模なネットワークを処理できる可能性

Large Scale Distributed Deep Networks より

Page 9: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習における注意点バッチサイズと精度の関係

9

バッチサイズによって、同じ学習回数で達成できる精度が

変化する

分散学習すると、トータルのバッチサイズは大きくなりがち→問題になる可能性あり

https://arxiv.org/abs/1705.08741 より

Page 10: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

分散学習における注意点バッチサイズと精度の関係

10https://arxiv.org/abs/1705.08741 より

バッチサイズによって、同じ学習回数で達成できる精度が

変化する

分散学習すると、トータルのバッチサイズは大きくなりがち→問題になる可能性あり

学習率やバッチサイズを調整することで、精度低下を回避する研究が多数• Train longer, generalize better: closing the generalization gap

in large batch training of neural networks

• Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour

• LARGE BATCH TRAINING OF CONVOLUTIONAL NETWORKS

• Don't Decay the Learning Rate, Increase the Batch Size

……が、今日は細かいところに踏み込みません

Page 11: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

タスク#1: マルチGPUでの学習

11

Page 12: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUで学習ジョブを流す

以下の作業を完了させる。

1. train_cifar_multi_gpu.pyに「PUT YOUR CODE」という箇所があるので、書き換えてプログラムを完成させる

2. スクリプトの修正完了したら実行

1. pjsub run_multi_gpu_training.sh

3. 結果を確認

簡単な例で、ジョブの流し方を把握する

12

Page 13: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所

13

マルチGPU向けにデータ用iteratorを変更

メインのGPUとして使うものを指定

デバイス(=GPU)のリストを作成

マルチGPU用の更新ロジックを指定 テストで使う

GPUを指定

Page 14: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

CHAINERのAPI

• ネットワークの更新ロジックを指定

• chainer.training.updaters.MultiprocessParallelUpdater(iterators, optimizer, devices)

• 基本はシングルGPUのクラスと同じ使い方

• GPUへのモデル転送は明示的に実施する必要なし

• 学習データのイテレータをGPU数と同じ数準備する

• デバイス名をキーとする辞書(dict)を作成

• メインのGPUのみデバイス名を「main」にする必要あり

学習の実行

14

Page 15: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

メインのGPU?ChainerのMultiprocessParallelUpdaterにおけるData Parallelism

15

1iteration

シングルGPUの場合

Forward Backward Update

マルチGPUの場合

Forward Backward

Forward Backward

計算した勾配を全GPUで共有してモデル更新

Update

Page 16: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

メインのGPU?ChainerのMultiprocessParallelUpdaterにおけるData Parallelism

16

1iteration

シングルGPUの場合

Forward Backward Update

マルチGPUの場合

Forward Backward

Forward Backward

各GPUで計算した勾配をメインに集約

集約した勾配を使ってモデル更新

各GPUへ更新済みモデルパラメータを配布

※ ChainerMNとは、異なる計算モデルを使っているようです

Page 17: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

CHAINERのAPI

• chainer.datasets.split_dataset_n_random(dataset, n)

• 学習データのイテレータ作成時に使用

• データをランダムにGPU数分割

データの分割

17

Page 18: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

データ分割?各GPUへの分配

18

シングルGPUの場合 マルチGPUの場合

特に何もしないと、1epochで処理されるデータ量がGPU数倍に

Page 19: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

データ分割?各GPUへの分配

19

シングルGPUの場合 マルチGPUの場合各GPUで分担してトータルのデータ量を

統一

Page 20: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの修正を試みましょう

20

コンソールに戻ってください!

Page 21: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(答え; 1/2)

21

master_gpu_id=0.get_device_from_id(master_gpu_id).

train_iter=[chainer.iterators.SerialIterator(sub_train, args.batchsize) \for sub_train \in chainer.datasets.split_dataset_n_random(train, args.n_gpus)]

Page 22: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(答え; 2/2)

22

devices_list={'main': master_gpu_id}devices_list.update({'gpu{}'.format(i): i for i in range(1, args.n_gpus)})

updater=training.updaters.MultiprocessParallelUpdater(train_iter, optimizer, devices=devices_list)

device=0

Page 23: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUでの学習実行結果

23

Start a training script using single GPU.# Minibatch-size: 32# epoch: 3

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gzepoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 3.9784 2.32899 0.11788 0.117578 53.34992 3.33943 2.36698 0.117388 0.0957031 101.6163 2.44274 2.23894 0.183894 0.157422 149.873Throughput: 50.04068014993887 [images/sec.] (7500 / 149.87805876194034)Start a training script using multiple GPUs.# GPUs: 4# Minibatch-size: 32# epoch: 3

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gz{'main': 0, 'gpu1': 1, 'gpu2': 2, 'gpu3': 3}/home/tmp/dl_lecture/20180511_handson/app/pyenv/versions/3.6.0/lib/python3.6/site-packages/chainer/training/updaters/multiprocess_parallel_updater.py:148: UserWarning: optimizer.lr is changed to 0.0125 by MultiprocessParallelUpdater for new batch size.format(optimizer.lr))

epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 2.58079 33.0115 0.109375 0.112891 37.26562 2.73551 2.33485 0.11875 0.109375 51.93923 2.87886 2.35601 0.121711 0.10625 66.0055Throughput: 113.61732577778486 [images/sec.] (7500 / 66.0110590410186)

同条件で4GPU使うと113.6images/sec.と高速に

シングルGPUだと50.0images/sec.

Page 24: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUでの学習実行結果

24

Start a training script using single GPU.# Minibatch-size: 32# epoch: 3

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gzepoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 3.9784 2.32899 0.11788 0.117578 53.34992 3.33943 2.36698 0.117388 0.0957031 101.6163 2.44274 2.23894 0.183894 0.157422 149.873Throughput: 50.04068014993887 [images/sec.] (7500 / 149.87805876194034)Start a training script using multiple GPUs.# GPUs: 4# Minibatch-size: 32# epoch: 3

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gz{'main': 0, 'gpu1': 1, 'gpu2': 2, 'gpu3': 3}/home/tmp/dl_lecture/20180511_handson/app/pyenv/versions/3.6.0/lib/python3.6/site-packages/chainer/training/updaters/multiprocess_parallel_updater.py:148: UserWarning: optimizer.lr is changed to 0.0125 by MultiprocessParallelUpdater for new batch size.format(optimizer.lr))

epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 2.58079 33.0115 0.109375 0.112891 37.26562 2.73551 2.33485 0.11875 0.109375 51.93923 2.87886 2.35601 0.121711 0.10625 66.0055Throughput: 113.61732577778486 [images/sec.] (7500 / 66.0110590410186)

同条件で4GPU使うと113.6images/sec.と高速に

シングルGPUだと50.0images/sec.

4GPU使っているのにたった約2.3倍?

Page 25: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUによる高速化の詳細高速化のキモは?

25

time

シングルGPUの場合

F B U

マルチGPUの場合

F B U F B UPreProc.

例: 200 iter.

PreProc. F B U

F B C C

F B U

F B C C

F B U

F B C C

例: 100 iter.並列化によって総処理時間が短くなることを期待

Page 26: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUによる高速化の詳細高速化のキモは?

26

time

シングルGPUの場合

F B U

マルチGPUの場合

F B U F B UPreProc.

例: 20 iter.

PreProc. F B U

F B C C

F B U

F B C C

F B U

F B C C

例: 10 iter.繰り返し回数が

少ない間は並列化の効果が見えにくい

前処理のような共通して時間を要する箇所の比率が大きく

Page 27: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチGPUによる高速化の詳細

27

Start a training script using single GPU.# Minibatch-size: 32

# epoch: 50

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gzepoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 3.86343 13.6284 0.111946 0.130859 53.8101(中略)50 0.185783 2.09066 0.942708 0.472266 2423.78Throughput: 51.297360859528304 [images/sec.] (125000 / 2436.772533820942)Start a training script using multiple GPUs.# GPUs: 4# Minibatch-size: 32

# epoch: 50

Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gz{'main': 0, 'gpu1': 1, 'gpu2': 2, 'gpu3': 3}/home/tmp/dl_lecture/20180511_handson/app/pyenv/versions/3.6.0/lib/python3.6/site-packages/chainer/training/updaters/multiprocess_parallel_updater.py:148: UserWarning: optimizer.lr is changed to 0.0125 by MultiprocessParallelUpdater for new batch size.format(optimizer.lr))

epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 2.82759 45.4497 0.104687 0.144922 39.0766(中略)50 0.252575 3.72759 0.921053 0.260156 746.626Throughput: 164.73705493653375 [images/sec.] (125000 / 758.7849621820496)

50epoch回すと4GPUで164.7images/sec.の約3.2倍

シングルGPUの場合は50epochでも変化なし

Page 28: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

(OPTION)タスク#2: マルチノードでの学習

28

Page 29: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチノードで学習ジョブを流す

以下の作業を完了させる。

1. train_cifar_multi_node.pyに「PUT YOUR CODE」という箇所があるので、書き換えてプログラムを完成させる

2. スクリプトの修正完了したら実行

1. pjsub run_multi_node_training.sh

3. 結果を確認

簡単な例で、ジョブの流し方を把握する

29

Page 30: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

#!/bin/bash#PJM –L (pjsubコマンドの引数)#PJM –j (標準エラーを標準出力にまとめる)#PJM –X (環境変数引き継ぎ)

...

ジョブスクリプトマルチノード利用の条件指定

30

pjsubコマンドの引数には以下などを指定可能• rscunit サブシステム名• rscgrp リソースグループ名• elapse 最大実行時間• vnode 仮想ノード数• vnode-core ノードあたりの最大コア数2ノード指定の例) –L ”vnode=2”

講習会用のリソースグループは1ノードまでなので注意……

Page 31: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチノード向けジョブスクリプト軽い解説

使用ノード数を2に(講習会では指定不可)

CPUソケットごとに2プロセス、トータル8プロセス起動

31

ChainerMNを試してみたい方は……

• vnode=1

• mpirun –n 4としてください

Page 32: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(1/2)

32

MPIプロセス情報を参照してどのGPUを割り当てるか指定

元データは親相当のプロセスのみ

ロードするよう制御

各プロセスにデータを分配

Page 33: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(2/2)

33

マルチノード実行向けに最適化ロジックをラップ

マルチノード環境で適切に評価が動くようラップ

Page 34: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

CHAINERMNのAPI

• communicator.rank

• ワーカーID(プロセスID)を取得

• communicator.intra_rank

• ノード内のプロセスIDを取得

• ノード内2プロセスで、2ノード使用の場合の例

• ノード1: rank=0&intra_rank=0, rank=1&intra_rank=1

• ノード2: rank=2&intra_rank=0, rank=3&intra_rank=1

環境情報の取得

34

Page 35: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチノード実行時の状況GPUとプロセス: ノード内4プロセス、2ノードの例

35

ノード#0 ノード#1

Rank=0

Intra_rank=0

Rank=1

Intra_rank=1

Rank=2

Intra_rank=2

Rank=3

Intra_rank=3

Rank=4

Intra_rank=0

Rank=5

Intra_rank=1

Rank=6

Intra_rank=2

Rank=7

Intra_rank=3

Page 36: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

CHAINERMNでの分散ロジックAll-Reduceの利用

36

1iteration

シングルGPUの場合

Forward Backward Update

マルチGPUの場合

Forward Backward

Forward Backward

共有された勾配でGPUごとにモデル更新

Update

Update

All-ReduceによりGPU間で勾配を集約・共有

Page 37: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

CHAINERMNのAPI

• chainermn.scatter_dataset(dataset, comm, shuffle)

• データセットを分割して、各プロセスに配布

• chainermn.create_multi_node_optimizer(actual_optimizer, communicator)

• マルチノード環境で動作するよう、optimizerをラップ

• chainermn.create_multi_node_evaluator(actual_evaluator, communicator)

• マルチノード環境で動作するよう、evaluatorをラップ

分散学習用のAPI

37

Page 38: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの修正を試みましょう

38

コンソールに戻ってください!

Page 39: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(答え; 1/2)

39

device = comm.intra_rank

if comm.rank == 0: train=chainermn.scatter_dataset(train, comm, shuffle=True)

test=chainermn.scatter_dataset(test, comm, shuffle=True)

Page 40: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

スクリプトの変更箇所(答え; 2/2)

40

optimizer=chainermn.create_multi_node_optimizer(chainer.optimizers.MomentumSGD(0.05), comm)

evaluator=chainermn.create_multi_node_evaluator(evaluator, comm)

Page 41: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチノードでの学習実行結果

41

(前略)Start a training script using multiple nodes.==========================================Num process (COMM_WORLD): 8Using GPUsUsing non_cuda_aware communicatorNum Minibatch-size: 32Num epoch: 4==========================================Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gz[scb0038:92367] 7 more processes have sent help message help-mpi-btl-openib.txt / default subnet prefix[scb0038:92367] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messagesepoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 2.51613 3584.92 0.153125 0.128906 14.7621(中略)4 2.62698 2.35703 0.13125 0.105217 37.7453Throughput: 264.9120710495522 [images/sec.] (10000 / 37.74837424501311)(後略)

2ノードx4GPUでは264.9images/sec.

Page 42: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

マルチノードでの学習実行結果

42

(前略)Start a training script using multiple nodes.==========================================Num process (COMM_WORLD): 8Using GPUsUsing non_cuda_aware communicatorNum Minibatch-size: 32

Num epoch: 50==========================================Using CIFAR10 dataset: /home/tmp/dl_lecture/20180511_handson/data//cifar10_256px_5p.pickle.gz[scb0038:92367] 7 more processes have sent help message help-mpi-btl-openib.txt / default subnet prefix[scb0038:92367] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messagesepoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time1 2.74399 2348.71 0.11875 0.0895287 12.7662(中略)50 0.165634 2.69617 0.934375 0.354839 376.877Throughput: 331.66972621055066 [images/sec.] (125000 / 376.88094547600485)(後略)

50epoch回すと331.7images/sec.

シングルGPU(51.3img/s)に対して約6.5倍

Page 43: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

(FYI) 性能が思うように出ないときに

• 十分にGPUを使い切れているかどうかを確認する際、プロファイラが有効なことがある

• コマンドはnvprof

• 結果の可視化にはNVIDIA Visual Profilerを使う

• 実行するには対象コマンドcmdに対し、nvprof -o ${resultfile} cmdとすればOK

• オプション--profile-child-processesを追加すると子プロセスも追跡できる

• 子プロセスを追うときは、出力ファイル名に%pを含める(ファイル名にプロセスIDを含めるため)

プロファイラによる解析

43

Page 44: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

(FYI) 性能が思うように出ないときに

Nvprof -o ${filepath} cmd

--profile-child-processes

プロファイラによる解析

44

シングルGPUでの実行例

マルチGPUでの実行例

Page 45: ハンズオン#2: マルチ GPUを用いたディープラーニ …...山崎和博 ディープラーニングのためのGPU講習会-九州大学スーパーコンピュータシステムITOによる実習-ハンズオン#2:

www.nvidia.com/dli