SlideShare una empresa de Scribd logo
1 de 47
Descargar para leer sin conexión
LeapMind Inc.
Infrastructure Division Leader
Hideaki Masuda
Tensorflow分散学習
Horovodによる分散学習の実装方法と解説
Contents
1. イントロダクション
2. Deep Learningにおける分散学習
3. Tensorflowで分散学習 Part1 (Distributed Tensorflow)
4. Tensorflowで分散学習 Part2 (Horovod)
5. チュートリアル:実際にHorovodを実行してみよう
6. まとめ
7. あとがき 分散学習の世界へようこそ
1. イントロダクション
LeapMind Inc. © 2018
自己紹介
LeapMind Inc.
Infrastructure Division
増田 英晃 Hideaki MASUDA
大手SIerにて大規模システムの方式基盤系SEとして従事後、
LeapMindにジョイン。
組込みDeep Learningモデル構築ソリューション「DeLTA-Lite」の開発や
社内のDeep Learning研究環境の構築を担当。
学習性能改善、運用効率化のために分散学習基盤の導入や
ボトルネック分析などもしています。
LeapMind Inc. © 2018
本日のゴール
Horovod
を利用した分散学習を
自身のTensorflowの学習コードに対して
実装できるようになってもらう
2. Deep Learningにおける分散学習
LeapMind Inc. © 2018
Deep Learningをやっていてよくある悩み
仮説 実験 結果
仮説
(更新)
実験
(再)
の繰り返し
実験(学習)待ちが多い
学習早く終わらないかなー
LeapMind Inc. © 2018
学習を早くするには?
注:ここではGPU性能のみに言及していますが
実際はGPUではない部分がボトルネックになっていて
プログラミングの仕方次第で改善の余地がある場合が多いです(後述)
今回は分散学習の紹介のため問題を単純化しています
スケールアウト
複数のGPUを使う
スケールアップ
GPUを
良いものに変える
単一GPUには限界がある!
どうやったら複数GPUで
学習ができるのだろうか?
1
2
LeapMind Inc. © 2018
分散学習の手法について
Data parallel vs Model parallel
Model parallelはモデルの各パートにおいてどのデバイスで計算させるかを
決定しなければならないため、モデル構成への依存度や実装難易度が高い
Data parallelの方がシンプル に実装できる
Data parallel : Split data per worker Model parallel : Split model per worker
LeapMind Inc. © 2018
分散学習の手法について
asyncの方がスループット(step/sec)では有利
しかし、モデルの更新が非同期に行われるため、古いパラメータでの学習結果でモデルの更新
が行われ、精度が劣化する場合がある(Gradient Staleness)
Parameter
Server
sync : 各プロセスは指定されたタイミングで同期をとる
モデルの状態は常に全プロセスで等しい
async : 各プロセスは非同期にモデルを更新、取得する
プロセス間でモデルの状態に世代のズレが生じる
Pull and Push
parameters
Sync
parameters
同期型(sync) vs 非同期型(async)
LeapMind Inc. © 2018
分散学習を導入する目的
精度の高いモデル
を
より短い学習時間
で手に入れたい
LeapMind Inc. © 2018
Deep Learningにおける分散学習
スループットがよくても精度が出なければ
本末転倒である
LeapMind Inc. © 2018
Deep Learningにおける分散学習
本日紹介するHorovodは
Data parallel + 同期型(sync)
精度影響が少なく
学習を高速化できる
LeapMind Inc. © 2018
Deep Learningにおける分散学習
分散手法をシンプルにすることで
実装を簡素にでき
実験の考察もしやすい
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
3. Tensorflowで分散学習 Part1
(Distributed Tensorflow)
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
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
...学習コスト高め
4. Tensorflowで分散学習 Part2
(Horovod)
LeapMind Inc. © 2018
What is Horovod
Uberが開発しているOSSの分散学習用フレームワーク
Tensorflow, Keras, Pytorchに対応
https://github.com/uber/horovod
LeapMind Inc. © 2018
Horovodプロジェクトの目的
単一GPUで動く(Tensorflowの)プログラムを利用し、なるべく
簡単に複数GPUでの
高速な分散学習を
実現できるようにすること
上記の目的を実現するための2つの指標
どれだけ早く学習できるか
プログラムを
どれだけ変更する必要があるか
学習実行の簡単さ
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
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?
簡単に実行できる
LeapMind Inc. © 2018
https://github.com/uber/horovod/tree/v0.12.1
なんでHorovod?
学習が早い
スケールしても効率が落ちにくい
LeapMind Inc. © 2018
Horovodの分散学習手法
Data parallel + 同期型(sync)
同一モデル x 別データで計算された勾配のみを同期、
全ワーカーの平均でモデルを更新
https://eng.uber.com/horovod/
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の分散学習手法
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の分散学習手法
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のアーキテクチャ
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ライブラリに対応しているため、独自処理も記述可能。
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の強み
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の強み
LeapMind Inc. © 2018
性能の分析(処理の可視化)ができる
JSON形式で処理のタイムラインを出力可能
chrome://tracingで読み込んで可視化できる
Horovodの強み
https://github.com/uber/horovod/blob/master/README.md
5. チュートリアル
実際にHorovodを実行してみよう
LeapMind Inc. © 2018
複数ノード
複数GPU
STEP 2
チュートリアルの前提条件
準備や性能改善の難易度は単一ノードでの実行のほうが簡単であるため
今回は単一ノードでの実行を前提として進めます
単一ノードでも例えばAWSのp3.16xlargeなどの8GPUを搭載したマシンを
利用して、学習を8倍近く高速にできる可能性があります
単一ノード
複数GPU
STEP 1
分散学習の実行環境は難易度的に大きく下記の2ステップに分かれます
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
LeapMind Inc. © 2018
チュートリアル
tensorflow/examples/tutorials/mnist/mnist_deep.py
6. まとめ
LeapMind Inc. © 2018
6. まとめ
Deep Learningの分散学習について
日本語での情報が少なく
特にTensorflowを利用した分散学習についての情報は
あまり見つけられないのが現状です
今回の発表が、皆さんが分散学習を実装する際の
足がかりになれば幸いです
LeapMind Inc. © 2018
6. まとめ
ぜひHorovodを利用して
分散学習を
体験してみてください!
7. あとがき
分散学習の世界へようこそ
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
ここでは補足的に分散学習を実装する際に遭遇する
課題や疑問
について少し話そうと思います
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
GPU使用率を確認する
処理を可視化してボトルネックを確認する
GPU使用率をあげるためにはCPU処理やI/O処理を
キューや並列化を使って隠ぺいする必要があります
これだけでだいぶ早くなります
単純にバッチサイズを大きくすることでも
GPU処理の割合を増やせます
並列化しても早くならないなー
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
学習率上げるだけで早くなってた
なんてことも
特に導入した初めの頃は
到達精度も含めきちんと
単一GPUでの場合との比較
を実施した方が良いです
並列化したら早くなった!と思ったら
!
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
データセットを各ワーカー数で分割して配置した場合
データの偏りをなくすために
1epoch毎にシャッフル&配置し直すべき
しかし、実装上
horovodにそのような機能はない
データ数がバッチサイズに対して十分に大きければ
一部データが重複する可能性に目をつぶって
全ワーカーに全データ置いてしまうという手もあるが...
データセットを
各ワーカーにどう配置すべきか
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
分散学習の実装は日々進歩していて
いくつもの手法が実験されています
構成がシンプル + 精度劣化が少ない
という実験結果がある
という状態なので、今後は分かりません
NVIDIAのDGX-2では
16GPUを高速なインターコネクトで接続することで
1つのGPUとして使用できる(Model Parallel的に使う)ように
設計されており
巨大なモデルに対する学習ニーズもあったりします
DataParallel + syncが最強なの?
?
LeapMind Inc. © 2018
あとがき 分散学習の世界へようこそ
Horovodが最強なの?
!
ChainerMN Horovod
Distributed Tensorflow
ImageNetで最速を叩き出しています
新機能や手法をどんどん出しており
より柔軟かつ先進的です
構成はChainerMNと近いため
比較的同程度の結果が出せると
期待できます
汎用的であるがゆえに今回のような分散手法では性能を出しにくいですが
Model Parallel等では力を発揮しそうです
柔軟性があるため新しい手法を試すのがよさそうです
LeapMind Inc. © 2018 47
ご清聴ありがとうございました
masuda@leapmimd.io
http://leapmind.io/

