Chainer を振り返って
2015 年 4 月 12 日に Chainer の最初のコードをコミットしてから,およそ 4 年半と少しが経ちました.はじめのはじめは軽い気持ちで書きはじめたコードでしたが,今では一線級の研究を立派に支えるまでになりました.深層学習フレームワークの世界も当時とは様変わりして(当時は TensorFlow も PyTorch もなかったわけですから,本当に変わりました),思えば遠くにきたものです.
今日,PFN は社内の研究開発に用いる主なフレームワークを PyTorch に移行すると発表しました.会社にとってももちろんですが,業務としてはこの 4 年半,Chainer 一筋でやってきた自分にとっては特に,大きな転換点です.
まず率直な感想として,Chainer の開発は本当に楽しかったです.書きはじめた頃は,深層学習フレームワーク競争の真っ只中で,Theano の上に乗っかるフレームワークが雨後の筍のように発生する世界でした.その後,TensorFlow や PyTorch も出てきて,巨人と肩を並べられていたかはわかりませんが,とにかく刺激的な環境でした.この時期に,この規模で,Google や Facebook と同じ土俵でフレームワーク開発ができるというのは,本当に稀有な体験だったと思います.
僕は,エンジニアにはありがちな「ゲームを作り始めるとゲームエンジンだけできて終わる」を地で行く人間なので(学部時代,まさに字面通りにそうでした),深層学習についても気づけばフレームワークを書いているというのは,ある意味当然の展開とも言えます.深層学習フレームワークというのは,そういうタイプの人間にとって本当に面白い題材です.DSL を作るという意味で,言語を作るような感覚(もっとずっとライトではありますが)で設計の仕事は刺激的でしたし,ソフトウェアのとても低レベルなところまで触ることもあって,上から下まで全部面白い.Python と NumPy エコシステムのおかげで,作り始めるのも実は敷居が低い.そりゃ,みんなフレームワークを書くわけで,競争というか乱闘になるのも納得です.
僕は特に,API を考えることが好きなので,Chainer についても基本的にはそういう仕事がメインでした.きれいな API が作れて,それを使った簡潔明瞭なユーザコードが書けたときの快感といったらありません.そういう意味では,最初の1週間が最もエキサイティングでした.その後は,CuPy,Link/Chain,Trainer,FunctionNode,混合精度計算,ChainerX など様々な機能に携わることができましたが,どれも一筋縄では行かないタスクで,かつ業務上の要求と社外のユーザコミュニティへの貢献の両面で有意義な仕事で,とてもやりがいがありました.
OSS 開発の仕事は,前に Jubatus に携わっていたこともあって初めてではなかったですが,チームを率いるというのは全く初めてのことだったので,いろいろ大変でした.おそらく自分は,正着からはほど遠いムーブをたくさんしてきただろうと思います.初期開発メンバーの海野さんからは当初たびたび背中を押されて,リーダーシップを取るように促されていましたが,その後の意識とチームの形成にとって本当に大きかったと思い,感謝が尽きません.そしてなにより,開発メンバーが自分事としてあらゆる問題に取り組んでこなければ,今ここには立っていなかったと思います.
思い出話は無限にできそうですが,さておき.
PFN における今回の決定は,半分は自分が言いだしたようなことなので,今は残念とかよりも,とにかくここまで,事故もなくやってきたことにほっとしています.最後の最後で自分は育児休業に入ってしまい,同僚にはたくさん迷惑をかけましたが,それを当たり前のこととして受け入れてくれたことも,本当に感謝してもし足りません.
今この瞬間はそういう気持ちですが,まあそうは言っても,本当はいろんな感情があります.悔しかったり,寂しかったり.移行の話がはじまってからは,なかなか苦しい気持ちの日もありました.
悔しいというのは,どちらかというともっと前に持っていた感情かもしれません.Chainer は,Define-by-Run という枠組みにおいては,最初は他の主要なフレームワークの先を行っていたわけです.PyTorch や TensorFlow が同様の機能を実装して,ユーザベースやエコシステムでも圧倒している状況というのは,歯がゆい思いがありました.もっとうまくやれただろう部分というのは数えだしたらきりがありませんが,もう一回やり直していいよと言われたとして,じゃあ違う道に進めるかというと,そうとも限らない気もして,難しいですね.
一方で,PyTorch も TensorFlow も,ネットワークの記述という部分では,僕たちが Chainer で作り上げてきたような API によく似たところに収束してきていて,とても誇らしいことだとも思います.見た目にも似た書き方が多く,ある種のミームみたいなものが受け継がれていくのを感じます.最近は PyTorch を使っていますが,新しい家なのになんだか実家のような安心感があります.
深層学習フレームワークの開発は,楽しいものでしたが,最近は他のフレームワークも似たような方向に進んでいて,大枠としては段々と成熟してきたように感じます.TensorFlow も PyTorch も,Define-by-Run な API でコードを書き,それをコンパイラが計算グラフ表現に変換し,誤差逆伝播の導出やグラフレベルの最適化を行ったあと,アクセラレータ向けのコードを生成する,という方向に進んでいます.僕らも,ChainerX と Chainer Compiler で同じようなゴールに向かって開発していましたが,もちろん細かいところには無数に違いがあるとはいえ,大枠の発想は同じです.そういう意味では,フレームワークの API の進化は収束していって,僕らのような小さな陣営の果たす役割というのはそろそろ終わりかなという思いもあり,今回の判断は,まあやっぱり妥当かなと思っています.
もちろん,今後また大きなシフトが起きる可能性は十分あります.深層学習という分野は,全く落ち着きそうな気配がありません.一時期のように,ぼこぼこと新しいアーキテクチャが出てきて何が何だか分からない,というような時代はそろそろ過ぎ去ったかもしれませんが,今でも基本的なモジュールから,学習の枠組みやタスクまで,あらゆるレベルで進化が続いています.今と同じ抽象度で今後ずっとプログラミングしていくということも,ないかもしれない.そういう意味では,これから異なるレイヤーで新しいパラダイムが勃興して,また世界が変わっていったりしないかな,と想像しています.Chainer はこういう形になりましたが,新しいフィールドで,また面白いことができたらいいなと思っています.
最後に,これまで Chainer チームで一緒に楽しく開発させてくださった方々,エコシステムを盛り上げてくださった Chainer family プロジェクトの方々,社内でさまざまなフィードバック・PR をくださった研究者・開発者の方々,折に触れてサポートしてくださった広報やコーポレートサービスの方々,今回の移行について全力でサポートしてくださった執行役員の方々,CUDA に関してたくさんの議論と貢献をしてくださった NVIDIA の方々,これまでコミュニティを盛り上げてくださった chug の方々,issue や PR などで直接的に貢献してくださったコントリビュータの方々,そしてなにより Chainer をこれまで使ってくださったすべてのユーザに,感謝したいと思います.本当にありがとうございました.