なんでこんなこと書いてるの
今書いているライブラリの一貫でマルチノードだったりGPUだったりで統一的に効率よく計算ができるようにする必要があったのでどうにかしてうまくできないかと思ってたらアイデアが出てきたので書きなぐってます。
GPU計算の今
深層学習、とりわけ深層ニューラルネットワークの発展に伴ってGPUを使った行列計算の高速化はもはや避けて通れなくなってきました。PFNがChainerを使ってGPUクラスタでImageNetを15分で学習できるようにしたりと深層学習とGPUは切手は切れない関係にあります。ただGPUの利用には深刻な障壁があり、完全に使っているフレームワーク依存になるという大きな問題点があります。
ChainerなんかはCuPyとしてGPU計算用のロジックを切り出しているので扱いやすいんですがTensorFlowやらPyTorchはGPU計算が独自実装なのでフレームワーク間の相互運用性はほぼ無いと言っても過言ではないかと思います。かといってGPUのオンボードメモリからRAMにコピーするのは無駄だしGPU上のメモリ領域のポインタ操作をしたいかと言われればNoです。わがままなユーザ(私)はせいぜいどのGPUに乗ってるかさえ意識していれば勝手にGPU内、あるいはGPU-GPU間、CPU-GPU間の転送をしてくれる都合のいい仕組みがほしいです。nvlinkなんかの存在が一層その必要性を高めているように思います。
そもそもフレームワーク間で相互運用するケースがほぼ存在しない(あまり目につかないだけ?)ので何を喚いても無駄な感じはするんですがモデル並列でChainerのモデルとPyTorchのモデルをよしなに実行したいみたいな話とかは複合モデルを作る研究が増えれば予想できる将来図で、互換性を得るためだけに片方のモデルを書き換えてというのは正直非効率的です。複数人によるコラボレーションとなると最悪で、一人だけTensorFlowしか使えなくてあと全員Define-by-Run系のフレームワークしか使えないみたいな状況も考えられます。というか個人的にそういう経験があります。勉強せいって話なんですがTensorFlowって個人的に筋が悪いというイメージが定着してしまっているのでなかなか勉強する気になれずになあなあに時間だけが過ぎていきました。ぶっちゃけ勉強すればなんとかなるだろうとは思うんですがそのへんをエンジニアリングで解決したくなる悲しいサガの持ち主なのと仕事の都合上どうしてもフレームワークを限定して割り切ることが許されないためこんなしょうもないことを延々と考えていました。
じゃあどうするの
私が思いつく程度のことは誰だって考えてるだろうしポエムにしかならないのでどうしようもないんですが人がなんの意味もなくポエムを書くのかと言われると感情の整理とかそういう生産性とは少しズレたところにポエムの価値はあると思ってるのでもし万に一つでもこのポエムが何かの役に立つならば自分の心中を吐露するついでにQiitaあたりに投稿してみるかと思った次第です。
個人的な理想形を言うならGPU計算を代行するブローカサービスを挟むのが一番いいんじゃないかと思ってます。ブローカに対してデータを投げつけてそのデータに対してやってほしい計算を指示すると勝手にそれをGPU上でやってくれて、あとはこの辺のブローカ呼び出しロジックを既存のCPU上で計算するインターフェースと揃えておいて行列がRAMとGPUのオンボードメモリのどっちに乗ってるかだけ指定しておけば数値演算ライブラリ側で勝手に処理を切り替えてくれるみたいな。
ある意味マイクロサービスというかそういうのに近いです。というかRPC化していいんじゃないかとも思います。マルチGPU間の転送をブローカ側で処理するならユーザが心配すべきなのはCPU-GPU間のデータ転送で、これはそもそもコストが大きいのでRPC化しても大したオーバーヘッドにならないと考えています。そういう仕組があればGPUに乗っているかどうかみたいなことを意識しなくて済むし、高級なインターフェースで計算できるし、gRPC的なもので作れば多言語対応できるしで万々歳のような気がしています。問題があるとすればCuDNN的なものがどういう扱いになるのかとかそういうところがどうなるかわからなかったりすることが挙げられますが全体的にGPU計算に対する幸福度は上がる気がします。
結論
人間のバイアスってすごいのでデメリットを見落としまくってるとは思います。でもポエムなので許されるとも思ってます(許されるからと言ってフィードバックがほしくないわけではない)。GPUの計算に対してもっと高級なインターフェースを提供するみたいなアプローチをしなきゃだめだよね的な議論とかもしご存知の方がいたらご教示願いたいです。とにかくGPUという特殊なハードウェアリソースを意識せずに使える枠組みはいずれ必要になる(かつPythonで実装されている以上CuPyではその役割は担えない、あるいは担える限界が来る)と思っているので関連する議論があったら参加したいなと思ってます。