第1回
ディープラーニング分散学習ハッカソン<ChainerMN紹介 + スパコンでの実⾏⽅法>
チューター
福⽥圭祐（PFN）
鈴⽊脩司（PFN）

https://chainer.org/2

Chainer:A Flexible Deep Learning Framework
Define-by-Run

Define-and-Run
DefineModeldefinition

Define‐by‐Run
Computational
graph

Ca

Gradient
functionModeldefinition

Training
data

Run
Training
data

Computational
graph

Caffe2, TensorFlow etc.

Computational
graph

Gradient
function

Gradient
function

3

PyTorch, TensorFlow(Eager Execution) etc.

ChainerMN: Distributed Training withChainer••Bundled with Chainer (from Chainer v5)
Enables multi-node distributed deep learning using NVIDIA NCCL2Features• Scalable: Near-linear scaling with hundreds of GPUs
• Flexible: Even GANs, dynamic NNs, and RL are applicable

Distributed Training with ChainerMN
ForwardBackward

ForwardBackward

ForwardBackward

4Optimize
AllReduce

Optimize
Optimize

CHAINER活⽤事例

Achievement on MN-1a: ImageNet in 15 minutes
Training time of ResNet-50 (90 epochs) on ImageNet
70

Time [min]6050
40

arXiv: 1711.04325
Extremely Large Minibatch SGD: Training ResNet-50
on ImageNet in 15 Minutes

30202017 Nov
2018 July100112018 Nov 2018 NovAchievement on MN-1b: PFDet in OIC 201812

Achievement on MN-1b: PFDet in OIC 2018••

Google AI Open Images - Object Detection Track– Competition using Largest-class image dataset– 12 million bounding boxes, 1.7 million images– 454 competitiors– Approx. 500GB (annotated subset)
Object detection: much harder than object recognition task

13

Achievement on MN-1b: PFDet in OIC 2018
• We won the 2nd position (0.023% diff to the 1st)

14

Opensourcing PFDet:

Technical report is already on arXiv:
arXiv:1809.00778

PFNの計算環境

MN-1: An in-house supercomputer

MN-1a (Sep. ʻ17~)━ 1024 NVIDIA Tesla P100
━ InfiniBand FDR━ Peak 9.3 Peta FLOPS (SP)━ #227 in Top500 Nov. 2018

MN-1b (July. ʻ18~)━ 512 NVIDIA Tesla V100 32GB
━ InfiniBand EDR━ Peak 56 Peta (tensor) Flops



Targeting Exa FL ops by 2020

17

CHAINERプログラムを秒速でMN化する⼿順

ChainerMNの動作の概要•

ChainerMNは、MPIという通信ライブラリの上に構築されています– （MPI＝並列計算で標準的に使われる通信ライブラリ）•

要点– mpiexecというコマンドで起動する（後述）– 基本的に、サーバー／クライアントという概念はない（全プロセスが互いに対等）– 個々のプロセスはRankというプロセス番号を持つ（0〜N-1）– すべてのプロセスが同じプログラムを実⾏する（ただし、Rankによって条件分岐することが可能）
19

device = …
chainer.cuda.get_device_from_id(device).use()…
optimizer = chainer.optimizers.Adam()

これだけの変更で（最⼩限の）MN化︕
import chainermn…
comm = chainermn.create_communicator('pure_nccl')
device = comm.intra_rank
chainer.cuda.get_device_from_id(device).use()…
optimizer = chainermn.create_multi_node_optimizer(chainer.optimizers.Adam(), comm)…
if comm.rank == 0: # LogReportなどを代表一人だけが出力するようにする
trainer.extend( … )20

MN化のその後• まずは秒速MN化でReedbush上で動作確認をしましょう• その後やること︓– scatter_dataset（プロセス間で学習データに重複が無いように分割）– evaluatorの並列化（現在はrank 0だけのevaluationの結果が記録される）– Multi node BN （必要に応じて）21

普段、どうやって学習を実⾏していますか︖（フレームワークによらず）

1. 研究室／⾃社クラスタ
2. クラウド（AWS etc.）
3. スパコン22

ReedbushスパコンにおけるChainerの使い⽅•

スパコンは、普通の計算機と環境が（すこし）違います

•

主な違い︓
– 計算機の種類が、計算ノードとログインノードに分かれている– 計算実⾏するために、ジョブスケジューラと呼ばれるソフトウェアを使う必要がある– 計算ノードからは、インターネット環境にアクセスできない– 計算ノードからは、HOME も⾒えない23

ReedbushスパコンにおけるChainerの使い⽅•

スパコンは、普通の計算機と環境が（すこし）違います

•

主な違い︓
– 計算機の種類が、計算ノードとログインノードに分かれている– 計算実⾏するために、ジョブスケジューラと呼ばれるソフトウェアを使う必要がある– 計算ノードからは、インターネット環境にアクセスできない– 計算ノードからは、HOME も⾒えない24

ReedbushスパコンにおけるChainerの使い⽅•

なので… 以下のことを実⾏しておく必要があります– インターネットからダウンロードの必要があるものは、あらかじめログインノード上でダウンロードしておく– Lustreという共有ファイルシステムを事実上のHOMEとして使う– PythonモジュールもLustre上にインストールする– 環境変数に気をつける（non-interactive環境になるため）– ジョブスクリプトと呼ばれるものを書く必要がある

25

ReedbushスパコンにおけるChainerの使い⽅
使い⽅説明︓

https://bit.ly/2MsNzuA
26

ReedbushスパコンにおけるChainerの使い⽅

27

ReedbushスパコンにおけるChainerの使い⽅

id –ng コマンドでグループ名$USER 環境変数（あるいは id –nu コマンド)でユーザー名がわかる
28

ReedbushスパコンにおけるChainerの使い⽅

好きなエディタで env.sh の内容を作成して、/lustre/$(id –ng)/$USER/env.sh として保存しましょう（完全コピペでOK）
29

ReedbushスパコンにおけるChainerの使い⽅

30

ReedbushスパコンにおけるChainerの使い⽅

cupy ではなく、 cupy‐cuda91 を使いましょう
きちんとバージョンを指定しましょう31

ReedbushスパコンにおけるChainerの使い⽅

32

ReedbushスパコンにおけるChainerの使い⽅

33

34

ジョブを投げるたびに調整するところ必要がなければ触らない

35

あなたのプログラム

ReedbushスパコンにおけるChainerの使い⽅#PBS –l select=2:mpiprocs=2:ompthreads=1
ノード数＝２→

ノードあたりのGPU数＝２

２ｘ２＝４GPUで実⾏• 「ノードあたりのGPU数」は増やせないので２で固定がおすすめ• 「ノード数」を変更することで、全体のGPU数を調整• 開発・デバッグ中は「１ｘ２」もしくは「２ｘ２」くらいがおすすめ
36

ReedbushスパコンにおけるChainerの使い⽅
おまじない

mpiexec –x PYTHONUSERBASE ¥python ./train_mnist.py –g ‐‐communicator pure_nccl
引数はスクリプトの書き⽅によるが、コミュニケーターは pure_nccl がおすすめ（というか、プログラムに書いてしまっても良い）3738