OS X 10.10（Yosemite）にCaffeをインストールする（libstdc++問題解決）

## Caffeって？

Caffeは、アメリカのカリフォルニア大学バークレー校が開発している、ディープラーニングのフレームワークです。

* マルチプラットフォーム（LinuxやMax OS X）で動く
* C++やPythonで実装できる
* 数ある機械学習のフレームワークの中で開発が活発で、処理速度が速い
* いろいろな研究成果が報告されている

などなど

## Macにインストールする

Ubuntuでのインストールはすごく簡単でしたが、Mac、特に10.9と10.10(MavericsとYosemite)にインストールするのが厄介です。その理由がlibstdc++問題（勝手に自分が命名）です。

libstdc++は、C++の標準ライブラリです。
Caffeに必要な、ソフトウェアをインストールするのに必要なオプションです。
しかし、libstdc++は、OS X 10.9と10.10では対応しておりません。libc++のようです。

ネットで公開されている手順を参考に、10.9 & 10.10にでもCaffeをインストール（ビルド）することはできますが、C++で実装したディープラーニングのプログラムは動きません（これがlibstdc++問題）。

じゃ、Ubuntuで実装すればイイじゃん！ってなります。
しかし、ローカル環境がMacだったりするんで、やっぱりMacにインストールしたいですよね。

ネットの情報を色々さらってたんですが、正しい方法がきちんと取りまとめてなかったので、ここでまとめてみました。

## インストール環境

* マシン：MacBook Pro (Retina, Mid 2012)
* CPU：2.6 GHz Intel Core i7
* メモリ：16 GB
* OSバージョン：10.10.2


## 事前にインストールしておくもの

