Chainerの実験に対してログを可視化したり外部制御するExtension＆WebアプリをPFNで作った

PFNで製品開発を担当している三好です。
[Chainer Advent Calender 2017](https://qiita.com/advent-calendar/2017/chainer)の20日目の記事をお送りいたします。

この度、Chainer上の実験中の学習ログの可視化や実験管理機能を追加するパッケージ、[ChainerUI](https://github.com/chainer/chainerui)を公開しました。

 - [Chainerの可視化・実験管理を支援するChainerUIを公開 - Preferred Research](https://research.preferred.jp/2017/12/chainerui-release/)
 - [We have released ChainerUI, a training visualizer and manager for Chainer - Preferred Research English](https://preferredresearch.jp/2017/12/20/chainerui-release/)

学習用TrainerのLogReport extensionを用いたスクリプトをお持ちであれば、すぐにloss/accuracyのリアルタイム監視が可能になります。

![20170829-173630_capture.gif](https://qiita-image-store.s3.amazonaws.com/0/60150/300c7407-f175-5a71-652b-fb1b0f67243e.gif)

これが何かを言葉で説明するよりスクリーンショットを見ていただくのが早いので、どんどん貼ります。

### プロット軸の線形・対数切り替え
![20170828-181005_capture.gif](https://qiita-image-store.s3.amazonaws.com/0/60150/bf42c744-de6d-7a76-a52d-bd45dd96d572.gif)

### プロットへの着色
![20170828-180407_capture.gif](https://qiita-image-store.s3.amazonaws.com/0/60150/2159ba13-8dec-8b04-11e7-b7ff7d111ce9.gif)

### 履歴一覧&任意名称付与
![20170828-175842_capture.gif](https://qiita-image-store.s3.amazonaws.com/0/60150/4fb6086f-a3e1-b20e-5abe-3516f8952b60.gif)

### 実行中の実験に対してsnapshotをWebブラウザからの指示で取る
![20170905-183105_capture.gif](https://qiita-image-store.s3.amazonaws.com/0/60150/b38d841d-516a-fb17-1ca1-47660a65149a.gif)

(上記スクリーンショットはプロトタイプのもので、現在は若干異なる場合があります)

## 実行方法

ChainerUIは `pip` コマンドで簡単に導入できます。

```sh
pip install chainerui
chainerui db create
chainerui db upgrade
```

ChainerUIでは、Chainerのスクリプトを置く開発レポジトリやディレクトリを「プロジェクト」と呼びます。
適宜監視をしたい「プロジェクト」をChainerUIに登録した後、サーバーを実行します。

```sh
chainerui project create -d PROJECT_DIR [-n PROJECT_NAME]
chainerui server
```

その状態でWebブラウザから `http://localhost:5000/` にアクセスします。

他にも、実行時のパラメタ等と紐付けて一覧表示することや、任意のイテレーション数で学習を停止することができます。
具体的な導入例は[example](https://github.com/chainer/chainerui/blob/master/examples/train_mnist.py)にあります。

その他の機能・操作方法について、詳しくは[開発レポジトリ](https://github.com/chainer/chainerui)を参照してください。

## 公開の背景

Deep Learningの応用によって、様々な課題に対するState-Of-The-Artが日夜目まぐるしく塗り替えられる現在、実験の可視化や管理の効率化は大きな課題となっています。そのため、効率化支援のためのアプリケーションが乱立する状況になっています。

Deep Learningの実験の効率性を考える上で大きな要素の一つとして、実験の監視が挙げられます。具体的には、lossやvalidationの推移をグラフにプロットすることで、直感的に実験の成否を判断することができます。一方で、このような可視化手段として、従来はmatplotlib等による画像出力程度しかありませんでした。よって、リアルタイムかつ手軽に監視を行うことが難しくなっています。そのため、実験を行うユーザは、CUIで監視するか、各々の可視化手段を実装することで可視化を行うのが一般的です。その結果、ユーザ間でノウハウのサイロ化が起こりやすい課題がありました。

この課題を解決するために、2017年に入って可視化アプリの開発が活発化しました。
中でも[TensorBoard](https://www.tensorflow.org/get_started/summaries_and_tensorboard)が筆頭に挙げられます。また、Sonyからも [Neural Network Console](https://dl.sony.com/ja/) が発表・公開されました。
そして、Chainer向けの可視化支援ツールとしても[ChainerWing](https://github.com/fukatani/ChainerWing)([Advent Calendar 9日目](http://segafreder.hatenablog.com/entry/2017/12/09/230307))、[chainerboard](https://github.com/koreyou/chainerboard)([Advent Calendar 12日目](https://qiita.com/koreyou/items/f3e15770688d610e8a9e))、[chainer-monitor](https://github.com/Hakuyume/chainer-monitor)等が開発されています。

この状況について、PFNのリサーチャー、エンジニアは下記のような懸念を持ちました。

 - TensorBoard は流用・常用するものとしては大規模すぎる
 - このままでは類似するプロダクトが乱立する上、開発者が分散してしまう
 - 技術が目まぐるしく入れ替わるフロントエンド業界の中で自然発生的に持続可能なプロダクト開発を行うことは難しそう

PFNはChainerのエコシステムの中で、ユーザが心地よく実験をこなせることを望んでいます。そして、ユーザが各々の工夫のために貴重な時間や労力を充ててしまうことは望んでいません。このような背景から、Chainerユーザの効率をよりいっそう高めるための公式ツールとしてChainerUIの開発を行いました。

## 開発メンバー

今回、ChainerUIの開発を中心的に行ったのは、インターンシップでフロントエンドエンジニアとして招いた筑波大学の[小林正樹さん](https://twitter.com/_Makky_)と京都大学の[稲垣悠一さん](https://twitter.com/gky360)です。おふたりは2ヶ月という短期間ながらも、社内を駆け回って要件を聞き出し、設計・開発・評価を自律的に回しました。インターンシップ期間終了後も小林さんと稲垣さんにはアルバイトとして継続的に関わっていただいています。

## 要件抽出

Chainerのコア開発メンバや社内リサーチャーから出たアイディアをもとにフロントエンドチームが取捨選択し、実装を行いながら提案を行いました。
動くものができてからはインターンシップのメンバーや社内のリサーチャーに公開し、社内でドッグフーディングを行いながら改善ループを回しました。

集まった要件はリーンキャンバスやアイディアマップを用いて整理し、ユーザが喜ぶ機能をあぶり出して開発にフィードバックをしました。

![leancanvas_chainerui.png](https://qiita-image-store.s3.amazonaws.com/0/60150/f76a551c-02a7-c102-f896-eafa5c937117.png)

## 設計コンセプト

ChainerUIの開発において目指したコンセプトは

 - すぐ使える
 - 心地よい手触りにこだわる
 - 息の長いアーキテクチャを選択する
 - なんでもやろうとしない

です。

### すぐ使える
pipでインストール、簡単なコマンドで起動、のリズミカルな導入ができます。
既存のChainerのLogReportエクステンションになるべく乗せることで、既存のChainerユーザにとっても負担を小さくしています。

### 息の長いアーキテクチャを選択する
フロントエンドアプリを取り巻く環境は、Deep Learning界隈に負けず劣らず、入れ替わりが激しいため、モダンかつシンプルな構成にする必要性を感じました。そこで、ベースはReact+Reduxにしました。一つ一つのコンポーネントも疎に組むことで、将来の着脱を容易にしています。
また、サーバサイドも将来の機能拡張の可能性を塞がないよう、なるべくシンプルに組みました。具体的には、フロントエンドアプリとはFlaskベースのAPIで通信するものとし、LogReportのログファイルの回収はディレクトリのポーリングで行うようにしました。

### なんでもやろうとしない
各Chainerユーザにとって、支援ツールに求める機能は多種多様です。実際に社内における要件抽出においても各々の夢が錯綜し、どれから開発に着手すべきか悩ましい状態になりました。しかしながら、「すぐ使える」「心地よい手触りにこだわる」という原点に立ち戻って、その時点で顧客価値を最大化する機能を選び、即実装・即評価のループを回すことに徹しました。Chainerをよく使っている人が、更に効率を高めるためのツールを目指しました。

## 振り返り
本プロジェクトの企画は6月頃から上がっていましたが、本格的に開発に着手したのはインターンシップが始まった8月初旬。開発中は毎日のように各所から類似するプロダクトが出てくるため、不安の中での開発作業でした。しかしながら、頻繁にChainerを使うリサーチャーやインターンシップ生が社内にいたことで、機能の改善・拡充を効率的に進めることができました。
そのドッグフーディングをすすめる過程で、社内でOSS化の是非とタイミングの議論を慎重に行い、今回の公開を迎えています。

なお、機能追加の要望やバグ修正などは[githubのレポジトリ](https://github.com/chainer/chainerui)にていつでも受け付けています!

## これ以外にもOSS化を進めています

PFNはChainerUIとほぼ同時に化学、生物学分野のための深層学習ライブラリ[Chainer Chemistry](https://github.com/pfnet-research/chainer-chemistry)もOSSとして公開しました。またDeep Learningのフレームワーク間共通のデータモデルONNXをサポートする[onnx-chainer](https://github.com/chainer/onnx-chainer)も正式サポートに向けて動いています(2017/12/19現在)。