Caffe2をインストールしてみる

## 何をするか？
FacebookとNVIDIAが協働して、Caffe2なるものを作ったみたい。[参考](https://blogs.nvidia.co.jp/2017/04/20/caffe2/)
chainerやtensorflow、keras、など便利なOSSがいっぱい出たけど、個人的には昔から使っていて慣れているcaffeが結構好きです。（ビルドキツいけど。）
caffeとの違いは、[caffe2の公式](https://caffe2.ai/docs/caffe-migration.html)を拙い英語力によって翻訳すると

1 並列処理ができるようになった。
2 mobile deployment。
3 新しいサポートするハードが増えた(CPUやCUDAなどを含む)
4 量子計算などへの対応に対する柔軟性を持った
5 大規模なFacebookアプリのストレステスト（にも耐えた？）

とあるけど、良く分かりませんw
2はmobile上でも計算できるようにモデルのサイズを小さくできるよってこと？
3はこれまでもCPUやCUDA使ってたけど、より最適化された？とかとか色々と知識不足により不明。

なので触ってみるのが一番でしょうということで、awsのGPUインスタンスへ入れて遊んで実感してみよう。というのが趣旨。

## インストール
### 環境
- AWSのg2.2xlarge
- ubuntu 16.04

### 手順
[ここ](https://caffe2.ai/docs/getting-started.html?platform=ubuntu&configuration=compile)を元にやってみる。

■諸々インストール

```
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
      build-essential \
      cmake \
      git \
      libgoogle-glog-dev \
      libprotobuf-dev \
      protobuf-compiler \
      python-dev \
      python-pip                          
sudo pip install numpy protobuf
```

pythonとnumpyのバージョンはそれぞれ、python:2.7.12、numpy:1.12.1。

■CUDAのインストール

CUDA8.0は、[ここ](https://developer.nvidia.com/cuda-downloads)から(要ユーザー登録) linux/x86_64/Ubuntu/16.04/deb(network)を選んで、リンク先のアドレスをwget。

```
cd /usr/local/wk/cuda
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
```

■nvidia-smiコマンドでGPUを認識するか確認

```
ubuntu@ip-172-30-2-22:/usr/local/wk/cuda$ nvidia-smi
Wed May 10 14:48:27 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51                 Driver Version: 375.51                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GRID K520           On   | 0000:00:03.0     Off |                  N/A |
| N/A   31C    P0    37W / 125W |      0MiB /  4036MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```

■CuDNNのインストール

```
CUDNN_URL="http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz"
wget ${CUDNN_URL}
sudo tar -xzf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local
rm cudnn-8.0-linux-x64-v5.1.tgz && sudo ldconfig
# /usr/local/cuda配下にinclude/cudnn.hとlib64/[libcudnn.so|libcudnn.so.5|libcudnn.so.5.1.10|libcudnn_static.a]が入る
```

■その他色々インストール

```
# ubuntu16.04のみ。ubuntu14.04はlibgflags2をインストール
sudo apt-get install -y --no-install-recommends libgflags-dev
sudo apt-get install -y --no-install-recommends \
      libgtest-dev \
      libiomp-dev \
      libleveldb-dev \
      liblmdb-dev \
      libopencv-dev \
      libopenmpi-dev \
      libsnappy-dev \
      openmpi-bin \
      openmpi-doc \
      python-pydot

pip install --upgrade pip

sudo pip install \
      flask \
      graphviz \
      hypothesis \
      jupyter \
      matplotlib \
      pydot python-nvd3 \
      pyyaml \
      requests \
      scikit-image \
      scipy \
      setuptools \
      tornado
```

■caffe2のソース取得とビルド。

```
git clone --recursive https://github.com/caffe2/caffe2.git && cd caffe2
make　　# 30分くらいで何事もなく終わった
cd build && sudo make install　# こっちも30分くらい？目を離して終わってたので正確にわからず。。
python -c 'from caffe2.python import core' 2>/dev/null && echo "Success" || echo "Failure"
Success
```

最後の動作で、python上でcaffe2のインポートの動作確認を実施。

■GPUの利用が正しくできているか確認

```
python -m caffe2.python.operator_test.relu_op_test
```

最後にOKと出ていれば問題なし。

この後、AWSのSGに8889ポートからの通信を許可して、
<img width="610" alt="スクリーンショット 2017-05-11 1.45.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/8bb9dafc-530a-cdb6-6140-18573c4bc9c6.png">

以下のコマンドを実行する。（このコマンドは、caffe2をgit cloneした場所で実行しました。）

```
jupyter notebook --no-browser --port=8889

[I 16:49:29.222 NotebookApp] Serving notebooks from local directory: /usr/local/wk/caffe2/build
[I 16:49:29.222 NotebookApp] 0 active kernels 
[I 16:49:29.222 NotebookApp] The Jupyter Notebook is running at: http://localhost:8889/?token=xxxxxxxxxxxxxxxxxxxx
[I 16:49:29.222 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 16:49:29.223 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8889/?token=xxxxxxxxxxxxxxxxxxxxxxx
```

これを実行したのち、ローカル側で、以下のコマンドを実行する。

```
ssh -N -f -L localhost:8888:localhost:8889 -i your_login.pem ubuntu@XX.XX.XX.XX
```

そして、ブラウザでhttp://localhost:8888 を入力すると、jupyterの画面に遷移してtokenを求められる。
そこに、先ほど得た、token=xxxxxxxxxxxxxxxxxxxxxxxの箇所を入力すると無事jupter上でcaffe2のソースが見えるようになります。

![スクリーンショット 2017-05-11 1.55.00.png](https://qiita-image-store.s3.amazonaws.com/0/40159/60ca1986-ba55-ee2a-d690-48cd321a61f9.png)

あとはここから、caffe2/python/tutorialsと下ると色々なサンプルにたどり着きます。

![スクリーンショット 2017-05-11 2.00.38.png](https://qiita-image-store.s3.amazonaws.com/0/40159/619ff3a8-f847-c4a7-5c18-f272ac90110c.png)

軽くMNISTの中をみると、model定義がいつもと違う。

![スクリーンショット 2017-05-11 2.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/40159/b8f4403a-0638-0ee0-2bc6-c82cd33894ea.png)

modelをCNNModelHelperで生成して、定義をmodel.Convやmodel.MaxPoolなどで作成していました。
この辺りの書き方は、chainerやkerasなどに凄く似てるなぁ。
prototxtはどこに行ってしまったんだろう。。

![スクリーンショット 2017-05-11 2.06.07.png](https://qiita-image-store.s3.amazonaws.com/0/40159/5ea7d0f9-bf1a-8792-63d6-47bebfddeb70.png)

正直、これまでcentosやOSXでビルドすることが多く、ビルドで失敗して多大な時間を持って行かれる恐怖があったけど、ubuntuだと？なのか、caffe2だとなのかわからないけど、すんなり入ってよかった。。
時間があれば、実行してどれくらいの速度かとかモデルのサイズは？などを改めて調べてみたい。