複合機械学習による分散データ処理でさすがに良く出来てるTensorFlow

研究開発事業

全脳アーキテクチャ・イニシアティブ副代表の高橋です。

巷で話題のTensorFlow(TF)のwhite paperとソース見ました。ソースも見ましたが、whitepaperがとてもよく書けてるのでこれだけで大体設計が理解できるようになってます。

で、結論からですが、これさすがというかすごくよく出来てます。

ただ、ロボットミドルウェアのROSなどよりかはデータ解析ソフトウエアに近く、これと比べるとBriCAはかなりROSに近いです。

何が違うかですが; TFは多次元配列(テンソル)に対する操作を定義するカーネル(正確に言うと抽象操作のoperationにパラメータを与えて具体的な計算手順にしたのがカーネル)を有向グラフで表して、グラフ全体でなんらかのデータ処理パイプラインを表現、実行します。

この場合のグラフはBriCAやROSでいうところのノードやモジュールを結合した認知アーキやロボット制御アーキと一見して同じものに見えてしまいますが、色々と決定的な違いがあります。

BriCAやROSではノードがそれぞれ独立したサイクルを持ち、一定時間ごとに入力を読みに行き、計算して出力をするということを繰り返しています(時間の概念がある)。入力と出力はノードごとに完全に非同期に行われています。(エージェントに対する入力は連続的に与えられ、内部のノードは自分の都合で好きな時に入力を読みに行き、自分の都合で好きな時に出力を更新するということをばらばらに行っている。)

一方、TFでは、グラフはあくまでデータ(テンソル)の流れを表しており、基本的にはグラフ全体は全て同期的に実行されます。(厳密な言い方ではないが、ざっくりとは時間の概念が希薄、と言っても良いでしょう。)

具体的には、下記のような手順で行われるようです:

  1. run()する時に、入力データと、結果の出力を取り出すポートをユーザーが明示的に与える。
  2. 入力から出力に向かって(出力から入力に向かっても同じことだが)ノード間の依存性が計算される。それぞれのノードが依存性するノードの数がカウンターにセットされる。
  3. 依存グラフに従って、入力から出力に向かって一つづつノード(カーネル)の計算が実行されて行く。依存性カウンターがゼロになったノードが実行キューに追加され、キューの中のカーネルが順序なしで実行されてゆく。出力の値が計算されたら終わり。
  4. ユーザーが出力を取り出す。

つまり、あるノードの出力が巡り巡って自分に戻ってくるような循環グラフ(リカレントループなど)は表現出来ません。ループがある場合は、明示的にループのカウントや停止条件を表現するコントロールノードを設けて、フローチャートのような感じで表現する必要があります。

また、グラフ全体が同期して実行されるので、どこかのノードでエラーが起きると、グラフ全体を最初から実行し直す必要があります。彼らはfault toleranceということで有用な機能として紹介していますが、認知アーキやロボットの場合には一部の計算がトラブっても無理やり走り続ける非同期でないといけないので、このへんも用途の違いによる設計思想の違いが出てますね。

まあ、ノードはステートフルなので、それを利用すればリカレントループを表現出来なくもないと思いますが、思想的にはあまりそういったことは考えていないようです。

というわけで、リアルタイム性を持った認知アーキティクチャの実行にはあまり向かないようです。

ただ、ソフトウエアとしてはむちゃくちゃよく出来ていて、自動でグラフを分割して分散計算してくれたりとか、走らせる前にグラフをトラバースしてシミュレーションランして、計算の重さや通信の重さなども推定した上でどのノードをどの物理的なCPUやGPUなどに割り振るか自動でロードバランスしてくれたり、自動でグラフを解析してあるテンソルの別のテンソルに対する勾配を計算してくれたり、と思わず唸る機能が目白押しで、とても勉強になりました。

特筆すべきはTensorBoardという可視化ツールで、直感的に操作できて非常によく出来ています。

全脳アーキ視点からの興味としてはポイントはこんなところでしょうか。脳器官モデルの一つひとつをTFで構築して、それらを結合するのをBriCAなどの非同期モデルで行う、というのは器官の計算モデルによってはいいやり方かもしれないと思いました。

データフロープログラミングの一種と考えれば考え方自体は昔からあったもので新しいとは言えませんが、長年の当該分野の研究の上澄みを満遍なく取り入れてとても完成度の高いエンジニアリングをしていると思います。

機械学習による分散データ処理の分野ではデファクトになるポテンシャルを持っている感じがします。我々が全脳アーキティクチャなどの認知アーキテクチャ向けに開発するBriCAとは少し対象領域が違いますが、複合機械学習という新しいエンジニアリングの領域が盛り上がるのは歓迎すべきことなので、国産ソフトも含めどんどん注目が広がるといいなと思います。