DeepLearningフレームワークCaffeをCPU modeでMacにインストールする方法

※この情報は2015/07/04のものです、Caffeは非常に更新速度が早いため現在動作するかは分かりません。

## Caffeとは

最近話題のDeep Learningのオープンソースなフレームワークです。
カリフォルニア大学バークレー校の院生が作り始めたそうです、凄い！
公式ホームページは[こちら](http://caffe.berkeleyvision.org)、C++、PythonやMATLABで使えるので得意な方を選んで使えます。
更新が非常に早いので最新の情報を追ってみると面白そうです。
[ここ](http://demo.caffe.berkeleyvision.org)から画像分類のデモが見られるので、気になる方は試してみてください。

## Caffeを使おうと思った背景

Deep Learningを勉強し始めた当初は関数型言語だし普段使っているからScalaでDeep Learningやる！とか甘い考えで色々試していましたが、ある時画像処理や機械学習のライブラリ、フレームワークがPythonなどの言語と比較して圧倒的に少ないことに気が付いてしまいました。がっつり自前で0からNeural Networkを設計、構築するというよりはとにかく動かしてみたかったのでとりあえず公式ドキュメントや日本語での情報が比較的多いCaffeを使うことにしました(ググればサンプルコードとかがたくさん出てくる)。さらにCaffeは基本的にはGPUを使用しますが、CPU_ONLYのオプションもきちんと用意されているのでMacBookPro 13inchで強力なGPUが無い自分にも扱えて嬉しい！

しかしCaffeは環境構築が大変という噂もあり、何か簡単な方法がないかと調べているとDocker HubにCaffe構築済みというありがたい[コンテナ達](https://registry.hub.docker.com/search?q=caffe&s=stars)を見つけて、あるじゃんやった、と思っていましたがCPU modeのコンテナのほとんどのものは最終更新日が何ヶ月も前！どうせなら最新版使いたいよ！ということで自分のローカル環境で構築しようと決めました。Pythonで使いたいのでPyCaffe(Pythonで`import caffe`)ができるようになるまで頑張ります。

### ローカル環境

* マシン: MacBook Pro 13inch(Early 2015)
* CPU: 3.1 GHz Intel Core i7
* メモリ: 16 GB 1867 MHz DDR3
* OS: OSX Yosemite 10.10.4

## CaffeをbuildしてPythonでimportするまでの道のり

### Caffeを使うのに必要なもの

* CUDA(今回はCPU modeなのでいらない)
* BLAS(Macには標準で入っているので特にやることなし)
* OpenCV(画像処理系のライブラリ、homebrewで入れられる)
* protobuf, szip, glog, gflags, hdf5, leveldb, snappy, lmdb (homebrewで割と簡単に入れられる)
* python, boost, boost-python (PyCaffeするのに必要、これもhomebrewで割と簡単に入れられる)

結構有りますがほとんどのものはhomebrewが入っていれば一気にインストールすることができます。

### 手順

MacにはPythonが元から入っているけどバージョンが古いみたい(buildでうまくいかなくなることが多い?)なのでhomebrewで新しく入れる、今回は面倒なのでpyenvは使いませんでした(本当は使った方が絶対良い)。

```
brew install python
```

次、まとめてbrewで入れます！

```
brew install --fresh -vd snappy leveldb gflags glog szip lmdb
brew tap homebrew/science
brew install hdf5 opencv
```

今回はPyCaffeしたいのでこっちも一気に入れます。

```
brew install --build-from-source --with-python --fresh -vd protobuf
brew install --build-from-source --fresh -vd boost boost-python
```

次、Caffe本体をレポジトリからcloneしてきて、用意された雛形からMakefile.configを作成します。

```
git clone https://github.com/BVLC/caffe.git
cd caffe
cp Makefile.config.example Makefile.config
```

Makefileの一部を書き換えます。
MacのバージョンでBLASのpathが変わるので`BLAS_INCLUDE`の部分のpathを下記のように変更します、二箇所あるので一応両方同じ書き換えをします。

```Makefile
BLAS_INCLUDE ?= /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/Headers/
```

Makefile.configも何箇所か書き換えます。
まず上の方にある`CPU_ONLY`をアンコメントします、これによりCPU modeのCaffeがbuildされるようになります。
次に`PYTHON_INCLUDE`と`PYTHON_LIB`のpathを使っているpythonの方に下記のように変更します。

```Makefile.config
CPU_ONLY := 1

PYTHON_INCLUDE := /usr/include/python2.7 \
        /usr/local/lib/python2.7/site-packages/numpy/core/include/

PYTHON_LIB := /usr/local/Cellar/python/{python version}/Frameworks/Python.framework/Versions/2.7/lib/
```

ここまででCaffeをbuildする準備は完了です、Caffeをbuildしてtestを走らせてみましょう。
-jはbuildの際の並列数です、多いと終わるのが早くなります。

```
make clean
make all -j4
make test -j4
make runtest
```

runtestがうまく通ればとりあえずはCaffeのbuildは成功です、次にこれをPyCaffeできるようにします。(Xcodeのバージョンによって`make test`が失敗してしまうみたいですが`make all`が通っていればテストを行わない事で次のステップに進めます。)

Caffe内のpython(`caffe/python`)フォルダに移動してPyCaffeに必要なライブラリをpipで一気に入れます。

```
cd python
for li in $(cat requirements.txt); do sudo pip install $li; done
```

次、PyCaffeをbuildします。

```
cd ../
make pycaffe
make distribute
```

下記のPYTHONPATHを.bashrcや.zshrcに書いておきます。

```
export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH
```

導入の手順はここまでです。`source ~/.bashrc`などで読み込みした後Pythonのインタプリタで`import caffe`をしてみてください、エラーが出なければ成功です！
homebrewのおかげで思ったよりも簡単にCaffeがインストールできました、本当に感謝ですね。
僕もまだCaffeいじり始めたばかりですが使い方が分かってきたらそれもそのうちまとめて記事にしたいと思いますのでよろしくお願いします。

何か問題点、改善点ありましたら教えてください。