Más contenido relacionado

La actualidad más candente

強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
Shota Imai
 
変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)
Takao Yamanaka
 

La actualidad más candente (20)

分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
【DL輪読会】大量API・ツールの扱いに特化したLLM
【DL輪読会】大量API・ツールの扱いに特化したLLM【DL輪読会】大量API・ツールの扱いに特化したLLM
【DL輪読会】大量API・ツールの扱いに特化したLLM
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
分散深層学習 @ NIPS'17
分散深層学習 @ NIPS'17分散深層学習 @ NIPS'17
分散深層学習 @ NIPS'17
 
時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?時系列予測にTransformerを使うのは有効か?
時系列予測にTransformerを使うのは有効か?
 
Teslaにおけるコンピュータビジョン技術の調査 (2)
Teslaにおけるコンピュータビジョン技術の調査 (2)Teslaにおけるコンピュータビジョン技術の調査 (2)
Teslaにおけるコンピュータビジョン技術の調査 (2)
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
 
【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces
【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces
【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces
 
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
深層学習の不確実性 - Uncertainty in Deep Neural Networks -深層学習の不確実性 - Uncertainty in Deep Neural Networks -
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
 
Transformerを雰囲気で理解する
Transformerを雰囲気で理解するTransformerを雰囲気で理解する
Transformerを雰囲気で理解する
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
 
