MXNet 入門

[DeepLearning Advent Calendar 2016](http://qiita.com/advent-calendar/2016/deeplearning) 4 日目です。
3 日目は @tereka114 さんの「[グレーの画像に色をつけるネットワークについて発表しました。](http://nonbiri-tereka.hatenablog.com/entry/2016/12/03/131759)」でした。

[最近 AWS が公式にサポートを表明した](http://aws.typepad.com/sajp/2016/11/mxnet-default-framework-deep-learning-aws.html)深層学習フレームワーク **MXNet** に、彼らの記事や各種チュートリアルを通して入門してみようと思います。

# MXNet とは

## 概要

![mxnet.jpg](https://qiita-image-store.s3.amazonaws.com/0/66457/8b97c737-119a-c7e2-f62a-7f82041388ee.jpeg)

MXNet はワシントン大学とカーネギーメロン大学によって、CNN と LSTM をサポートするために開発されはじめました。効率的で柔軟な深層学習フレームワークとなるよう設計されています。

## 特徴

AWS が MXNet を支援すると決めた理由に、以下の 3 つをあげています。

* スケーラビリティ
* 豊富な対応言語
* 軽量かつ高い可搬性

その他にも MXNet には以下のような特徴があります。

* 命令的 / 宣言的プログラムの混合
* 豊富な深層学習モデルのサポート

余談ですが、re:Invent2016 のセッション中、AWS のとある AI エンジニア曰く
「多くの部分で TensorFlow より秀でている[^1]。ドキュメントは負けてるけどね！笑」


## スケーラビリティ

MXNet はコンピュートリソースを追加すればするほど処理能力が向上します。
つまりリソースを追加する **だけ** で、より精度の高いモデルを、より速い時間で学習できる可能性があるということです。

以下は [Inception v3](https://arxiv.org/abs/1512.00567) を AWS の [P2 インスタンス](https://aws.amazon.com/jp/blogs/news/new-p2-instance-type-for-amazon-ec2-up-to-16-gpus/) で動作させた検証結果だそうです。スケーリングの実行効率はおおよそ 85% とのこと。
![mxnet-result.png](https://qiita-image-store.s3.amazonaws.com/0/66457/dc864d70-11c2-6683-7191-70d1220034f5.png)


TensorFlow などもマルチ GPU 対応による同様の能力はあるものの、検証した結果、現在 MXNet がもっとも理想に近い処理能力向上がみられるとのこと。TensorFlow については GCP なら [TPU](https://cloudplatform.googleblog.com/2016/05/Google-supercharges-machine-learning-tasks-with-custom-chip.html) で最適化されているようですし、個人的にはいつか GCP で同様の検証をしてみたいところです。

## 豊富な対応言語

<img width="408" alt="languages.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/35faa36e-108a-3d4a-5367-d0b616f12335.png">

学習には [Python](https://github.com/dmlc/mxnet/tree/master/python)・[C++](https://github.com/dmlc/MXNet.cpp)・[R](https://github.com/dmlc/mxnet/tree/master/R-package)・[Scala/Java](https://github.com/dmlc/mxnet/tree/master/scala-package)・[Julia](https://github.com/dmlc/MXNet.jl) が使え、
推論にはそれらに加え [Matlab](https://github.com/dmlc/mxnet/tree/master/matlab)・[JavaScript](https://github.com/dmlc/mxnet.js/) 向けの API も用意されています。

AWS のエンジニアによると、AWS の各種サービスそのものを始め、社内では様々な言語が使われている背景からも MXNet が魅力的だったとのことです。


## 軽量かつ高い可搬性

<img width="395" alt="portable.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/45d76c52-c8e1-4710-2eeb-982c67593f59.png">

MXNet は RunAnywhere、様々なデバイスやプラットフォームに対応[^2]しています。

また[メモリ効率にも優れ](http://mxnet.io/architecture/note_memory.html)ており、1,000 層もの深いネットワークでもわずか 4GB のメモリしか消費しません。Android や iOS、ブラウザ側で推論を行う際にこの特徴はとても際立ちます。

## 命令的 / 宣言的プログラムの混合

効率性・生産性を高めるために、命令的 / 宣言的なプログラムを **併用する** ことができます。
[論文](https://pdfs.semanticscholar.org/080a/ebd2cc1019f17e78496354c37195560b0697.pdf) によれば、これは主要な深層学習フレームワークの中では MXNet だけが持っている特徴であり、MXNet という名前の由来になってもいるようです。（Mix => MX）

具体的にどういうことかというと、それぞれ以下のようなプログラムのことを指し

```python:命令的プログラム
import numpy as np
a = np.ones(10)
b = np.ones(10) * 2
c = b * a
d = c + 1
```

```python:宣言的プログラム
A = Variable('A')
B = Variable('B')
C = B * A
D = C + Constant(1)
# compiles the function
f = compile(D)
d = f(A=np.ones(10), B=np.ones(10)*2)
```

それぞれ

* 命令的: `どのように計算するか` を指示する書き方
* 宣言的: `どうなるべきか` を定義する書き方

であり、汎用性や最適化可能性などにおいて一長一短あります。
ディープダイブしたい方は [こちら](http://mxnet.io/architecture/program_model.html) に公式ドキュメントがあります。

## 豊富な深層学習モデルのサポート

もともと、畳み込みニューラルネットワーク (CNN) や Long Short-Term Memory ネットワーク ([LSTM](https://github.com/dmlc/mxnet/tree/master/example/rnn)) を含む最先端の深層学習モデルをサポートしていました。しかし今では [RCNN](https://github.com/dmlc/mxnet/tree/master/example/rcnn) や [DQN](https://github.com/dmlc/mxnet/tree/master/example/reinforcement-learning/dqn) と言った手法での利用例も公開しています。

適応範囲も画像認識だけでなく、自然言語処理からレコメンド生成まで幅広く使われています。

# 使い方

## インストール

Python の依存性解決によるインストールは [こちら](http://mxnet.io/get_started/setup.html#installing-mxnet)。Docker なら [こちら](https://hub.docker.com/r/dmlc/mxnet/)。
AmazonLinux の場合は、後述の AMI を利用するのがオススメです。

## チュートリアル

適用分野やプログラミング言語で分類された、公式ドキュメントはこちら
http://mxnet.io/tutorials/index.html

GitHub で公開されている全ての参考ソースはこちら
https://github.com/dmlc/mxnet/tree/master/example

簡単にそれらを始めるためには
http://qiita.com/pottava/items/0d40747287ff31b8db77

　

[^1]: お祭りの中での一言です。TensorFlow ガチ勢な各位におかれましては、暖かい心で読んでいただけばと。
[^2]: FPGA については TensorFlow 同様現在未対応ですが、コミッタの一人は「ロードマップにはあるよ」と言っていました。[ここ](https://github.com/dmlc/mxnet/issues?q=is%3Aopen+is%3Aissue+label%3ARoadmap) にはなさそうですが。笑
[^3]: この AMI 実現のために AWS が NVIDIA とライセンス交渉してくれたものと思いますが、本当にありがたい・・
[^4]: まもなく AWS の公式ブログとして公開されるようです