モノクロタイム

I'm from the future!

DeepLearningライブラリ「Caffe」の実行環境をOSX10.9で作る

20141211大幅改稿

DeepLearning関連の研究をしているので、様々な機械学習系ライブラリを試してみています。今回はCaffe。

CaffeはC++で実装され、GPUも使えるDeepLearning用ライブラリです。

このライブラリを知る切っ掛けになったYahooデベロッパーネットワークの記事によると、

大規模画像認識のコンテストILSVRCで2012年にトップとなった畳込みニューラルネットワークの画像分類モデル[1]がすぐに利用できるようになっています。

Caffeは、カリフォルニア大学バークレー校のコンピュータビジョンおよび機械学習に関する研究センターであるBVLCが中心となって開発しているOSSです。
ヤフージャパンは2014年6月から同センターのスポンサーになっており、Caffeの開発を含めたセンターの研究の支援を行っています。

とのこと。ふむふむ、結構使えそうじゃない。ということで、実行できる環境を作っていこうと思います。

Caffe自体はLinuxOS、OSXでの使用を推奨していますので、今回はMac OS X Mavericks上で環境を作ります。
Homebrewを多用していますので,Homebrewが未導入の場合は以下のコマンドでHomebrewを導入してください.

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

Caffeの公式インストールガイドはこちらから。
Caffe | Installation

CUDAのインストール

まずはCUDA6.5のインストール。
CUDA Toolkit 11.6 Update 1 Downloads | NVIDIA Developer
MacOSは10.8~10.10に対応しているようです。自分が使っているOSのバージョンに合わせてダウンロードしてください。

BLASのインストール

BLASですが、公式インストールガイドによると

・ATRAS
Intel MKL
・OpenBLAS

この3つのうちどれかを落としてくる必要があるようです。
OSX10.9,10.10ではATLASが入っていないようです.CaffeではATLASを標準BLASとして採用しているようなので,ATLASをインストールします.OpenBLASのインストール方法も簡潔に残しておきます.
ソース:
https://groups.google.com/forum/#!topic/caffe-users/J5YlVnfoo4A

ATLASの導入

以下のURLからソースを落としてきて,適当な場所に展開します.
http://sourceforge.net/projects/math-atlas/files/Stable/
バージョンは3.10.2を選択しました.
展開したら,展開ファイルまで移動して以下のコマンドでインストールします.

$ mkdir build && cd build
$ ../configure
$ make
OpenBLASの導入

Homebrewを使っている人は以下のコマンドで一発で入ります。

brew install homebrew/science/openblas

これでOpenBLASのインストールが完了します.
caffeでは,デフォルトで使用するBLASはATLASですので,OpenBLASを使うよう定義する必要があります.
caffeのファイル内のMakefile.configで,BLAS:=openと追記しておくことを忘れないように.

Pythonのインストール

caffeのルートディレクトリに移動して.以下のコマンドで必要パッケージを導入できます.Anacondaを使うと楽らしいですが,パス通したり何だりのことを考えると,以下の方法でインストールする方が簡単でいいと思います.

$ sudo pip install -r /path/to/python/requirements.txt

途中scikit-imageやmatplotlibでインストールが止まる場合は,numpyとscipyを先にインストールしておくと通ります.

$ brew install numpy
$ brew install scipy

依存パッケージのインストール

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

10.9以降のOSXはClangがCのデフォルトコンパイラで,libc++がスタンダードライブラリになっているけど,CUDAを使う場合はlibstdc++が必要だから,依存パッケージのformula書き換えてねって書いてあります.
以下のコマンドで依存パッケージのformulaを続々と開き,

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

以下の設定を付け加えます.

 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++"
      ...

すべてのformulaeを書き換えたら,

$ 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 install --build-from-source --fresh -vd boost boost-python

コンパイル

Caffeのルートディレクトリに移動し,

$ cp Makefile.config.example Makefile.config
$ make all

Makeする前に,CPUのみでCaffeを行う場合は,Makefile.configにCPU_ONLY:=1の行をアンコメントしておくことを忘れずに.
なお,GPUを使う,つまりcuDNN演算を行う場合はUSE_CUDNN:=1をアンコメントしておきます.
makeが通ったら,

$ make test
$ make runtest

でエラーが無いことを確認します.

エラーが出る場合

hdf5.hがない!
homebrewで一発インストール.

$ brew install hdf5

make runtestで3つテストが通らない!

[----------] Global test environment tear-down
[==========] 457 tests from 98 test cases ran. (25168 ms total)
[  PASSED  ] 454 tests.
[  FAILED  ] 3 tests, listed below:
[  FAILED  ] PowerLayerTest/0.TestPowerGradientShiftZero, where TypeParam = caffe::FloatCPU
[  FAILED  ] PowerLayerTest/1.TestPowerGradient, where TypeParam = caffe::DoubleCPU
[  FAILED  ] PowerLayerTest/1.TestPowerGradientShiftZero, where TypeParam = caffe::DoubleCPU

こんなかんじのやつ.
Makefile.configのBLASのフラグ設定が間違っているか,boost,boost-pythonのバージョンが1.56以上だとテストが通りません.
boost,boost-pythonのダウングレード方法は,

$ brew edit boost
$ brew edit boost-python

formuraを以下のように書き換えます.

class BoostPython < 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'
   head "https://github.com/boostorg/boost.git" 

書き直したらmake clean&make allしなおします.

同じようにすればYosemiteでも動くんじゃないかなぁ…後々試してみます.
これで公式チュートリアルも動くはず….