Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Mac OS X 10.9.5でCaffeする

※注意:この記事はMac OS 10.9が最新だった頃に書かれたものです。2015/6/15に諸事情で再インストールを行いましたがformulaの書き換えが不必要、変更になったりその他ファイルの書き方が変わったりとインストール自体は楽になっています。日々変更があるようですので、記事内同様のエラー等で無い限り最新の別記事を参照した方が良いと思われます。
//--はじめに--

巷で「CaffeをインストールすればConvolution Neural Networkを誰でも簡単に作れる!」「CaffeはDeep Learningの基準!」みたいな意見を見るようになった。機械学習の難しい数式を理解しなくても、高速で最高精度の特徴抽出、認識が出来て、その上、出力や重みの可視化、ネットワーク構成の図まで作れる。つよい。

Caffeは、現GoogleのYangqing Jia氏が作成した。その精度もさることながら、OSSとしての開発速度が驚異的。専用のコミュニティやGithub上での最新アルゴリズムの実装、チュートリアルやドキュメントも完備、ネットワーク構造図も出力出来る事から最近では論文でも実装をCaffeで行ったものがあり"学習済のモデルデータ"まで配布している所もある。

現状強いのはCNN(Convolution Neural Network)で、色んな技術がforkされている。マジでGithub見ているだけでも面白い。本体はCUDAを用いた分散実装で少し読みにくいが、出力等を簡単に制御出来るようになっているし、何よりめっちゃ速い。

いたせりつくせりである

Pylearn2やTheano、sklearnに並ぶ機械学習ライブラリ。CNNで論文書くなら使いたいみたいな感じ。

//--面倒くさがりバイバイ--

素晴らしいライブラリだけあって準備が大変。正直「何が"簡単にCNN出来ます"じゃw」となる。
Linux,Unixではhomebrewやpip、Anaconda等といったパッケージ管理がまず必須。自分でソースファイルをコンパイルしても良いが諸準備が多いのでパス周りがごちゃごちゃにならないようにした方が良い。
加えて公式HPで前準備して欲しいと言っているのはこちら

  • CUDA library
  • BLAS (provided via ATLAS, MKL, or OpenBLAS)
  • OpenCV (>= 2.4)
  • Boost (>= 1.55, although only 1.55 and 1.56 are tested)
  • glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
  • その他rapper

多い。加えて数値計算ライブラリであるnumpyやscipyも必須となる。
全部書くと大変なので、今回はnumpy,scipy,OpenCVは既にインストールされている、パッケージ管理としてbrewとpipを導入している前提で記事を書く。

//--環境--

CaffeではLinux,Unixでの使用を推奨している。
今回の環境はOS X 10.9.5
10.8では簡単に出来てYosemiteだと難しいらしい(要出典)。
Linuxは次の記事で書く。
OS Xではバージョン毎にコンパイラや標準ライブラリが違ったりするので「今のバージョン」や「コンパイラに何を使っているか」を把握しておく必要がある。

//--CUDA library--

NVIDIAが提供するGPGPUが使えたりするライブラリ。これのおかげで速い。
CUDA Downloads
公式ページ(上リンク)から自分のOSに合ったpkgをダウンロード、pkgインストーラを開いて規約を読みつつよしなにインストールする。
Macだととりあえず1つしかpkgがないから選択肢なし。

//--BLAS--

Basic Linear Algebra Subprograms:ベクトルと行列に関する基本線型代数操作を実行するライブラリAPI
オープンソースの移植性の高い最適化BLAS実装としてATLAS、Intel MKS等がある。
CaffeではATLAS、MKL、OpenBLASの3つに対応している。すごい。
標準はATLASであるが、CaffeコミュニティではOpenBLASにするとRun Testにおけるエラーが減ったという書き込みもあるのでどちらがいいかは微妙。

今回はATLASで導入。
http://sourceforge.net/projects/math-atlas/files/Stable/
ここからソースを落としてきて展開する。ディレクトリ内に移動して

$ mkdir build
$ cd build
$ ../configure
$ make

インストール完了。

//--周辺パッケージ群--

glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb。必要な周辺パッケージ群。

左から、ログ取り、コマンドラインのフラグ処理、データの構造化、軽量データベース、圧縮、ファイルの階層構造操作、RAM(インメモリ)上でのデータベース操作用のライブラリ。どれも素晴らしいので1つ1つ見てても面白い。

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

これで終わり。ありがとうhomebrew。

//--boost、boost-python--

Boostの一種で恐ろしく簡単にPythonコードを書けるようになる。
C++でもよく使われるが本当にありがたい。以下でインストール

$ brew install --build-from-source boost boost-python

 

//--諸パッケージ群インストールにおけるエラー--

boost,boost-python,protobufでエラーが出た。

  • boostインストール時のリンクエラー