DQNからRainbowまで 〜深層強化学習の最新動向〜
DQNからRainbowまで 〜深層強化学習の最新動向〜DQNからRainbowまで 〜深層強化学習の最新動向〜
DQNからRainbowまで 〜深層強化学習の最新動向〜
 
[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論
 
変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)
 
多様な強化学習の概念と課題認識
多様な強化学習の概念と課題認識多様な強化学習の概念と課題認識
多様な強化学習の概念と課題認識
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
 

Similar a 20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説

まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
Hideharu MATSUFUJI
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
Kazuko Itoda
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
 

Similar a 20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説 (20)

ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
TensorFlowの使い方(in Japanese)
TensorFlowの使い方(in Japanese)TensorFlowの使い方(in Japanese)
TensorFlowの使い方(in Japanese)
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-
テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-
テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-
 
「機械学習とは?」から始める Deep learning実践入門
「機械学習とは?」から始める Deep learning実践入門「機械学習とは?」から始める Deep learning実践入門
「機械学習とは?」から始める Deep learning実践入門
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
Infrastructure as CodeでReNom環境構築入門
Infrastructure as CodeでReNom環境構築入門Infrastructure as CodeでReNom環境構築入門
Infrastructure as CodeでReNom環境構築入門
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlowDeep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlow
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
 
運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 

Más de LeapMind Inc

Final presentation optical flow estimation with DL
Final presentation  optical flow estimation with DLFinal presentation  optical flow estimation with DL
Final presentation optical flow estimation with DL
LeapMind Inc
 

Más de LeapMind Inc (17)

Final presentation optical flow estimation with DL
Final presentation  optical flow estimation with DLFinal presentation  optical flow estimation with DL
Final presentation optical flow estimation with DL
 
Survey on optical flow estimation with DL
Survey on optical flow estimation with DLSurvey on optical flow estimation with DL
Survey on optical flow estimation with DL
 
[Icml2019] mix hop higher-order graph convolutional architectures via spars...
[Icml2019]  mix hop  higher-order graph convolutional architectures via spars...[Icml2019]  mix hop  higher-order graph convolutional architectures via spars...
[Icml2019] mix hop higher-order graph convolutional architectures via spars...
 
[Icml2019]LIT: Learned Intermediate Representation Training for Model Compres...
[Icml2019]LIT: Learned Intermediate Representation Training for Model Compres...[Icml2019]LIT: Learned Intermediate Representation Training for Model Compres...
[Icml2019]LIT: Learned Intermediate Representation Training for Model Compres...
 
[Icml2019] parameter efficient training of deep convolutional neural network...
[Icml2019] parameter efficient training of  deep convolutional neural network...[Icml2019] parameter efficient training of  deep convolutional neural network...
[Icml2019] parameter efficient training of deep convolutional neural network...
 
