ありがとう、Chainer。頼むぜPyTorch。

2019/12/5、PFNからChainerの開発を停止しPyTorchの開発に貢献するというアナウンスがありました。

[Preferred Networks、深層学習の研究開発基盤をPyTorchに移行](https://preferred.jp/ja/news/pr20191205/)

オフィシャルな発表が出たことは衝撃的でしたが、心の中で「いつかはこうなるんじゃないか」という思いがあったのも事実です。さびしくはありつつも、決断にはベストな時期だったのではないかと思います。ここ最近は動的グラフをサポートしたTensorFlow 2.0の公開があり、機能的にほぼ差異がなくなった[2大フレームワークの決戦がいよいよ始まる・・・](https://towardsdatascience.com/from-tensorflow-1-0-to-pytorch-back-to-tensorflow-2-0-f2f8a4c716b7)という雰囲気です。そんな中でのChainer開発合流のニュースは十分存在感が出る時期ですし、PyTorch陣営としてもありがたかったのではないかなと思います(積まれているIssue/PRもTensorFlowより多いですし)。

本記事では、Chainerへの感謝とPyTorch合流への期待を綴りたいと思います。

## Chainerへの感謝

Chainerが登場したのは2015年6月です。このころ、深層学習の実装は今とは比べ物にならないくらい大変でした。pylearn2を使っていましたが、そもそもインストールがすごくめんどくさかったです。Windowsでやろうなんて日には、「正気なの?」と疑われる有様でした。

[Windows/Python3でpylearn2を使う](https://qiita.com/icoxfog417/items/707d25051fa15e843d09)

RNNは実装どころか情報もほとんどありませんでした。LSTMの実装が容易になり普及する前で、そもそもつかえんのかといわれているような状態でした。PyBrainという更新がほぼ停止していたライブラリで何とか実装をしていました。

[ニューラルネットワークで時系列データの予測を行う](https://qiita.com/icoxfog417/items/2791ee878deee0d0fd9c)

そんな中現れたChainerは、インストールも割りと容易で実装も容易でした。何より設計がとてもきれいで、「これだよこれ！！」と感動したのを覚えています。

[Chainerで始めるニューラルネットワーク](https://qiita.com/icoxfog417/items/96ecaff323434c8d677b)

Chainerを使った勉強会も何回か開催しました。

* [Tech-Circle Chainerで自然言語処理を行い翻訳に挑戦(ハンズオン）](https://techcircle.connpass.com/event/23365/)
* [Pythonではじめる強化学習 OpenAI Gym 体験ハンズオン](https://techcircle.connpass.com/event/43844/)

論文を読んでいて、Salesforceがオフィシャルで採用しているようだと知りました。日本の会社が作ったフレームワークが、海外の著名機関の研究に使われていると知りかなりうれしかった思い出があります。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Appears <a href="https://twitter.com/chainer?ref_src=twsrc%5Etfw">@Chainer</a> is throwing down the gauntlet re: multi-GPU scalability - 100x faster on ImageNet with 128 GPUs^<br>^ GPUs sold separately ;) <a href="https://t.co/hJLpzwSX41">pic.twitter.com/hJLpzwSX41</a></p>&mdash; Smerity (@Smerity) <a href="https://twitter.com/Smerity/status/829401024485920768?ref_src=twsrc%5Etfw">February 8, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

2015/12にはKerasが出て、Kaggleで結構使われるようになりました。その後TensorFlowも公開されました。チーム内で「Chainerか、Keras(TensorFlowバックエンド)か」という検討を行ったのですが、エースの「Kerasでいきましょう」という提言もありKerasを選択しました。正直に言えば、自分としてもGoogle相手にChainerが向こうを張り続けられるか、という点に不安がありました。

ただ初期のKeras/TensorFlowで、自然言語でよく使うRNNを実装するというのは地獄of地獄以外の何物でもありませんでした。正直、なんどChainerに戻りたいと思ったかしれません。以下の記事を書いていたのは、ちょうどチーム全員(このころ2人だったけど)で血反吐をはいていたころです。

* [機械学習で泣かないためのコード設計](https://www.slideshare.net/takahirokubo7792/ss-65413290)
* [デバッガを使ってKerasのモデルをデバッグする](https://hironsan.hatenablog.com/entry/keras-model-debug)

単体テストをかけたとき、テストごとのTensorFlowグラフがコンタミしてクラッシュしたのはいい思い出です(※意識せずデフォルトグラフを使った場合の挙動で、分ければ回避は可能です)。新しく入ってきた後輩も「Chainerで書きたい」とごねる始末のなか、辛抱強くKerasをつかって[本を書いたりもしてました](https://www.amazon.co.jp/Deep-Learning-%E2%80%95Python%C3%97Keras%E3%81%A7%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%82%92%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B%E3%83%AC%E3%82%B7%E3%83%94-Antonio-Gulli/dp/4873118263)。結局RNNの面倒さはずっと変わらなかったと思います(単純なモデルはKerasのLayerでかなり楽になったけど)。

そんな中、PyTorchが登場しました。StanfordのKarpathy先生が開発に入ったようで、登場したときかなり期待したのを覚えています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PyTorch、Stanfordのkarpathy先生が開発に入ったっぽいな。期待大。 <a href="https://t.co/vlfkRl9blV">pic.twitter.com/vlfkRl9blV</a></p>&mdash; piqcy (@icoxfog417) <a href="https://twitter.com/icoxfog417/status/822754152237309952?ref_src=twsrc%5Etfw">January 21, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

TutorialやExampleが丁寧に作られていて、開発の「熱量」がとても感じられました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">PyTorch slides - Researcher Edition [pdf] - A concise overview of the framework and its tensor implementation <a href="https://t.co/sMfHLdcfTs">https://t.co/sMfHLdcfTs</a> <a href="https://t.co/BZBek7aeKG">pic.twitter.com/BZBek7aeKG</a></p>&mdash; KDnuggets (@kdnuggets) <a href="https://twitter.com/kdnuggets/status/893381145836105729?ref_src=twsrc%5Etfw">August 4, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

当時のメールマガジン。

[Weekly Machine Learning #3](https://www.getrevue.co/profile/icoxfog417/issues/weekly-machine-learning-3-42400)

そしてその後、SalesforceがPyTorchに切り替えたのを知るという。。。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We&#39;re releasing <a href="https://twitter.com/PyTorch?ref_src=twsrc%5Etfw">@PyTorch</a>-QRNN, 2-17x faster than NVIDIA&#39;s cuDNN LSTM.<br>Speed thanks to 50 lines of CUDA via CuPy.<a href="https://t.co/KaWhN4yDZd">https://t.co/KaWhN4yDZd</a> <a href="https://t.co/yoLYj3pMI0">pic.twitter.com/yoLYj3pMI0</a></p>&mdash; Smerity (@Smerity) <a href="https://twitter.com/Smerity/status/917472260851560448?ref_src=twsrc%5Etfw">October 9, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とにかく加速度がすごかったです。そして、[KerasがTensorFlowの一部になるというニュースがありました](https://www.fast.ai/2017/01/03/keras/)。振り返ればこのころから新参vs大手の2大フレームワークの対決が始まったのかもしれません。それと同時に[Theanoの開発が停止](https://medium.com/syncedreview/rip-theano-48e75ec3c1b3)、[pylearn2が開発停止](https://github.com/lisa-lab/pylearn2)、[CaffeはCaffe2へ](https://caffe2.ai/docs/caffe-migration.html)、と新陳代謝も起き始めます。

なんだかすごい歴史を振り返っているように思いますが、ここまでの出来事が1~2年の間に起こっています。古参のフレームワーク続々が倒れる中Chainerが衰えることなく開発を続け新バージョン、さらにはChainerCVなどの派生ライブラリをリリースしてきたのはてきたのはとてもすごいことだと思います。細かいところですが[Chainerコントリビュート](https://github.com/chainer/chainer/releases/tag/v2.0.0b1)ができたのは、念願かなった気がしてとてもうれしかったです。

Chainerが普及しきれなかったのには、大きく心の疚しさを感じるところがあります(さっとKerasを選択してしまったというのもあり・・・)。アーティストがファンを必要とするように、オープンソースも普及にはコミュニティの力が欠かせないと感じています。もしかしたら、同じくらい大事だと思います。今後すばらしい才能による発明があっても「日本のコミュニティ」が足かせになって発展しきれないんじゃないかとか、「日本初」は「世界に通用しない」という漫然とした思い込みが成長を阻害したのでは、などもんもんと思うところはあります。そんなこともあり、最近は積極的にGitHubのStarを押すようにしています(GitHubのStar数は、たぶん思われているより相当のインパクトがあります)。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">個人的には、日本でももっと気軽にStarをつける文化が醸成されればなと思う。 <a href="https://t.co/4alX2cgwh7">https://t.co/4alX2cgwh7</a></p>&mdash; piqcy (@icoxfog417) <a href="https://twitter.com/icoxfog417/status/1097283226450616320?ref_src=twsrc%5Etfw">February 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## PyTorch合流への期待

PyTorchの内部コードが、Chainerのようにきれいになるといいなと思っています。PyTorchは使うのを躊躇するレベルで中身がえぐいところがあり([これ](https://github.com/pytorch/pytorch/issues/711))、この辺がなおるといいなと思っています。

また、ChainerRLのVisualizerは強化学習研究者垂涎の強力機能だと感じています。TensorBoardになるのかわかりませんが、ぜひこの資産はPyTorchでも使えたらなと思っています。

[chainerrl-visualizer](https://github.com/chainer/chainerrl-visualizer)

Chainerというリポジトリはアーカイブされるのかもしれませんが、各種DNNフレームワークのAPIが似たり寄ったりになる中で、移行できる資産は少なくないのではないかと思います。PyTorchの中、あるいは外側のエコシステムなど、Chainerの資産が活かされることでより安心して使えるフレームワークになることを期待しています。そして、「PyTorch、Chainer合流のおかげてすごい良くなったよね」と評価されるようになることを願っています。