MXNet を試せる環境をwindows10 に構築する

# MXNet をWindowsのPythonで使いたい

Deep Learning で学習をしていると、何かと時間がかかるのが気になるということで、
現在のところ高速に動くのはMXNetかCNTKということで、MXNet のインストールを試みた。
本家のドキュメントは若干古かったりして、あれ？と思うところがあったので、
自分が構築した手順を備忘録として書いてみました。

## ダウンロード

windows の prebuild 版の最新版は以下のサイトからDLできる

https://github.com/yajiedesign/mxnet/releases

まずは、vc12, vc14 のどちらかの関連ライブラリパッケージをダウンロードする

- vc12 base package
- vc14 base package

python3.5 が vc14 でビルドされているので、それに合わせて vc14 base package (約73MB)を選択する。

次に本体の prebuild版 をダウンロードする。cuda の準備ができていると思うので、gpu版（約18MB)をダウンロードする。　
7z 形式の圧縮なので、http://forest.watch.impress.co.jp/library/software/7zip/
とかで解凍ツールをダウンロードしておく。

- 2017XXXX_mxnet_x64_vc14_cpu.7z
- 2017XXXX_mxnet_x64_vc14_gpu.7z

## 展開

ドキュメントでは c:\mxnet に展開すると書いている。
自分は適当に以下のようなフォルダを作成して展開した。

```
c:\work\mxnet
```

vc14 base package の 7z を展開。

- 3rdparty/
- include/
- lib/
- python/
- LICENSE
- README.txt
- setuenv.cmd

が含まれていた。3rdparty/cudnn/Readme.txt を見ると、自分で cudnn をDLして配置しろと書いてある。今回は cudnn 5.1 を設定する。
ちなみに 3rdparty/cudart/ を見ると、 cudart64_80.dll とあるので、CUDA8.0 64bit + cudnn 5.1 の組み合わせになる（ダウンロードされるバージョンによってアップデートされる）

- cudnn-8.0-windows10-x64-v5.1.zip

をDLして 3rdparty/cudnn の以下に展開したファイルをコピーした。

次に、2017XXXX_mxnet_x64_vc14_gpu のファイルを展開したものを
prebuildbase_win10_x64_vc14 にコピーする。ここまでの状態で

c:\work\mxnet\prebuildbase_win10_x64_vc14\

- 3rdparty/
- build/
- include/
- lib/
- nnvm/
- python/
- LICENSE
- README.txt
- setupenv.cmd

となっている。

## Python 環境の設定

ドキュメントには setupenv.cmd を実行して、python/setup.py でインストールするとなっているが、まずは mxnet 用の仮想環境での利用を想定する。

windows の場合の仮想環境は、anaconda が便利。全部入りのものをダウンロードしてみ良いが、最低限の状態からインストールをする場合には、miniconda が良い。opencv のパッケージの関係で、使用するpythonは **3.5** とした。

### conda による仮想環境設定

仮想環境名は -n で指定して、ここでは mxnet　にした（任意で構わない）。
その後に、python=3.5 でバージョンを3.5 指定。numpy, scipy, cython は必要なのでインストール時に設定。ipython はテストで使いやすいので、ついでにインストール。

```
conda create -n mxnet python=3.5 numpy scipy cython ipython
```
ダウンロードされて、インストール先は c:\Anaconda3\envs\mxnet などになる。

無事に設定されると、この仮想環境を利用するコマンドプロンプトから

```
activate mxnet
```

で仮想環境を利用する状態になる。

## MXNET のPATH 設定

setupenv.cmd を見ると、3rdparty のフォルダへのパス設定がPATH に加えられる。しかし、既に PATH の文字列が 1024 を越えている場合には失敗する。

ここでは、以下のフォルダの 絶対パスを環境変数 PATH に加える必要がある。

- 3rdparty\openblas\bin
- 3rdparty\gnuwin
- 3rdparty\vc
- 3rdparty\opencv
- 3rdparty\cudart
- 3rdparty\cudnn\bin
- lib\

要は、これらのPATH を設定するスクリプトを作成した。 c:\work\mxnet\mxnetenv.bat というファイルとして

```
set MXNET_HOME=c:\work\mxnet\prebuildbase_win10_x64\vc14
set MXNET_DEPEND=%MXNET_HOME%\3rdparty
set MXNET_PATH=%MXNET_DEPEND%\openblas\bin;%MXNET_DEPEND%\gnuwin;%MXNET_DEPEND%\vc;%MXNET_DEPEND%\opencv;%MXNET_DEPEND%\cudart;%MXNET_DEPEND%\cudnn\bin;%MXNET_HOME%\lib
set PATH=%MXNET_PATH%;%PATH%
```
を作成。**MXNET_HOMEは各自のパスに設定しなおす**。
mxnet を使う場合には、この mxnetenv.bat を起動してからおく。

## python パッケージとしてインストール

ここまでの段階で python パッケージとしてインストールする準備ができた。c:\work\mxnet に展開したものとして書いているが、適宜読み替えて下さい。

```
activate mxnet
cd c:\work\mxnet
mxnetenv.bat
cd %MXNET_HOME%\python
python setup.py install
```

意味は、

- 先程設定した仮想環境 python 3.5 の mxnet に切り替え
- インストールしたフォルダに移動
- 環境変数PATHにmxnet の3rdparty の依存ライブラリパスを追加
- python フォルダに移動
- setup.py を使って 仮想環境の site-package にインストール

すると、他の足りてないライブラリなどをダウンロードしながら設定が開始されてインストールが完了します。

## テスト

ここで、インストールできているかどうか確認します。
仮想環境の状態で、pythonを起動

```python
import mxnet as mx
a = mx.nd.ones((2,3))
print((a*2).asnumpy())
```
エラーがなければ以下のようになる（ここでは、ipythonを使った)

```python
(mxnet) c:\work\mxnet> ipython
In [1]: import mxnet as mx
In [2]: a = mx.nd.ones((2, 3));
In [3]: print ((a*2).asnumpy());
[[ 2.  2.  2.]
 [ 2.  2.  2.]]
```

## 検証環境の追加

このままだと、何をするにも不便なのでOpenCV3 と jupyter をインストールしました。

```
conda install -c menpo opencv3
conda install jupyer matplotlib
```

(OpenCV3 のパッケージは標準ではない。現時点では python3.6 用は配布されていないので、3.5 を使うことになった理由がここにある）

```
jupyter-notebook
```

で、jupyter を立ち上げて、「New」-「Python3」で新しいファイルを作成して、先程のテストコマンドが通るかどうかをテスト。

あと、MXNetのtutorial では、グラフを描画するサンプルもあるので、
事前にgraphviz をインストールしたほうが良いです。

## さいごに

これで、最新版の mxnet を使えるようになっていると思いますが、mnist などのテストは次の機会ということで・・・