About connecting the dots.

data science related trivial things

Mac OS X 10.10にCaffeをインストールするまで

メモ代わりに手順まとめておきます.基本は install_caffe_osx10.10.md
CaffeをOS X 10.10 にインストールした // ichyo.jpを参考に,細かい修正を幾つか,という感じです.マシンはmac mini late 2012(core i7 2.3GHz quad core)です.

CUDA

CUDAとドライバーをインストール.しかしGPUIntel HD Graphics 4000なのでCUDAが使えないことに,後から気がつく... 手順的にはpkgとかdmg落としてきて,そのまま入れるだけ.

BLAS

MacにはもともとBLASが入っているので,何もする必要なし*1

Anaconda

Python周りのものをあらかた入れる.

brew install pyenv
pyenv install anaconda-2.0.1
pyenv rehash
sudo pyenv local anaconda-2.0.1
sudo pyenv global anaconda-2.0.1

OpenCV

OpenCV入れるためには,Homebrewをちゃんとupdateしないといけなかった.

brew update
brew tap homebrew/science
brew install opencv

Boost

formula変更

Homebrewのformulaを変更してから入れる.

Boost

1.55固定にするようにformulaを修正.

cd /usr/local
git checkout a252214 /usr/local/Library/Formula/boost.rb
C++の標準ライブラリをlibstdc++にする

下記コマンドで,該当ライブラリのformulaを開く.

for x in snappy leveldb protobuf gflags glog szip boost boost-python lmdb homebrew/science/opencv; do brew edit $x; done

開いたformulaに以下の修正を加える*2

def install
+    # ADD THE FOLLOWING:
+    ENV.append "CXXFLAGS", "-stdlib=libstdc++"
+    ENV.append "CFLAGS", "-stdlib=libstdc++"
+    ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++"
+    # The following is necessary because libtool likes to strip LDFLAGS:
+    ENV["CXX"] = "/usr/bin/clang++ -stdlib=libstdc++"
Boost.python

1.55固定にするようにformulaを修正.

brew edit boost-python

でファイルを開いて以下の修正を加える.

   homepage "http://www.boost.org"
-  url "https://downloads.sourceforge.net/project/boost/boost/1.56.0/boost_1_56_0.tar.bz2"
-  sha1 "f94bb008900ed5ba1994a1072140590784b9b5df"
+  url 'https://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2'
+  sha1 'cef9a0cc7084b1d639e06cd3bc34e4251524c840'
+  revision 2
   head "https://github.com/boostorg/boost.git"

Boostのインストール

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

ここまでで前準備終わり.

Caffe

ようやくCaffe本体のインストールに突入.落としてきたら設定をいくつか修正してmakeします.

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

Makefile.config

GPUモードが使えないので,CPU_ONLYのコメントアウトを外す.

# CPU-only switch (uncomment to build without GPU support).
- # CPU_ONLY := 1
+ CPU_ONLY := 1

Makefile

10.9やBLAS_INCLUDEあたりで検索して,該当箇所を以下のように修正.

OSバージョンの修正
-   ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),)
+   ifneq ($(findstring 10.10, $(shell sw_vers -productVersion)),)
        CXXFLAGS += -stdlib=libstdc++
        LINKFLAGS += -stdlib=libstdc++
    endif
BLASのパス修正
else ifeq ($(OSX), 1)
    # OS X packages atlas as the vecLib framework
-   BLAS_INCLUDE ?= /System/Library/Frameworks/vecLib.framework/Versions/Current/Headers/
+   BLAS_INCLUDE ?= /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
    LIBRARIES += cblas
-   LDFLAGS += -framework vecLib
+   LDFLAGS += -framework Accelerate
endif

パスの追加

ビルドの前にこっちをやっておかないと,make testかmake runtestあたりで,DYLD_FALLBACK_LIBRARY_PATHが指定されてないことによるエラーが出るはず..zshrcにパスを追加して*3再読み込み.

vim ~/.zshrc
# pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi

# caffe
export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH
export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/cuda/lib:$HOME/.pyenv/versions/anaconda-2.0.1/lib:/usr/local/lib:/usr/lib
source ~/.zshrc

コンパイルとテスト

make all
make test
make runtest

正常に終われば,以下のような結果が出るはず.

[----------] Global test environment tear-down
[==========] 457 tests from 98 test cases ran. (11489 ms total)
[  PASSED  ] 457 tests.

pycaffe

Pythonから呼ぶので,こちらもmakeして,protobufを入れておく.

make pycaffe
pip install protobuf

Pythonから呼ぶ

エラーが出る

ipythonからcaffeを呼ぼうとすると,以下のようなエラーが出る.

caffe Fatal Python error: PyThreadState_Get: no current thread

で,ipythonj自体が強制終了してしまう.caffe-userフォーラムでのやり取りを参考に,boost-pythonを以下のように入れ直したら直った.

brew uninstall boost-python
brew install --build-from-source --fresh -vd boost-python

これにてインストール完了.

最後に

はまったところ

  • OpenCV入れるためにbrew tap homebrew/scienceしたところ,普通にエラーが出たので,brew doctorして,エラーを解消してからbrew updateかけるはめになって割とだるかった
  • MakefileBLASのパス修正するところ,BLAS_INCLUDEだけじゃなくて,LDFLAGSも修正しなきゃいけないことに気づかなくて修正してなかったら,make testのところで "clang: error: linker command failed with exit code 1" というエラーがでて,原因がよくわからず結構つまった.ちゃんとエラーを読むと,vecLibが見つからないよエラーだったので,手順を見直して把握,という流れ
  • 自分のマシンのGPUのことを考えてなくて,CPU_ONLYフラグをアンコメントしなかったことで何度もmake runtestでこけるという失態.それも "CUDA driver version is insufficient for CUDA runtime version." とかいわれるので,何回かCUDAを入れ直すはめに
  • 最後にPythonからcaffeを呼ぶところでFatal errorが出て,これまた詰まる.いろいろググったけど,結局フォーラムのやり取りをもとに入れ直すだけでよかった

感想

結局最初から最後まで,だいたい4時間くらいかかりました.だいぶくたびれたので,imageNetとか触るのはまた今度ということで.こっちもちゃんとドキュメント読まないと,動かせるようになるまでちょっとかかりそう.

*1:ただし10.10は10.9までとパスが変わっているので,make時のmakefile.configを修正する必要あり.

*2:追加した行には+,削除する行には-を,行頭に入れています.

*3:もちろんbashなら.bashrcで.