More Related Content Similar to 20171128分散深層学習とChainerMNについて (20) More from Preferred Networks (20) 20171128分散深層学習とChainerMNについて2. 自己紹介
名前:鈴木脩司
経歴
-2015 東京工業大学 大学院情報理工学科 計算工学専攻
– バイオインフォマティクス、特に配列相同性検索の高速化について研究
2015-2017 株式会社富士通研究所
– クラウドの運用管理について研究
2017- 株式会社Preferred Networks
– Researcherとして、バイオヘルスケア分野、ChainerMNの研究開発
ちなみに、2011-2012の間、アルバイトとしてFixstarsでGPU等のアクセラレータ
を使った高速化をやってました
2
3. 会社紹介:Preferred Networks, Inc. (PFN)
設立: 2014/3月(Preferred Infrastructureからの分社)
– 出資者: NTT (2014), Fanuc (2015), TOYOTA (2015)
本社: 東京都千代田区大手町
支社:カルフォルニア、サンマテオ
従業員数: 約110名(殆どがEngineers & Researchers)
事業内容: Internet of Thing + 機械学習
– 交通
– 製造業
– バイオヘルスケア
3
20. ChainerMN
Chainer の追加パッケージ
分散深層学習に必要な機能を追加
特徴
高速 NVIDIA NCCL, CUDA-Aware MPI 等の最新技術の活用により高い性能を実現
柔軟 Chainer の柔軟性を損なわず、動的なネットワークですら分散学習可能
簡単 既存のコードを少し変更すれば利用可能
20
21. ChainerMN
ChainerMN は MPI を利用、SPMD で動作
SPMD = single program, multiple data; 全プロセスは同じスクリプトで動作する
1 プロセス (ワーカー)で1 GPU
sakura1
train_imagenet.py (GPU0)
train_imagenet.py (GPU1)
train_imagenet.py (GPU2)
train_imagenet.py (GPU3)
sakura2
train_imagenet.py (GPU0)
train_imagenet.py (GPU1)
train_imagenet.py (GPU2)
train_imagenet.py (GPU3)
$ mpiexec -n 8 -host sakura1,sakura2 python train_imagenet.py
21
30. ChainerMNに必要なライブラリ (GPUを利用する場合)
1. Chainer
– CuPyとcuDNN も含めてインストールする
2. MPI (OpenMPIなど)
– CUDA-Awareのサポートを入れてコンパイルする
3. NCCL
– githubにあるものはバージョンが古いので、NVIDIAのサイトからダウンロード
4. MPI4py
5. Cython
– 事前にpipなどでインストールする必要がある
30
CPUのみの場合は以下を参照
http://chainermn.readthedocs.io/en/latest/installation/guide.html
31. ChainerMNのインストールとサンプル実行(GPUを利用する場合)
インストール方法
– $ pip install chainermn
MNISTのサンプルの実行
– $ git clone git@github.com:chainer/chainermn.git
– $ cd chainermn
– $ mpiexec -n 4 python examples/mnist/train_mnist.py –g
この例では1つのノードで4つのワーカーが起動して、4つのGPUを使って分散学
習が実行される
31
32. あれ、動かない?と思ったら・・・
ChainerMNドキュメントのStep-by-Step Troubleshootingを見る!
– http://chainermn.readthedocs.io/en/latest/installation/troubleshooti
ng.html
Step-by-Step TroubleshootingはChainerMNを使うときにハマりそう
な部分を、1つ1つ問題がないか確認していく手順が書かれている
– たとえば・・・
Check SSH connection
32
$ ssh host00 'hostname'
host00 # without hitting the password
$ ssh host01 'hostname'
host01 # without hitting the password
...
34. 1. Communicatorの作成と使用するGPUの指定
Communicatorの作成
– 高い並列性能を実現するためには計算機環境に合わせてCommunicatorを
選択する必要がある。詳しくは以下を参照
https://chainermn.readthedocs.io/en/latest/reference/index.html#communicators
プロセスが使用するGPUを指定
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
34
# args.gpu: 使用するGPUのID
chainer.cuda.get_device(args.gpu).use()
# comm.intra_rank:マシン内におけるワーカーの番号
device = comm.intra_rank
chainer.cuda.get_device(device).use()
comm = chainermn.create_communicator()
37. 4. マルチノード用のEvaluatorの作成
マルチノード用のEvaluatorを以下のように作成
– ChainerのMNISTのサンプル:
– ChainerMNのMNISTのサンプル:
– 注意
PrintReportなどのExtensionは1つのワーカーだけ実行するようする
37
trainer.extend(extensions.Evaluator(test_iter, model, device=args.gpu))
evaluator = extensions.Evaluator(test_iter, model, device=device)
evaluator = chainermn.create_multi_node_evaluator(evaluator, comm)
trainer.extend(evaluator)
38. 実行!
シングルノード実行
– $ mpiexec -n 4 python train_mnist.py –g
1つのノードで4つのワーカーを立ち上げ、4個のGPUを使って分散学習を行う
マルチノード実行
– $ mpiexec -n 8 -host host00,host01 python train_mnist.py –g
host00,host01 という2つのノードで、4つずつワーカーが立ち上げ、
合計8個のGPUを使って分散学習を行う
38
46. NVPROFを使ったプロファイルの取り方
CUDA関係用のプロファイラ
– 参考: http://docs.nvidia.com/cuda/profiler-users-guide/index.html#prepare-
application
コードを変更しなくても以下のように実行するだけでプロファイルが取れる
– $ mpiexec -n 2 nvprof -o ‘%h-%p.nvprof’ python
examples/mnist/train_mnist.py –g
プロファイル結果はGUIのNVVPで見ると細かいところも見れてわかりやすいの
でおすすめ
– 参考: https://developer.nvidia.com/nvidia-visual-profiler
– ただし、ChainerMNのプロファイル結果は重いことが多いので、数イテレーションで
止まるようにしたり、以下を参考にして、大きいファイルも読み込めるようにすると
良い
http://docs.nvidia.com/cuda/profiler-users-guide/index.html#large-data
46
48. ImageNetの学習で最近注目な手法
Goyal, P et al. (2017). Accurate, Large Minibatch SGD: Training
ImageNet in 1 Hour.
– http://arxiv.org/abs/1706.02677
Smith, S. L. et al. (2017). Don’t Decay the Learning Rate, Increase the
Batch Size.
– https://arxiv.org/abs/1711.00489
48
49. Goyal, P et al. (2017). Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
以下の手法により、精度を落とさずにバッチサイズを大きくすることに成功し、
256GPUを使って1時間でImageNetの学習を完了
学習率のLinear Scaling Rule
– バッチサイズを𝑘倍したら、それに合わせて学習率𝜂を𝑘倍する
Gradual warmup
– 学習のスタートは学習率を𝜂に設定し、各イテレーション毎に徐々に大きくし、
5epochのところで学習率を𝑘𝜂になるように調整
49
50. Smith, S. L. et al. (2017). Don’t Decay the Learning Rate, Increase the Batch Size.
良く使われるDecaying learning rateの代わりに、バッチサイズを大きくする
50