エッジ向けDeepLearningプロジェクトで必要なこと
エッジ向けDeepLearningプロジェクトで必要なことエッジ向けDeepLearningプロジェクトで必要なこと
エッジ向けDeepLearningプロジェクトで必要なこと
 
20190227[EDLS]JAL's INNOVATION エアラインのAI活用
20190227[EDLS]JAL's INNOVATION エアラインのAI活用20190227[EDLS]JAL's INNOVATION エアラインのAI活用
20190227[EDLS]JAL's INNOVATION エアラインのAI活用
 
E20190227[EDLS]インテル®︎FPGAによるエッジAI
E20190227[EDLS]インテル®︎FPGAによるエッジAIE20190227[EDLS]インテル®︎FPGAによるエッジAI
E20190227[EDLS]インテル®︎FPGAによるエッジAI
 
20190227[EDLS]進化するAI on Edge 〜 CloudとEdgeの最適な関係
20190227[EDLS]進化するAI on Edge 〜 CloudとEdgeの最適な関係20190227[EDLS]進化するAI on Edge 〜 CloudとEdgeの最適な関係
20190227[EDLS]進化するAI on Edge 〜 CloudとEdgeの最適な関係
 
20180831 [DeLTA TECH] 深く青い脂
20180831 [DeLTA TECH] 深く青い脂20180831 [DeLTA TECH] 深く青い脂
20180831 [DeLTA TECH] 深く青い脂
 
20180831 [DeLTA TECH] 新・深層の世紀 〜第3集 ディープラーニング・時代はAIを求めた 〜
20180831 [DeLTA TECH] 新・深層の世紀 〜第3集 ディープラーニング・時代はAIを求めた 〜20180831 [DeLTA TECH] 新・深層の世紀 〜第3集 ディープラーニング・時代はAIを求めた 〜
20180831 [DeLTA TECH] 新・深層の世紀 〜第3集 ディープラーニング・時代はAIを求めた 〜
 
20180831 [DeLTA TECH] DeLTA-Liteを支える技術(システム構成編)
20180831 [DeLTA TECH] DeLTA-Liteを支える技術(システム構成編)20180831 [DeLTA TECH] DeLTA-Liteを支える技術(システム構成編)
20180831 [DeLTA TECH] DeLTA-Liteを支える技術(システム構成編)
 
20180831 [DeLTA TECH] DeLTA-FamilyによるIndustry4.1
20180831 [DeLTA TECH] DeLTA-FamilyによるIndustry4.120180831 [DeLTA TECH] DeLTA-FamilyによるIndustry4.1
20180831 [DeLTA TECH] DeLTA-FamilyによるIndustry4.1
 
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGAAn Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
An Introduction of DNN Compression Technology and Hardware Acceleration on FPGA
 
2018年1月19日開催 IoTビジネス共創ラボ 第6回勉強会
2018年1月19日開催 IoTビジネス共創ラボ 第6回勉強会2018年1月19日開催 IoTビジネス共創ラボ 第6回勉強会
2018年1月19日開催 IoTビジネス共創ラボ 第6回勉強会
 
Pitch v2.2
Pitch v2.2Pitch v2.2
Pitch v2.2
 
JUIZ DLK 組込み向けDeep Learningコンパイラ
JUIZ DLK 組込み向けDeep LearningコンパイラJUIZ DLK 組込み向けDeep Learningコンパイラ
JUIZ DLK 組込み向けDeep Learningコンパイラ
 

Último

Último (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説

  • 1. LeapMind Inc. Infrastructure Division Leader Hideaki Masuda 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)
  • 11. LeapMind Inc. © 2018 分散学習を導入する目的 精度の高いモデル を より短い学習時間 で手に入れたい
  • 12. LeapMind Inc. © 2018 Deep Learningにおける分散学習 スループットがよくても精度が出なければ 本末転倒である
  • 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を利用した分散学習についての情報は あまり見つけられないのが現状です 今回の発表が、皆さんが分散学習を実装する際の 足がかりになれば幸いです
  • 39. LeapMind Inc. © 2018 6. まとめ ぜひHorovodを利用して 分散学習を 体験してみてください!
  • 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/