Error: You must `brew link boost' before boost-python can be installed

boostはC++でも触ったのでそれかも。リンク貼れないらしい。brewをアップデート。

$ brew update
$ brew upgrade

リンクの上書き。

$ brew link boost
$ brew link --overwrite boost

エラーが止まらない。

Error: Could not symlink include/boost/accumulators
/usr/local/include/boost is not writable.

しょうがないのでboostのリンクファイルを消す。バックアップを取ってから

$ sudo rm -r /usr/local/include/boost
$ brew link --overwrite boost

Yeah.

Linking /usr/local/Cellar/boost/1.57.0... 119 symlinks created

 

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink lib/libboost_python.a
Target /usr/local/lib/libboost_python.a
already exists. You may want to remove it:
rm '/usr/local/lib/libboost_python.a'

To force the link and overwrite all conflicting files:
brew link --overwrite boost-python

To list all files that would be deleted:
brew link --overwrite --dry-run boost-python

既にあるから消すかリンク変えてねと。特に使う予定もないのでバックアップを取って消してOverwriteでbrewリンクへ。

$ rm /usr/local/lib/libboost_python.a
$ brew link --overwrite boost-python

Yeah.

Linking symlinks created

 

  • protobufでも同じリンクエラー

同様にrmで削除してからoverwriteしてbrewリンクへ。

Error: Permission denied

が出たらアクセス権限がないので一時的に権限を変更。

$ sudo chown -R $USER /usr/local

Yeah.

Linking symlinks created

 

//--周辺パッケージとコンパイラ--

エラーが治っても問題はある。このままではmake all出来ない。
OS Xでは10.9以降でgccではなくclangをデフォルトコンパイラとして使用している。
clangではlibc++を標準ライブラリとして利用しているが、CUDAやOpenCVでCUDAを使う場合はlibstdc++が必要になる。gccにしても良いが、Macでのgccを他のライブラリのインストールで使って大変だったので、今回はclangで切り抜ける。

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

連続で周辺パッケージのformulaを開く。
デフォルトだとVimで開かれるので、普段Vim使ってない人はaで挿入編集モード、escで抜けて、Shift+Zを2回で保存して終了、ぐらいで大丈夫。
def installの部分に毎回以下を付け加える。

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

連続で表示されるので全て書き換え終わったら

$ 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

でリビルドしておく。
protobufに関しては古いものをアンインストールして再度インストールしておく。

$ brew uninstall protobuf; 
$ brew install --build-from-source --with-python --fresh -vd protobuf

 

//--boost、boost-pythonのバージョン--

boostのバージョンが高い(1.56以上)と後に行うCaffeのテストを通せない。こんな感じでエラーが出ることになる。

$ make runtest
...
[ FAILED ] 3 tests, listed below
caffe::FloatCPU
caffe::DoubleCPU

初期化が上手く出来ていないものだと考えられる。boostのバージョンを下げる。

$ brew edit boost
$ brew edit boost-python

で開いて両者のboostのformulaの部分を以下のように変更

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" 
revision 2

変更したら再度インストールしなおしておく。

$ brew uninstall boost
$ brew uninstall boost-python

アンインストールしてから

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

 

//--Git clone--

ライブラリ本体をダウンロードしておく。
https://github.com/BVLC/caffeGitHub - BVLC/caffe: Caffe: a fast open framework for deep learning.
ここから。Git cloneしても良いしzipでクレしても良いのでもらう。

//--Python等rapper周りの導入--

展開したCaffeのルートディレクトリに移動して周辺のパッケージをインストールする。

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

Caffeのバージョン毎にrequirements.txtの場所が違うので注意する。
コンパイラに「無いよ!」と言われたら検索して適宜変更する。
あとnumpy、scipyをインストールしておかないとダメ。

//--Caffeのコンパイル--

いよいよCaffeコンパイル。公式ではMakefileのconfigを作れとあるが、サンプルが用意されているのでコピーする。
Caffeのルートディレクトリ内で

$ cp Makefile.config.example Makefile.config

Makefile.configのサンプルを見ると、「色々バージョンやOSに合わせて修正してね」という部分があるので修正する。エディタでMakefile.configを開いて

GPUは使わない(使いたい場合コンパイラを変更しないといけないので)のでコメントアウトを外す
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1
OSXではClang++!!と言われているので書き換え
# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
CUSTOM_CXX := clang++

BLAS等の設定もあるが、ATLASの場合はデフォルトなので特に修正しなくて良い。
コンパイルはmakeファイル。Caffeのルートディレクトリ内で

$ make clean
$ make all

エラーがでなければOK

//--テスト--

Caffeディレクトリ内で

$ make test
$ make runtest

エラーが出ばければOK

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

Yeah.

//--感想--

めっちゃつらい

//--これから--

これだけじゃ楽しくCNNするには程遠いのでLinuxでの導入やSublimeTextからCaffe動かして遊べるような記事をいずれ気が向いたら書く。

「パッケージ管理にAnacondaを使うと楽やで」と言う人も居るが、複数回の更新やパス関連を考えるとbrewさまさまといった感じ。pipでも良いとは思う。

サンプルも使い方もGithubに沢山上がっているので暇はしない。

//--参考--

メインで参考にしたのは公式と公式コミュニティのGit Q&Aとこちらのブログ。

DeepLearningライブラリ「Caffe」の実行環境をOSX10.9で作る - モノクロタイム
最高にCOOLだったので筆者をTwitterでフォローするなどした。