【Caffe】はじめてCaffeをmakeするまでOn Ubuntu16.04

Ubuntu16.04LTで機械学習ライブラリを動かすまでを記録した.
ライブラリとしてはCaffeを選択.
Caffe
基本↑に沿ってすすめる.
http://robotics4society.com/2016/06/15/ubuntu1604-caffe/
他にも,↑も非常に参考になる.

PCの構成

OS: Ubuntu 16.04
CPU: Intel Core i7 3.33GHz

General dependencies

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev

OpenCVのインストール

まずOpenCVに関連するソフトをインストールする.

sudo apt-get install build-essential cmake git

sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

次に公式サイトからOpenCV3.1をダウンロードする.
http://opencv.org/downloads.html
ダウンロードしたものを解凍して,解凍したディレクトリに移動して,以下のコマンドを実行する.

unzip opencv-3.1.0.zip
cd opencv-3.1.0
mkdir build
cd build/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
make

cmakeでビルドしたら,次は,makeを使ってインストール.
これがかなり時間かかる.

sudo make install
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
sudo apt-get update

念のため再起動

#インストールできたか確認.
pkg-config --cflags opencv
pkg-config --libs opencv


(参考)
https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-OpenCV-3.1-Installation-Guide

GPUドライバのインストール

「システム設定」->「詳細」の画面で,グラフィックの欄に正しいGPUが認識されてれば大丈夫.
私の場合はなぜかGallium 0.4 on llvmpipeというドライバを使っていた(謎)

正しくない場合は,「システム設定」->「ソフトウェアとアップデート」->「追加のドライバ」でドライバを選択し,変更の適用をする.

CUDAインストール

CUDAのインストールの際,
ubuntu16.04に対応しているのはCUDA Toolkit 8.0RCのみなので,
CUDA Toolkit 8.0RCをインストールする.

CUDA Toolkit 8.0RCダウンロード
https://developer.nvidia.com/cuda-release-candidate-download

OSやArchなどを入力し,installer typeとしてdebを落とします.
あとは

sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

cuDNNのインストール.
NVIDIAのサイトからcuDNNを手動でダウンロードしてくる
https://developer.nvidia.com/cudnn

tar -zxf cudnn-8.0-linux-x64-v5.0-ga.tgz
sudo cp -a cuda/lib64/* /usr/local/lib/
sudo cp -a cuda/include/* /usr/local/include/
# sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
# sudo cp include/cudnn.h /usr/local/cuda/include
sudo ldconfig

この時点で一回rebootして,
ディスプレイがちゃんと表示されるか確認します.

BLAS

数値計算ライブラリを導入

sudo apt-get install libatlas-base-dev

代わりにMKLいれてもいいらしい.

python

pythonじゃなくてc++で使うつもりだが,
とりあえず指示にしたがう.

sudo apt-get install python-dev

残りの依存関係

sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

(参考)
Ubuntu 16.04へのCUDAインストール方法 - Qiita
http://qiita.com/schwalbe1996/items/8934045b0290f895e2bd

githubからcaffeをクローン

sudo apt-get install git
git clone https://github.com/BVLC/caffe.git

(参考)
http://qiita.com/TD72/items/1bab76e395243defcc06

Makefile.configの設定

cuDNNを使うので,
Makefile.config.exampleの4行目をアンコメントアウト
Makefile.configとして保存.

python pipによるインストール

同じくcaffeのディレクトリで,

cd python
for req in $(cat requirements.txt); do pip install $req; done

make

「boostない」

makeすると,fatal error: boost/function.hpp...
と,boostがないと怒られる
f:id:yusuke_ujitoko:20160618201136p:plain

なので,

sudo apt-get install libboost-all-dev

としてboost入れる.

「hdf5ない」

再度makeすると,今度はhdf5がないと怒られる.

f:id:yusuke_ujitoko:20160618201201p:plain

sudo apt-get install libhdf5-dev

をして,
Makefile.configのINCLUDE_DIRをいじる.たとえば,↓のようにして,
hdf5のディレクトリを追記する.

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
CUDAのパスを通す

makeして,nvccが見つからないと言われた.

f:id:yusuke_ujitoko:20160618195141p:plain

Makefile.configの中を見ていると,
cuda toolkitをsudo apt-get install nvidia-cuda-toolkitコマンドでインストールした場合,CUDA_DIR := /usrで指定する必要があるらしい.

CUDA_DIR := /usr/local/cuda
コメントアウトし,
CUDA_DIR := /usr
をアンコメントアウトして解決.

#CUDA_DIR := /usr/local/cuda
CUDA_DIR := /usr

(参考)
http://stackoverflow.com/questions/30500977/fails-to-build-caffe-on-ubuntu-15-04

「memcpyがない」

memcpyが宣言されていないと言われた.
f:id:yusuke_ujitoko:20160618195240p:plain
これはubuntu16.04にcaffeインストールするときに起きる問題らしい.

これの回避策はいくつかあって,

1. CMakefile.txtを修正する.
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

2. /usr/local/cuda/include/host_config.hのgcc versionを取り除く

3. CMakefile.txtを修正する
CXXFLAGS += -D_GLIBCXX_USE_CXX11_ABI=0

がある.私は1を選択.
Makefile,406行目を以下のように修正

#NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

(参考)
https://github.com/BVLC/caffe/issues/4046
Build caffe fails on Ubuntu 16.04 (‘memcpy’ was not declared in this scope) - eagelangel的专栏 - 博客频道 - CSDN.NET

再度「hdf5がない」

f:id:yusuke_ujitoko:20160619102325p:plain
上で,Makefile.configのINCLUDE_DIRSでhdf5の場所を正しく書いているのに,
まだ,lhdf5とlhdf5_hlがないと怒られる.

hdf5のライブラリの入っている,/usr/lib/x86_64-linux-gnu/を見ると,
libhdf5.soやlibhdf5_hl.soはなくて,
代わりにそれぞれ,libhdf5_serial.soやlibhdf5_serial_hl.soになっている.
なのでそれぞれシンボリックリンクをはって,

cd /usr/lib/x86_64-linux-gnu
sudo ln -s libhdf5_serial.so.10.1.0 libhdf5.so
sudo ln -s libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so

(参考)
https://github.com/NVIDIA/DIGITS/issues/156

これでmakeは通るようになった.

make all
make test
make runtest
make pycaffe