※注意:この記事は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を導入している前提で記事を書く。
//--周辺パッケージ群--
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でエラーが出た。
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
同様に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
//--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に沢山上がっているので暇はしない。