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からクローンしときましょう。
ココにアクセスするか、以下のコマンドを端末で叩く。
git clone https://github.com/BVLC/caffe.git
クローンするディレクトリ先は、各自、お好みで。
Python
本家のサイトからインストールする。
バージョンは、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です。しかし、まだ正式リリースされてません。リリース候補版となっているため、ユーザ登録しないとインストーラを手に入れることができません。
ちなみにインストーラのダウンロードはココ。
登録するには、何に使うのかとか英語で記入しないといけませんが、"Caffe使いたいから"とか適当に書いたら1日でアカウント発行してくれました。
その他のソフトウェア
残りは、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
修正箇所は以下。
行頭の -- はデフォルトで記述されているもので、コメントアウトするか、行を削除してください。
++は、新たに記述するものです。
なので、-- と ++ 実際に記入しないでください。
もしかしたら、個人の環境で違うかもしれませんが、柔軟に対応してください。
-- # 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
-- 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のテストが実行されます。
最後の表示は、こんな感じです。
YOU HAVE 2 DISABLED TESTS
と出てますが、無視して問題ないようです。
FAIL
が出て、途中で止まらなければ問題ありません。
これで完了です!
この手順でCaffeをビルドすると、コチラの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に投げてみたら良いかもしれません。ただし英語で。