KZKY memo

自分用メモ.

Tensor Flow: Whitepaper

TensorFlow Whitepaperを2015/11/17に読んだ時のまとめ

Abstract

  • いろんなデバイスで動く
  • モバイイルから
  • 大規模GPU Clusterまで
  • Apache2.0 Licence

1 Introduction

  • DistBeliefは第1世代
  • TensorFlowは第2世代
  • TensorFlowのアブストラクションはdeep learningだけでなくて他のML, 数値計算に使える

2 Programming Model and Basic Concepts

  • ノードが可能な挙動はNaiadに似ている
  • その挙動は
    • 状態を保つ
    • 状態の更新
    • 状態の永続化
    • ブランチング
    • ルーピング
  • ノード
    • 0 to nのインプットをとれる,およびアウトプットを出せる
    • operation (実際の計算のこと)を行う
  • エッジ
  • スペシャルエッジ (control dependency)
    • このエッジのソースノードまでの実行はこのエッジのディスティネーションノードの実行より先に行わなければならない
    • ordering enforcementに使える

Operations and Kernels

  • operationはabstract computation
  • kernelはdevice (cpu, gpu, e.g., intel, arm, cuda, opencl, 実例はこれだと思う)上のoperationの実装

Session

  • セッションのなかでグラフ作って実行したりする
  • 基本この中でrunする

Varialbe

  • persistent stateをもつ
  • (パラメータありの演算ノードと思っておけばいい)

3 Implementation

Devices
  • Workerは1以上のdeviceに対して責任を追う

3.1 Single Device Execution

  • グラフノード上における実行順序の説明
  • 依存関係をカウントしておく
  • A -> B, A -> Cの依存だとAのカウントは2
  • Bが実行されたら,Aのカウントは1にディクリメントされる
  • カウントが0になったら実行queueに入れる
  • 実行queueのにある要素の取り出し順序は不定

3.2 Multi-Device Execution

3.2.1 Node Placement
  • グラフが構築されると,computationはset of devicesにマップされる
  • このマップするアルゴは(経験から求めた)コストベースで,絶賛検討開発中
3.2.2 Cross-Device Communication
  • メモリ最適化のために,依存関係が複数ある場合におけるreceive nodesの数が1つになるようにしている.(参考ダイアグラムはwhite paper参照)
  • 違うデバイス上のグラフノードのスケジューリングはworkerの責務で,マスターにさせない,マスターはrunリクエストを発行するのみ.

3.3 Distributed Execution

  • send/recieve nodesのコミュニケーションはTCPとかRDMA
Fault Tolerance
  • failureの判断は
    • send/recieve nodesのコミュニケーションの失敗
    • master to workerのhealth check.
  • faiureすると,初めからやり直しだけど,checkpointがあるとそこから再開

4. Extensions

4.1 Gradient Computation

  • automatic gradient computationはサポートしている
  • gradientは
    • operationに登録されてるときもある(基本されていると思う)
    • backward時の前ノードの微分とオプションとして,forward時の自分自身への入力および自分からの出力をインプットとする
  • automatic gradient computationはメモリ最適化を難しくするが,今頑張って改善使用としている.e.g., tensorをretainよりrecompute, long-lived tensorgpu mem to gpu memなど.

4.2 Partial Execution

  • run methodはsubgraphの実行も可能
  • graph 途中からデータを入れるも可能
  • graph 途中のデータを取り出すことも可能

4.3 Device Constraints

どのnodeをどのdeviceで計算を実行させるか可能

4.4 Control Flow

以下のコントロールが可能

  • cyclic dataflow graph
  • swith/mergeで,subgraphの実行をskip
  • enter/leave/next iterationでiteration
  • if-conditionals/while-loops

4.5 Input Operations

  • filenamesを受け取って,tensorを返す,input nodeの設置

4.6 Queues

ユースケース

  • input data prefetch
  • gradientsをグルーピングして,その複雑なコンビーネーションを計算する
  • RNNにおいて,複数センテンスを読みとって,大体同じ長さになるようなシークエンスのbinをいくつか作る
  • shuffling queueもあってデータshufflingに使える

4.7 Containers

  • Varialbeのbacking store

5 Optimizations

工夫の話

5.1 Common Subexpression Elimination

  • computation graphは最終的に同じ計算になることが多いので,同じインプットでオペレーションタイプのコピーは正規化して,一意にしている

5.2 Controlling Data Communication and Memory Usage

  • Receive nodeのスタートは気をつけていて,コントロールエッジを挟んでおき,その前のノードの計算が終わるまでスタートを待っている

5.3 Asynchronous Kernels

  • non-blocking kernelもある
  • 例えば,Receive, Enqueu, Dequeue

5.4 Optimized Libraries for Kernel Imple- mentations

  • 今提供しているkernelはほとんど既存の最適化されたライブラリのthinラッパー
  • BLAS, cuBLAS, cuda-convnet, cuDNNとか
  • Eigenをndarrayを取り扱えるように拡張している

5.5 Lossy Compression

  • ノード間でデータ転送をするとき,32bit to 16bitのlossyな変換をしている
  • IEEE 16bitでなくて,32-bitIEEE 794を使っている

6 Status and Experience

DistBeliefからTensorFlowにportingしたときのレッスン
特にまとめない

7 Common Programming Idioms

Large-Scale Distributed Systemの話で出てくる一般的な用語とその説明

  • Data Parallel SDG synchronouslyできる
  • Data Parallel SDG asynchronouslyできる
  • Model Parallelできる
  • Concurrent Steps for Model Computation Pipeline (Data Parallel SDG asynchronouslyが同じdevicesで行われる)できる

8 Performance

まだないよ

9 Tools

9.1 TensorBoard: Visualization of graph structures and summary statistics

  • いい感じに可視化してくれる
  • 構築したcomputational graphをdrill downでみれる
  • レイヤーにおけるパラメータ,グラディエントの変化履歴をみれる

9.2 Performance Tracing

  • EEGっていうbottleneck発見可視化ツールがあるがまだpublishしてない

10 FutureWork

  • subgraphを完全に取り出せる
  • jit compiler
  • computation 2 device mapping algoの改善
  • node scheduling algoの改善

11 RelatedWork

  • chainer, theanoのようにsymbolic differenciation
  • stateful parameter serverはnodeとして超簡単に表現可能
  • Naiadのように,1つの最適化されたdataflow graphがすべての計算を表し,そのグラフに関するキャッシュ情報は各デバイス上にのせて,コミュニケーションオーバーヘッドを最小化.なので,RAMがたくさん欲しい.

12 Conclusions

OSSにしたから是非使ってくれ.