ec2のAmazon Linuxにcaffeをインストールする方法
いやー、だいぶ間が開いてしまいました。
久々の更新はEC2のGPUインスタンスでCaffeを使う方法です。 Caffeというのは、今流行のDeep Learningをそこそこ(?)お手軽に使うためのライブラリです。 C++で書かれており、PythonやMatlabから呼び出せます。
Deep Learningのライブラリは他にもいくつかあるのですが、他のものに比べると、比較的直感的に扱いやすいかなと思います。
EC2インスタンス起動
CaffeはGPU/CPUの両方に対応したライブラリです。 CPUでは速度的になかなか厳しいものがあるので(特に学習)、 GPUを主に使うことになります。
というわけで、EC2でGPUインスタンスを起動します。執筆時点ではg2.2xlargeが利用可能です。
CUDAインストール
ダウンロード
Nvidiaのページから、CUDA Toolkit 6.5をダウンロードします。
Amazon LinuxはRedhat系なので、私はいつもRHEL6の行の"RUN"からダウンロードしています。(RPMでもできるのかもしれませんが、やったことはありません。)
インストール後、数GBを消費しますので。あらかじめ容量を空けておくことをおすすめします。
インストール
以下のコマンドでインストールします。 このとき、ディスクの容量チェックや、ビルド環境のチェックが自動的に行われているようです。
$ chmod 755 cuda_6.5.14_linux_64.run $ ./cuda_6.5.14_linux_64.run --verbose
インストールは対話式に進みます。 EURAへの同意が必要です。 途中で、
You are attempting to install on an unsupported configuration. Do you wish to continue?
と出ますが、ここはyesにしないと先に進めません。 その他は全て"yes"にし、パスなどはデフォルトのままにします。
環境設定
CUDAを利用するユーザーにて、
- PATHに/usr/local/cuda/bin
- LD_LIBRARY_PATHに/usr/local/cuda/lib64/
を設定します。($HOME/.bashrcにでも書いておけば良いでしょう)
GPUの動作確認として、以下のコマンドを実行します。 以下のように表示されれば成功です。
$ nvidia-smi -q -a ==============NVSMI LOG============== Timestamp : Thu Jan 1 07:04:24 2015 Driver Version : 340.29 Attached GPUs : 1 GPU 0000:00:03.0 Product Name : GRID K520 ...
※yum updateなどの際に、kernelがアップデートされるとGPUドライバがリセットされる事があります。リセットされたかどうかは、上記のnvidia-smiコマンドが成功するかどうかでわかります。リセットされた際はCUDA Toolkitを再度インストールすると直ります。
Pythonのインストール
CaffeをPythonから呼び出したいという需要はそれなりにあると思います。 今回はCaffeからシームレスに使えるPythonのインストール法を紹介します。 pyenvを使ってインストールします。
Atlasのインストール
AtlasをインストールするとNumpyが高速化されたりして色々とお得です(Caffeでも必要です)。さくっとインストールしましょう。
$ sudo yum install atlas-sse3-devel.x86_64
環境変数ATLAS,BLAS,LAPACKを設定します。$HOME/.bashrcに設定しましょう。
export ATLAS=/usr/lib64/atlas-sse3/libatlas.a export BLAS=/usr/lib64/atlas-sse3/libcblas.a export LAPACK=/usr/lib64/atlas-sse3/liblapack.a
Boostのインストール
caffeのPythonラッパはboost-pythonというライブラリで開発されています。 そのため、Boostライブラリが必要になります。 BoostはCaffeでも必要なので、boost-pythonだけでなく全部入れてしまいましょう。
sudo yum install boost-devel.x86_64
pyenvのインストール
pyenvのインストールには便利なpyenv installerというものがありますので、それを利用します。
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
以下の行を.bashrcに追加します。
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
設定を有効化します。
source ~/.bashrc
pyenvによるPythonインストール
執筆時点での最新版をインストールします。依存ライブラリのエラーが発生した場合は、適時yumでインストールしてください。
CONFIGURE_OPTS="--enable-shared --enable-unicode=ucs4" pyenv install 2.7.9
ポイントはCONFIGURE_OPTSでビルド引数を与えているところです。 --enable-sharedをつけると、外部プログラムがPythonにリンクできるようになります。(caffeで必要かどうかよくわからないのですが、必要になったときにこれが無効になっていると再ビルドになるため、私は普段からつけています。) --enable-unicode=ucs4というのは、文字列の扱い方…だそうです。(詳しいことはよく知らない。) そもそも、Amazon Linux付属のPythonがucs4でビルドされていることから、boost-pythonライブラリもucs4でビルドされているらしいです。そのboost-pythonにリンクするためには、今ビルドしているPythonもそれに併せてucs4にしないといけないということらしいです。
最後に、以下のコマンドでデフォルトのPythonを設定します。
$ pyenv rehash $ pyenv global 2.7.9 $ pyenv rehash
numpyのインストール
定番のnumpyライブラリです。さくっとインストールしましょう。
pip install numpy
Atlasがリンクされたかどうかは、numpy.config.show()で確認できるそうなので、確認します。
>>> import numpy as np >>> np.__config__.show() atlas_threads_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\"3.8.4\""')] language = f77 include_dirs = ['/usr/include'] blas_opt_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\"3.8.4\""')] language = c include_dirs = ['/usr/include'] atlas_blas_threads_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\"3.8.4\""')] language = c include_dirs = ['/usr/include'] openblas_info: NOT AVAILABLE lapack_opt_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\"3.8.4\""')] language = f77 include_dirs = ['/usr/include'] openblas_lapack_info: NOT AVAILABLE lapack_mkl_info: NOT AVAILABLE blas_mkl_info: NOT AVAILABLE mkl_info: NOT AVAILABLE
無事Atlasにリンクされました。
Caffeのインストール
基本的には、Caffeの公式ページに書いてあるとおりにインストールすれば良いですが、 Amazon Linuxでは色々とライブラリが足りないので、そのあたりを自力でこつこつとインストールする必要があります。
OpenCVのインストール
OpenCVはCMakeでビルドしますのでyumでインストールします。
$ sudo yum install cmake
Linux版のアーカイブを公式サイトからダウンロードします。 アーカイブを解凍したディレクトリで以下のコマンドを実行します。
$ mkdir build $ cd build/ $ cmake .. $ make -j8 $ sudo make install
yumで入れられるものは入れる
sudo yum install protobuf-devel snappy-devel
glogインストール
$ ./configure $ make -j8 $ make check $ sudo make install
gflagsインストール
$ mkdir build $ cd build/ $ CXXFLAGS="-fPIC" cmake .. $ make -j8 $ sudo make install
-fPICをつけておかないとcaffeにリンクできません。 参考:https://github.com/BVLC/caffe/issues/890
leveldbインストール
$ make -j8 $ make check $ cd .. $ sudo mv leveldb-1.15.0 /opt/leveldb
hdf5インストール
$ ./configure --prefix=/usr/local/hdf5 --enable-fortran --enable-cxx $ make -j8 $ make -j8 check $ sudo make install $ sudo make check-install
lmdbインストール
gitoriousのリポジトリからソースコードを取得し、ビルド、インストールします。
$ git clone https://gitorious.org/mdb/mdb.git $ cd mdb/libraries/liblmdb/ $ make -j8 $ make -j8 test $ sudo mkdir /usr/local/man $ sudo make install
caffe本体のインストール
githubからcaffeのコードを取得し、ビルドします。
$ git clone https://github.com/BVLC/caffe.git $ cd caffe $ cp Makefile.config.example Makefile.config
Makefile.configを編集します。 diffをとるとこんな感じ。
$ diff Makefile.config.example Makefile.config 47,48c47,48 < PYTHON_INCLUDE := /usr/include/python2.7 < /usr/lib/python2.7/dist-packages/numpy/core/include --- > PYTHON_INCLUDE := /home/ec2-user/.pyenv/versions/2.7.9/include/python2.7 > /home/ec2-user/.pyenv/versions/2.7.9/lib/python2.7/site-packages/numpy/core/include/ 55c55 < PYTHON_LIB := /usr/lib --- > PYTHON_LIB := /home/ec2-user/.pyenv/versions/2.7.9/lib 59,60c59,60 < INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include < LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib --- > INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/local/hdf5/include /opt/leveldb/include > LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/local/hdf5/lib /opt/leveldb /usr/lib64/atlas-sse3
$ make -j8 all $ make test $ make runtest
runtestを通すためには、以下の環境変数をセットする必要がありました。(.bashrcに追加)
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/leveldb:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/hdf5/lib:$LD_LIBRARY_PATH
Python Wrapperのインストール
pythonディレクトリにwrapperのコードが含まれています。 pythonディレクトリに移動して、以下のコマンドを実行します。
$ pip install six $ sudo yum search libpng $ sudo yum install freetype-devel libpng-devel $ CPATH=/usr/local/hdf5/include LIBRARY_PATH=/usr/local/hdf5/lib pip install -r requirements.txt $ cd .. $ make -j8 pycaffe
ビルドが完了したら、pythonディレクトリを環境変数PYTHONPATHに追加してください。(.bashrcに追加)
動作確認します。
$ python Python 2.7.9 (default, Jan 1 2015, 07:35:16) [GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import caffe >>>
できた!
謝辞
この記事は株式会社Ikkyo Technology様とのプロジェクトで得たノウハウを元に執筆しています。本記事の公開をご快諾いただき、ありがとうございました。