Slide 1

Slide 1 text

Distributed Deep Newral Networks 0x64 物語 reboot 第01 夜 "Network" @yubessy

Slide 2

Slide 2 text

今日の話 ニュー ラルネットワー ク x 分散コンピュー ティング

Slide 3

Slide 3 text

Why Distributed? デー タ量の増加 テキスト < 画像 < 動画 計算量の増加 いわゆるディー プラー ニング 単一マシンの処理能力の頭打ち -> 時代は分散コンピュー ティング

Slide 4

Slide 4 text

分散コンピュー ティングの歩き方 分散対象: 何を分けるか そもそも分割できるのか 負荷を均等化できるか アー キテクチャ: どうつなぐか クライアント・ サー バ型 / メッシュ型 / ... 同期 / 非同期 スルー プット / レイテンシ プロトコル

Slide 5

Slide 5 text

深層ニュー ラルネット (DNN) 多数のレイヤを接続した有向グラフ Back Propagation (BP) 入力値に対する、 モデルの出力値と正解値の 差分を求める 差分が小さくなるよう、 出力側から順に 各レイヤのパラメー タを調整 Stochastic Gradient Descent (SGD) デー タ点を1つずつ与えながらモデルを学習

Slide 6

Slide 6 text

深層ニュー ラルネット (DNN) From http://joelouismarino.github.io/blog_posts/blog_googlenet_keras.html

Slide 7

Slide 7 text

DNN と分散処理 DNN は分散処理に向いている モデル並列化 = 計算グラフを複数の部分に分割 デー タ並列化 = デー タを分割しノー ド毎にSGD "Large Scale Distributed Deep Networks" Dean, et al. 2012. By Google DNN のモデル / デー タ並列化両方について解説

Slide 8

Slide 8 text

モデル並列化 分散対象 = DNN のグラフ グラフ全体を部分グラフに分割 各部分グラフを別々 のノー ドに割り当て アー キテクチャ = メッシュ型 元のグラフで結合されていた部分が ノー ドをまたいで通信 ボトルネック 適切に分割しないと ノー ド間のトラフィックがえらいことに

Slide 9

Slide 9 text

モデル並列化 Dean, et al. [1] Figure 1

Slide 10

Slide 10 text

デー タ並列化 分散対象 = 学習デー タ デー タをチャンクに分割 各チャンクを別々 のノー ドに処理させる アー キテクチャ = Parameter Server (PS) 方式 PS ノー ドが各レイヤのパラメー タを保持 ワー カー ノー ドは一定量の学習を終えるごとに 非同期通信によりパラメー タを更新 ボトルネック ワー カが増えるとPS ノー ドの負荷が高くなる

Slide 11

Slide 11 text

デー タ並列化 Dean, et al. [1] Figure 2

Slide 12

Slide 12 text

Distributed TensorFlow ここまで説明した分散処理機能が 実はすでに TensorFlow に組み込まれている Distributed TensorFlow ノー ド間はgRPC で通信

Slide 13

Slide 13 text

雰囲気だけ紹介

Slide 14

Slide 14 text

クラスタ定義 cluster = tf.train.ClusterSpec({ # ワー カー ( デー タ分散) "worker": [ "worker0.example.com:2222", "worker1.example.com:2222", "worker2.example.com:2222" ], # パラメー タサー バ ( モデル分散) "ps": [ "ps0.example.com:2222", "ps1.example.com:2222" ]})

Slide 15

Slide 15 text

モデル並列化 レイヤを複数のPS に分散 # 同じPS に乗せたいパラメー タ群を tf.device でくくる with tf.device("/job:ps/task:0"): weights_1 = tf.Variable(...) biases_1 = tf.Variable(...) # タスクの番号に応じてラウンドロビンでPS が決まる with tf.device("/job:ps/task:1"): weights_2 = tf.Variable(...) biases_2 = tf.Variable(...)

Slide 16

Slide 16 text

デー タ並列化 各ワー カー に同じグラフを複製 # replica_device_setter で # 複数のワー カに同じグラフを複製 with tf.device(tf.train.replica_device_setter( worker_device="/job:worker/task:%d" % task_index, cluster=cluster)): input, labels = ... layer_1 = tf.nn.relu( tf.matmul(input, weights_1) + biases_1) logits = tf.nn.relu( tf.matmul(layer_1, weights_2) + biases_2) train_op = ...

Slide 17

Slide 17 text

まとめ NN は分散コンピュー ティングと相性がよい モデル並列化 / デー タ並列化 TensorFlow 最強

Slide 18

Slide 18 text

参考 [1] Large Scale Distributed Deep Networks [2] Distributed TensorFlow [3] Distributed TensorFlow を試してみる [4] Distributed TensorFlow の話