ec2のAmazon Linuxにcaffeをインストールする方法

いやー、だいぶ間が開いてしまいました。

久々の更新はEC2のGPUインスタンスでCaffeを使う方法です。 Caffeというのは、今流行のDeep Learningをそこそこ(?)お手軽に使うためのライブラリです。 C++で書かれており、PythonMatlabから呼び出せます。

Deep Learningのライブラリは他にもいくつかあるのですが、他のものに比べると、比較的直感的に扱いやすいかなと思います。

EC2インスタンス起動

CaffeはGPU/CPUの両方に対応したライブラリです。 CPUでは速度的になかなか厳しいものがあるので(特に学習)、 GPUを主に使うことになります。

というわけで、EC2でGPUインスタンスを起動します。執筆時点ではg2.2xlargeが利用可能です。

CUDAインストール

ダウンロード

Nvidiaのページから、CUDA Toolkit 6.5をダウンロードします。

Amazon LinuxRedhat系なので、私はいつも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インストール

glogアーカイブをダウンロードし、ビルドします。

$ ./configure
$ make -j8
$ make check
$ sudo make install

gflagsインストール

gflagsアーカイブをダウンロードし、ビルドします。

$ mkdir build
$ cd build/
$  CXXFLAGS="-fPIC" cmake ..
$ make -j8
$ sudo make install

-fPICをつけておかないとcaffeにリンクできません。 参考:https://github.com/BVLC/caffe/issues/890

leveldbインストール

leveldbアーカイブをダウンロードし、ビルドします。

$ make -j8
$ make check
$ cd ..
$ sudo mv leveldb-1.15.0 /opt/leveldb

hdf5インストール

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様とのプロジェクトで得たノウハウを元に執筆しています。本記事の公開をご快諾いただき、ありがとうございました。