Más contenido relacionado
La actualidad más candente (20)
Similar a 20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説 (20)
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
- 2. Contents
1. イントロダクション
2. Deep Learningにおける分散学習
3. Tensorflowで分散学習 Part1 (Distributed Tensorflow)
4. Tensorflowで分散学習 Part2 (Horovod)
5. チュートリアル:実際にHorovodを実行してみよう
6. まとめ
7. あとがき 分散学習の世界へようこそ
- 4. LeapMind Inc. © 2018
自己紹介
LeapMind Inc.
Infrastructure Division
増田 英晃 Hideaki MASUDA
大手SIerにて大規模システムの方式基盤系SEとして従事後、
LeapMindにジョイン。
組込みDeep Learningモデル構築ソリューション「DeLTA-Lite」の開発や
社内のDeep Learning研究環境の構築を担当。
学習性能改善、運用効率化のために分散学習基盤の導入や
ボトルネック分析などもしています。
- 5. LeapMind Inc. © 2018
本日のゴール
Horovod
を利用した分散学習を
自身のTensorflowの学習コードに対して
実装できるようになってもらう
- 7. LeapMind Inc. © 2018
Deep Learningをやっていてよくある悩み
仮説 実験 結果
仮説
(更新)
実験
(再)
の繰り返し
実験(学習)待ちが多い
学習早く終わらないかなー
- 8. LeapMind Inc. © 2018
学習を早くするには?
注:ここではGPU性能のみに言及していますが
実際はGPUではない部分がボトルネックになっていて
プログラミングの仕方次第で改善の余地がある場合が多いです(後述)
今回は分散学習の紹介のため問題を単純化しています
スケールアウト
複数のGPUを使う
スケールアップ
GPUを
良いものに変える
単一GPUには限界がある!
どうやったら複数GPUで
学習ができるのだろうか?
1
2
- 9. LeapMind Inc. © 2018
分散学習の手法について
Data parallel vs Model parallel
Model parallelはモデルの各パートにおいてどのデバイスで計算させるかを
決定しなければならないため、モデル構成への依存度や実装難易度が高い
Data parallelの方がシンプル に実装できる
Data parallel : Split data per worker Model parallel : Split model per worker
- 10. LeapMind Inc. © 2018
分散学習の手法について
asyncの方がスループット(step/sec)では有利
しかし、モデルの更新が非同期に行われるため、古いパラメータでの学習結果でモデルの更新
が行われ、精度が劣化する場合がある(Gradient Staleness)
Parameter
Server
sync : 各プロセスは指定されたタイミングで同期をとる
モデルの状態は常に全プロセスで等しい
async : 各プロセスは非同期にモデルを更新、取得する
プロセス間でモデルの状態に世代のズレが生じる
Pull and Push
parameters
Sync
parameters
同期型(sync) vs 非同期型(async)
- 13. LeapMind Inc. © 2018
Deep Learningにおける分散学習
本日紹介するHorovodは
Data parallel + 同期型(sync)
精度影響が少なく
学習を高速化できる
- 14. LeapMind Inc. © 2018
Deep Learningにおける分散学習
分散手法をシンプルにすることで
実装を簡素にでき
実験の考察もしやすい
- 15. LeapMind Inc. © 2018
どのぐらい高速化できるの?
分散数をNとした場合の性能向上率Sはアムダールの法則より
S(N) = 1/((1-P) + P/N)
と表せる、ここでPは並列化できない処理の割合を表していて
P=0のときS=1で最大、つまりN個に分散した場合、学習時間が1/Nになる
上記をみるにS=0.8〜0.9以上であるため、特に数〜数十程度の分散学習では
十分にP(並列化できない処理)を少なくすることが現実的であり
分散数Nのとき学習時間を約1/Nにできる
https://github.com/uber/horovod/blob/master/README.md
- 17. LeapMind Inc. © 2018
What is Distributed Tensorflow
Tensorflow公式の分散処理機能
Master/Worker/Parameter Server構造
各計算グラフ、変数ごとに処理するノードやデバイス(cpu/gpu)を指定可能
Data Parallel/Model Parallel、同期/非同期処理にも対応し、実装の柔軟性が高い
Fault tolerance機能などもあり、機能ではなく分散基盤と言った方が正しそう
https://cloudplatform-jp.googleblog.com/2017/09/distributed-TensorFlow-and-the-hidden-layers-of-engineering-work.html
- 18. LeapMind Inc. © 2018
Getting Started - Distributed Tensorflow!
Getting Started - Distributed Tensorflow
1. “Create a tf.train.ClusterSpec that describes all of the tasks in the cluster. This should be the same for each task.”
tf.train.ClusterSpecにクラスター構成を記載しましょう
2. “Create a tf.train.Server, passing the tf.train.ClusterSpec to the constructor, and identifying the local task with a job
name and task index.”
tf.train.Serverにjob名とタスク番号を付与しましょう
3. “Specifying distributed devices in your model”
モデル定義にtf.deviceを利用してどのノード(jobとtask)のどのデバイス(CPU or GPU)で計
算を行うか計算グラフ毎に決めて記述しましょう
・
・
・
新用語達(“Client, Cluster, Job, Master service, Task, Tensorflow Server, Worker service”)
https://www.tensorflow.org/deploy/distributed
...学習コスト高め
- 20. LeapMind Inc. © 2018
What is Horovod
Uberが開発しているOSSの分散学習用フレームワーク
Tensorflow, Keras, Pytorchに対応
https://github.com/uber/horovod
- 21. LeapMind Inc. © 2018
Horovodプロジェクトの目的
単一GPUで動く(Tensorflowの)プログラムを利用し、なるべく
簡単に複数GPUでの
高速な分散学習を
実現できるようにすること
上記の目的を実現するための2つの指標
どれだけ早く学習できるか
プログラムを
どれだけ変更する必要があるか
学習実行の簡単さ
- 22. LeapMind Inc. © 2018
なんでHorovod?
簡単に実装できる
既存コードに下記を追加するだけ
1. Horovod初期化
2. GPU指定(1プロセスに1GPU)
3. Learning Rateを分散数でスケール
4. optimizerをオーバーライド
5. 学習前のGlobal VariablesのSync設定
6. checkpointを特定ノードのみ保存するように設定
https://github.com/uber/horovod/blob/master/README.md
- 23. LeapMind Inc. © 2018
Distributed Tensorflow
事前準備
分散数や使用するサーバの構成に応
じてClusterやtask,jobを都度定義
Horovod
事前準備
MPIとNCCLをインストール
(作業は一度のみ)
実行
各ノードで定義に従ったコマンドを各プ
ロセス毎に実行(例はasync)
# On ps0.example.com:
$ python trainer.py
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222
--job_name=ps --task_index=0
# On ps1.example.com:
$ python trainer.py
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222
--job_name=ps --task_index=1
# On worker0.example.com:
$ python trainer.py
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222
--job_name=worker --task_index=0
# On worker1.example.com:
$ python trainer.py
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222
--job_name=worker --task_index=1
実行
MPIがインストール済みの適当なノー
ドからコマンドを実行
$ mpirun -np 16
-H server1:4,server2:4,server3:4,server4:4
[some mpi options...]
python train.py
実行時に分散対象のノードと
プロセス数を指定できる
なんでHorovod?
簡単に実行できる
- 24. LeapMind Inc. © 2018
https://github.com/uber/horovod/tree/v0.12.1
なんでHorovod?
学習が早い
スケールしても効率が落ちにくい
- 25. LeapMind Inc. © 2018
Horovodの分散学習手法
Data parallel + 同期型(sync)
同一モデル x 別データで計算された勾配のみを同期、
全ワーカーの平均でモデルを更新
https://eng.uber.com/horovod/
- 26. LeapMind Inc. © 2018
Data parallel + 同期型(sync)
学習率をワーカー数に応じてスケールさせる
学習率をバッチサイズ(全ワーカーの合計)に比例してスケールさせると
精度を落とさずにに大きいバッチサイズでのトレーニングが可能
(256GPUでImageNetを1hourで学習)
Goyal, P et al. (2017). Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour (Facebook)
Horovodの分散学習手法
- 27. LeapMind Inc. © 2018
ImageNet学習世界最速のChainerMNを利用した学習でも同様に
学習率をワーカー数に比例してスケールさせている
GoyalのTesla P100 256GPUで1hourに対して1024GPUで15minutesを達成
RMSPropからmomentum SGDに徐々に切り替える手法を使用
Akiba, T et al. (2017). Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes (Preferred Networks)
Data parallel + 同期型(sync)
学習率をワーカー数に応じてスケールさせる
Horovodの分散学習手法
- 28. LeapMind Inc. © 2018
MPIをプロセス間通信に利用した
SPMD構成(Single Program Multiple Data)
全ワーカーは同一スクリプトで動き、個々の役割を意識しなくてよい
各ワーカーにはrank(一意のプロセス番号)が付与される
rankによるif分岐等でのみ指定ワーカーへの別処理を記述可能(モデル保存とか)
serverA
serverB
Interconnect
(Infiniband,Ethernet)
serverA or B or ….
$ mpirun -np 4
-H serverA:2.serverB:2
python train.py
python train.py (rank:0)
python train.py (rank:1)
python train.py (rank:2)
python train.py (rank:3)
Interconnect
(NVLINK,PCI-E)
Interconnect
(NVLINK,PCI-E)
Horovodのアーキテクチャ
- 29. LeapMind Inc. © 2018
設計がシンプル、分かりやすい
必要最低限の機能のみ
Horovodの強み
hvd.init() 初期化関数
hvd.size() プロセス数の合計を取得する関数
hvd.local_size() ノード内のプロセス数の合計を取得する関数
hvd.rank() プロセス番号(一意)を取得する関数
hvd.local_rank() プロセス番号(ノード内で一意)を取得する関数
hvd.broadcast_global_variables(root_rank)
tf.global_variables()で取得したオブジェクトをroot_rankで指定したプ
ロセスの値で全プロセスに対して上書き(broadcast)する関数
hvd.BroadcastGlobalVariablesHook
(tf.train.SessionRunHook)
broadcast_global_variables()を学習開始の初回のみ実行する
SessionRunHookクラス
DistributedOptimizer(tf.train.Optimizer)
optimizerのcompute_gradientsをオーバーライドしてallreduce処理
を追加するOptimizerクラス
シンプルゆえに自由度は少なめ。必要があれば、
mpi4py等の異なるMPIライブラリに対応しているため、独自処理も記述可能。
- 30. LeapMind Inc. © 2018
高速化への取り組み
Ring-all-reduce by NCCL v2
NCCL v2に対応しており、all-reduce処理に
Ring-all-reduceアルゴリズムを採用し通信を最適化して高速化を図っている
リング状の1方向通信+各ノードでの並列計算でall-reduceを実現
https://eng.uber.com/horovod/
Horovodの強み
- 31. LeapMind Inc. © 2018
高速化への取り組み
Tensor Fusion
複数のTensorオブジェクトをまとめて1回の
Ring-all-reduce処理に与えられるようにする仕組み
Tensor単位でRing-all-reduceを実行する場合
Tensorのサイズが大きくないと、一回の通信量が減ってしまい
効率が悪くなってしまう
上記を改善するために複数のTensorをFusion Bufferに格納し
それに対してRing-all-reduce処理を行うようにしている
Fusion Bufferのサイズは環境に応じて下記の変数でチューニング可能
環境変数:HOROVOD_FUSION_THRESHOLD(デフォルト64MB)
Horovodの強み
- 32. LeapMind Inc. © 2018
性能の分析(処理の可視化)ができる
JSON形式で処理のタイムラインを出力可能
chrome://tracingで読み込んで可視化できる
Horovodの強み
https://github.com/uber/horovod/blob/master/README.md
- 34. LeapMind Inc. © 2018
複数ノード
複数GPU
STEP 2
チュートリアルの前提条件
準備や性能改善の難易度は単一ノードでの実行のほうが簡単であるため
今回は単一ノードでの実行を前提として進めます
単一ノードでも例えばAWSのp3.16xlargeなどの8GPUを搭載したマシンを
利用して、学習を8倍近く高速にできる可能性があります
単一ノード
複数GPU
STEP 1
分散学習の実行環境は難易度的に大きく下記の2ステップに分かれます
- 35. LeapMind Inc. © 2018
チュートリアルの前提条件
また、今回は環境構築にDockerを利用し
GPU利用のためにnvidia-docker(v2)をインストールしています
上記の環境であれば、docker buildするだけですぐにhorovodを利用できます
変更元となる学習用コードは
Tensorflow tutorialのDeep MNIST for Expertsより
mnist_deep.py*をそのまま利用します
* : https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/examples/tutorials/mnist/mnist_deep.py
- 36. LeapMind Inc. © 2018
チュートリアル
tensorflow/examples/tutorials/mnist/mnist_deep.py
- 38. LeapMind Inc. © 2018
6. まとめ
Deep Learningの分散学習について
日本語での情報が少なく
特にTensorflowを利用した分散学習についての情報は
あまり見つけられないのが現状です
今回の発表が、皆さんが分散学習を実装する際の
足がかりになれば幸いです
- 41. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
ここでは補足的に分散学習を実装する際に遭遇する
課題や疑問
について少し話そうと思います
- 42. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
GPU使用率を確認する
処理を可視化してボトルネックを確認する
GPU使用率をあげるためにはCPU処理やI/O処理を
キューや並列化を使って隠ぺいする必要があります
これだけでだいぶ早くなります
単純にバッチサイズを大きくすることでも
GPU処理の割合を増やせます
並列化しても早くならないなー
- 43. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
学習率上げるだけで早くなってた
なんてことも
特に導入した初めの頃は
到達精度も含めきちんと
単一GPUでの場合との比較
を実施した方が良いです
並列化したら早くなった!と思ったら
!
- 44. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
データセットを各ワーカー数で分割して配置した場合
データの偏りをなくすために
1epoch毎にシャッフル&配置し直すべき
しかし、実装上
horovodにそのような機能はない
データ数がバッチサイズに対して十分に大きければ
一部データが重複する可能性に目をつぶって
全ワーカーに全データ置いてしまうという手もあるが...
データセットを
各ワーカーにどう配置すべきか
- 45. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
分散学習の実装は日々進歩していて
いくつもの手法が実験されています
構成がシンプル + 精度劣化が少ない
という実験結果がある
という状態なので、今後は分かりません
NVIDIAのDGX-2では
16GPUを高速なインターコネクトで接続することで
1つのGPUとして使用できる(Model Parallel的に使う)ように
設計されており
巨大なモデルに対する学習ニーズもあったりします
DataParallel + syncが最強なの?
?
- 46. LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
Horovodが最強なの?
!
ChainerMN Horovod
Distributed Tensorflow
ImageNetで最速を叩き出しています
新機能や手法をどんどん出しており
より柔軟かつ先進的です
構成はChainerMNと近いため
比較的同程度の結果が出せると
期待できます
汎用的であるがゆえに今回のような分散手法では性能を出しにくいですが
Model Parallel等では力を発揮しそうです
柔軟性があるため新しい手法を試すのがよさそうです
- 47. LeapMind Inc. © 2018 47
ご清聴ありがとうございました
masuda@leapmimd.io
http://leapmind.io/