### **Caffeのリポジトリをクローンする**
まず、CaffeのリポジトリをGitHubからクローンしときましょう。
[ココ](https://github.com/BVLC/caffe/)にアクセスするか、以下のコマンドを端末で叩く。

`git clone https://github.com/BVLC/caffe.git`

クローンするディレクトリ先は、各自、お好みで。

### **Python**
本家の[サイト](https://www.python.org/downloads/)からインストールする。
バージョンは、2.7.9。
Anacondaとかが推奨されていますが、実験環境用の構築やら、あまりオープンなイメージを感じなかったので自分は、避けました。

必要なPythonライブラリをpipでインストールする。
必要なライブラリは、クローンしたCaffeのディレクトリに移動して、以下を端末で叩く。

`pip install -r python/requirements.txt`

pipは、本家サイトのでPythonをインストールしてればデフォルトでインストールされてます。なかったら入れてください。

### **Cuda 7.0**
libstdc++問題を解決するのに最重要事項です。
ほとんどのサイトでは、Cuda6.5をインストールすることを前提にしてます。
しかし、Cuda6.5は、libstdc++しか対応しておりません。
結果、Caffeをビルドしても動きません。

そこで必要なのがCuda7.0です。しかし、まだ正式リリースされてません。リリース候補版となっているため、ユーザ登録しないとインストーラを手に入れることができません。
ちなみにインストーラのダウンロードは[ココ](https://developer.nvidia.com/rdp/cuda-70-rc-downloads)。
登録するには、何に使うのかとか英語で記入しないといけませんが、"Caffe使いたいから"とか適当に書いたら１日でアカウント発行してくれました。

### **その他のソフトウェア**
残りは、Homebrewを使ってインストールします。
Homebrewは、rubyで開発されてるMacのパッケージ管理ソフトなんですかね。
従来のMacPortsと比べて軽量とか。
Homebrewのインストールは、以下のコマンドを端末で叩きます。

`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

ちなみにインストールには、X CodeとCommand Line Toolのインストールが必要です。

**Open BLASのインストール**
以下を端末で叩く。

```
brew tap homebrew/science
brew install homebrew/science/openblas
```

**残りのソフトウェア**
残りもインストールするのですが、その中のboostとboost-pythonは、Caffeでは、バージョン1.55でしか対応していません。

以下のコマンドを端末で叩いて、インストーラ設定ファイルを修正して、バージョンをダウングレードします。

`brew edit (boost or boost-python)`

boostの場合は、28行目らへん。boost-pythonは25行目らへんです。urlとsha1の行を修正します。

```
class Boost < Formula
  homepage 'http://www.boost.org'
->  url 'https://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2'
->  sha1 'cef9a0cc7084b1d639e06cd3bc34e4251524c840'
```

以下のコマンドを端末で叩いてインストールします。

```
for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew install --build-from-source --fresh -vd $x; done
brew install --build-from-source --with-python --fresh -vd protobuf
brew install --build-from-source --fresh -vd boost boost-python
```

余談ですが、OpenCVをPythonから操作したい時、ヘッダーやライブラリファイルのシボリックリンクの作成や、Homebrewで別途Pythonをインストールする必要があります。

以下のコマンドを端末で叩きます。でないとPythonから`import cv`とかやると、`Segmentation error`が出てきてPythonが落ちます。

```
sudo ln -s /usr/local/Cellar/opencv/2.4.10.1/lib/python2.7/site-packages/ /Library/Python/2.7/site-packages/

brew install python
```

HomebrewでPythonをインストールしても問題ありません。

### **Makefileの修正**
Makefileの修正です。何気にココでつまづきます。
ココで何度も何度も失敗して、Macをひっくり返したくなりました。
修正するファイルは、MakefileとMakefile.configの2つです。

`cp Makefile.config.example Makefile.config`

修正箇所は以下。
行頭の　-- はデフォルトで記述されているもので、コメントアウトするか、行を削除してください。
++は、新たに記述するものです。
なので、-- と ++ 実際に記入しないでください。
もしかしたら、個人の環境で違うかもしれませんが、柔軟に対応してください。

```filename:Makefile.config
-- # CUSTOM_CXX := g++4.9
++ CUSTOM_CXX := /usr/bin/clang++

-- #CXXFLAGS := -stdlib=libstdc++
++ CXXFLAGS := -stdlib=libc++

-- #CUDA_DIR := /usr/local/cuda
++ CUDA_DIR := /Developer/NVIDIA/CUDA-7.0

CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
 -gencode arch=compute_20,code=sm_21 \
 -gencode arch=compute_30,code=sm_30 \
 -gencode arch=compute_35,code=sm_35 #\
 -gencode arch=compute_50,code=sm_50 \
 -gencode arch=compute_50,code=compute_50

-- #BLAS := atlas
++ BLAS := open

-- # BLAS_INCLUDE := /path/to/your/blas
-- # BLAS_LIB := /path/to/your/blas
++ BLAS_INCLUDE := /usr/local/Cellar/openblas/0.2.13/include
++ BLAS_LIB := /usr/local/Cellar/openblas/0.2.13/lib

-- #PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
++ PYTHON_INCLUDE := /Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include

-- #PYTHON_LIB := /usr/lib
++ PYTHON_LIB := /Library/Frameworks/Python.framework/Versions/2.7/lib

++ INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include

++ LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib \
 /Developer/NVIDIA/CUDA-7.0/lib

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10
```

```filename:Makefile
-- ifeq ($(shell echo $(CUDA_VERSION) \< 6.5 | bc), 1)
-- CXXFLAGS += -stdlib=libstdc++
-- LINKFLAGS += -stdlib=libstdc++

++ ifeq ($(shell echo $(CUDA_VERSION) \< 7.0 | bc), 1)
++ CXXFLAGS += -stdlib=libc++
++ LINKFLAGS += -stdlib=libc++

#　何か2行あったので、両方とも修正しとく
-- #BLAS_INCLUDE ?= /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
++ BLAS_INCLUDE ?= /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
```

こんな感じでしょうか。
自分は試し試しでやっていたので、何がどれに効いてくるのか、本当に必要かきちんと把握できてないかもしれません。。。
間違い、不足があったら、修正します。

## ビルドする
いよいよビルドです。
ビルドは、Caffeのリポジトリをクローンしたディレクトリ先で、以下のコマンドを端末で叩きます。

`make all -j10`

`-j` は、ビルドする際の並列数です。オプションなしでやると、シングルで行いますが、ビルドには結構時間がかかります。
並列数を指定したほうが、速度はダンチです。自分の環境では、`-j10`で行いました。
もし、ビルドが上手くいかなかったらエラーが返ってきますが、並列数の数だけメッセージが返ってくるのでご注意を。

エラーが出てきたら、対応してください。
だいたい、必要なソフトが入ってなかったり、パスが通ってなかったりです。`~/.bashrc`か`.~/.bash_profile`にパスをきちんと記述してください。

上手く行ったら、テストです。以下のコマンドを端末で叩く。

```
# テストのビルド
make test

# テスト実行
make runtest
```

テスト実行をしたら約1,000のテストが実行されます。
最後の表示は、こんな感じです。

![スクリーンショット 2015-03-15 13.05.58.png](https://qiita-image-store.s3.amazonaws.com/0/23418/f7e00bc0-88c8-130d-5df9-5a69fe113e0f.png)

`YOU HAVE 2 DISABLED TESTS` と出てますが、無視して問題ないようです。
`FAIL` が出て、途中で止まらなければ問題ありません。

**これで完了です！**

この手順でCaffeをビルドすると、[コチラ](http://d.hatena.ne.jp/muupan/20141010/1412895321)のC++のデモは動きました。
Cuda6.5をインストールして、libstdc++でその他ソフトをインストールすると、動きません。

# pycaffe
CaffeをPythonで使いたい場合、またビルドが必要です。
Caffeディレクトリ内で、以下のコマンドを端末で叩く。

`make pycaffe`

こいつはすぐです。

`~/.bashrc`か`~/.bash_profile`に環境パスを書き込みます。

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

`source ~/.bashrc or ~/.bash_profile`

を実行するか、新しい端末を開いて設定を反映させます。

pythonをインタラクティブモードで実行し、

`import caffe`

とやって、無事に通ったら成功です。

-------

他にも困ったことがあったら、Githubに投げてみたら良いかもしれません。ただし英語で。