Translate

2016年12月21日水曜日

TensorFlowは機械学習ビジネスの"フレームワーク"ではないかと邪推する

TensorFlowを始める最初に読んだのが

有山圭ニ著「TensorFlowはじめました」


だったのだけど、
機械学習はおろかPythonの知識すらなかったので
正直書いていることがよくわからなかった。

特になんで変数やPlaceholderをわざわざ定義しなきゃならないのか
Python自体の持つ変数で十分じゃないのか
とか
なんでわざわざsessionをおこしてrunするのか
Pythonの関数として定義させて呼び出せば
Pythonコードの読み方がトリッキーにならずに済むのに
とか
おもっていた。




p8にかかれていたオーバヘッドの絵(上の図はそれを模写したもの)が
その理由であることもなんとなくしかわからなかった。

がTensorFlowのGuide>How-Tosを読んでいくと
なんとなく意味がわかってきた。

それに気づいたのが情報機構主催の研修
「Chainerを利用したDeepLearningプログラムの仕組みとその作成・実装方法」
で講師だった新納浩幸教授がChainerが「フレームワーク」であると説明したときだった。

Chainerがフレームワークなら
TensorFlowもフレームワークになっているんじゃないのか
とおもい、やや強引だけどMVCフレームワークの代表格Struts2と比較する絵を
書いてみたら、意外と整理できた。






StrutsをJSPなどを無視してざっくり説明すると
Actionを実装した具現クラスをたくさん作って、
XMLで書いた定義ファイルに従って画面遷移させる
MVCフレームワークだ。

TensorFlowはというと、
C++でOperationの具現クラスを作って独自Operrationが
つくれるようになっている。
機械学習素人やいっちょかみレベルの開発者は
TensorFlowが提供する既存のOperationを使うだけなので
C++開発はほとんどしないが、
TensorFlow自体はすべてC++コードがメインだ。
Pythonからそれを呼び出してつかっているだけなのだけど、
Pythonコード上のリテラルを使ってしまうと
最初の絵の左側のように毎回処理が終わったらC++のレジスタ領域から
Pyhonの変数にもどさないといけない。
だけどtf.Variableを用意してこれをC++上のオブジェクトとしてしまえるようにすれば
Pythonの世界に戻ってこなきて良いわけだ。

XMLで計算グラフを定義してもいいけど、
機械学習のモデル設計者の立場からすると
ランタイム実行を何度も繰り返す主戦場をあたかも
Pythonの上で開発しているように見せかければいいわけか。

ただプログラミングに重心を持つ開発者からすると
Chainerのほうが行数も少なく済む。
グラフ定義しておいてそこで処理せず
セッション実行で初めて動き出すところに違和感を感じる。

けど、主戦場がC++でPythonはそれを定義するために使っている部分と
それを実行する部分をしっかり理解してコードを読み書きすれば
違和感は払拭できる。

ChainerはGPUを使う場合はnumpyではなくCuPyを使うけど
TensorFlowはtf.Variableを使うのでそんな必要はない。
かわりにrun関数の引数でPythonの世界で扱っていたデータを
C++の世界に送り出してやればあとは"データフロー"グラフで処理してくれる。

 tf.Variable名前空間を使えば、訓練済みの重さとバイアスを保存・復元も簡単、
訓練・自動評価・パラメータ更新系モジュールで完成したチェックポイントファイルを
ServingのリファレンスインプリメントであるServerCoreのようにしてやれば
最新の訓練済みパラメータの推論側のシステムへホットアップロードでき
CPU側でVariable管理、GPU側で学習や推論を動かす実装にして
推論側の高速化はQuantatizeでfloatの32bitを8bitに圧縮し処理で実現
Distributed TensorFlowKubernetes+docker
2017前半からGPUサポートするGoogle Cloud Platformで開発系本番系インフラを
つくることができる。
Deep Learningでレイヤが熱くなり混沌とするグラフ実装をスリム化する手段は
TF-Slimでなんとかして、
独自OperationはPython/C++両方でexposeするのでネーミングルールの注意まで
How-Tosに掲載されている..

TensorFlowのアーキテクチャを読んでいくと
ますますGoogleの機械学習/NN/DLに対する本気度がわかってくる..

ソフトウェアジャパン2016で人工知能学会会長の松原さんが
人工チノについては「日本は海外から1周以上周回遅れ」といっていたが
そのとおりかもしれない..

たしかに
国内企業産のChainerはバージョンアップも頻繁で
どんどん新しいモデルが表現できるようにして
先進技術をとりこんでいるのかもしれないが
フレームワークの目的範囲がTensorFlowよりも狭い気がする..


0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...