オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

汎用WindowsマシンでのTensorflow推論は,C言語 + CPUの一択

 こんにちは.changです.

 今回は,汎用のWindowsマシンにTensorflowの推論を実装する方法についての自論を書きます. 本当は汎用OSとしたいのですが,情けないことにAndoroidやiOSでソースを書いたことがありません(汗). ですので,今回はWindows限定です.

 結論から言うと,C言語 + CPUの一択です.

0. 予備知識

 ディープ・ラーニング開発,特にその学習フェーズには,Pythonを用いるのが一般的です. TensorflowやChainerなどのライブラリがPython用になっている為です.

 以前に,Linuxで作った学習済みネットワークをWindowsで使う場合,Pythonを使った方法とC言語を使う方法があることを紹介しました*1*2*3Linux側と同じ開発環境をWindows上に構築できるならば,推論にもPythonを使う方が簡単です. 敢えて手間をかけてでもC言語で推論するべき,というのが今日の主題です.

1. Python or C言語

 Pythonは,C言語と比較するとかなり簡単に書くことが出来ます. numpy等のライブラリが豊富で,ソースが短くて済みます.

 この事は研究者にとって都合が良いです. 僕自身も,大学で研究していた頃にはMatlab等のスクリプト言語を使っていました. 研究者に受け入れられる→Pythonライブラリが公開される→更に多くの研究者に受け入れられる...という仕方で,「ディープ・ラーニングはPythonで書く」文化が定着したと思います.

 ところが,Pythonはソフトウェアを使うユーザ側の立場からすると,必ずしも便利ではありません. 理由には下記が挙げられます.

(1) インストール方法が専門的
(2) ライブラリとの互換性がシビアで,永続的に安定動作させるのが難しい
(3) コマンド実行などの操作が専門的
(4) GUIが陳腐
(5) 動作が遅い

 ユーザーフレンドリーで無いという事は,ユーザにソフトウェアを提供する側にとってもフレンドリーでは無いという事です. ソフトウェア提供者の端くれとして,Pythonの使い難さを挙げてみます.

(A) インストーラが作り難い

 上記の(1)(2)に関わる問題です. 開発者であれば,コマンド操作でpip等を使い,Web経由でインストールすれば良いです. 一方,ソフトウェアユーザにとって,ソフトはインストーラを叩くだけで使える様になるのが当たりです. スマホ世代の若者には,「インストーラ」という概念すら無いでしょう. コマンド操作でのインストールは非常にハードルが高いと感じます(requirements.txtなどを使ってインストールを簡素化したとしても).

 Anacondaみたいな汎用インストーラを作る手も考えられます. 実際,Anacondaの登場がPythonを身近にさせたと感じます. ただ,問題になり得るのが,次項の他ソフトとの干渉です.

(B) 他ソフトとの干渉

 汎用OSでは,自身が提供したソフトウェアだけではなく,他者が作ったソフトウェアも動いています. その中には,Pythonを使うソフトだってあるでしょう. 他者のインストーラPythonやライブラリのver.を変えてしまった結果,自身のアプリが動かなくなる可能性は大いにあります. その逆も然りです.

 汎用OSで動かすソフトウェアでは,自身のアプリを動かすための資源を全て自分のインストーラからセットアップでき,かつその資源が他で使われないことが鉄則です. .Net frameworkなどはその例外になりますが,これはOSを提供するMicrosoftが半ば使用を義務付けているものです. オープンソースであるPythonが,.Net frameworkの様な共有プラットフォームになるとは考え難いです. 個人的には,自身のアプリのバックグラウンドでPythonを使うことはあり得ないと思っています.

(C) GUIが作り難い

 上記の(3)(4)に関わる問題です. kivyなどを使えば,PythonでもGPUアプリを作る事は出来ます. ですが,複雑なアプリを作るのには向きません. アプリの全体を,Python + kivyだけで作ることが難しいケースが多いでしょう. C言語C#から,Pythonを操作することになります. 出来なくは無いんですが,,,面倒です.

(D) 高速化するのが大変

 最先端の研究で使われている言語が遅いというのは,違和感があるんですが... 実際,先日紹介した恐竜の種類判定でも画像の読み込み部分にはC言語を使いました*4

 私見ですが,研究で問われるのはユーザ目線に立った速度では無く,他の研究に対する相対値です. 「誰々の論文より,何秒速くなった」という考え方ですね. また,数百万のGPU環境を惜しみなく使ったりもしていると思います.

 東大の研究者が未だにFortranを書いているという話を聞いたことがあります. 研究と言うのは,使用者の目線から外れたところで展開されるのが常ですね.

要するに...

 パイソンはユーザを想定した言語では無いのです. 一方,以前に紹介したC言語での推論*5であれば,tensorflow.dllを自身のインストーラから入れることで上述してきた問題を解決できます. これ一択では無いでしょうか.

2. GPU or CPU

 Tensorflowの学習にはGPUが必須です. 開発環境の構築にはしばしば苦戦しますが*6,その殆どがNVIDIAのドライバ関係です. 使用するライブラリ(例えば,Tensorflow)と,NVIDIAのライブラリ,NVIDIAのドライバのver.互換がシビアであり,不意のアップデートで環境が動かなくなることがよくあります.

 Windowsアップデートで,NVIDIAドライバが勝手に更新される可能性があります. また,ユーザの操作でドライバやライブラリが更新されることも多いでしょう. GPUソースは他者のソフトウェアから使用される可能性が非常に高いからです.

 動かなくなったとき,ユーザ自身が環境を再セットアップするのは非常に困難でしょう. ユーザを馬鹿にする訳ではありません. 僕自身も,壊れた環境を復旧するのに丸一日かかったりします. もし,自分の作ったアプリが生産ラインの中で使われていて,それが動かなくなったら...と考えると,青ざめてしまいます.

 以前の記事で,CPU( + C言語)を使ったU-Net(画像サイズ256×256)の推論が500 ms位と書きました*7. 使える用途は多いのではないでしょうか.

 もし,もっと速く推論を動かす必要があるなら,自身のアプリからしGPUを使わない様な運用をユーザにお願いするしか無いでしょう. 専用パソコンになっちゃいますね(汗).

3. 組み込みやクラウドへの実装

 ここに来て全否定ですが,汎用Windowsに推論を実装するのは適切では無いと言えるでしょう. ラズベリーパイなどを専用基盤として使うのが無難だと思います.

 Google Cloud Platformなどを使って,クラウド上に専用スペースを作るのも良いと思います. 大規模なデータ解析はクラウド上で行うのが当たり前になるという意味では,推論側の環境や情報が陳腐なのも納得かもですね.

4. 結び

 推論側にもPythonをゴリ押しする風潮を感じたので,書いてみました. その方向に行くのでしょうね... パソコンの中にPythonが沢山入っている様な時代が来るかもです. 今度,AndoroidやiOSについても調べてみようと思います.