Tensor Flow: Whitepaper
TensorFlow Whitepaperを2015/11/17に読んだ時のまとめ
Abstract
- いろんなデバイスで動く
- モバイイルから
- 大規模GPU Clusterまで
- Apache2.0 Licence
1 Introduction
2 Programming Model and Basic Concepts
- ノードが可能な挙動はNaiadに似ている
- その挙動は
- 状態を保つ
- 状態の更新
- 状態の永続化
- ブランチング
- ルーピング
- ノード
- 0 to nのインプットをとれる,およびアウトプットを出せる
- operation (実際の計算のこと)を行う
- エッジ
- この上をテンソルが流れる
- スペシャルエッジ (control dependency)
- このエッジのソースノードまでの実行はこのエッジのディスティネーションノードの実行より先に行わなければならない
- ordering enforcementに使える
Operations and Kernels
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
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でみれる
- レイヤーにおけるパラメータ,グラディエントの変化履歴をみれる
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にしたから是非使ってくれ.