素人がCaffeを使ってDeepLearningしてみた(導入編)

#はじめに
この記事は
1. Deep Learningって何？を説明する [概要編](http://qiita.com/yuishihara/items/abb59555dca9b34a59f0)
2. Deep Learningライブラリの一つであるCaffeのインストールする 導入編(この投稿)
3. Caffeを使って簡単な学習をさせてみる [実践編](http://qiita.com/yuishihara/items/3f0adf0877cd8fe1c394)
の三本構成になっています

タイトルにもありますが、Deep Learningの研究者でもなんでもない素人が残した記録程度の投稿なので、間違った記述があるかもしれない点はご容赦いただき、読んでいただくようお願いします
(もしおかしい点があればコメントで指摘していただけると嬉しいです)

#インストール環境
OS:Ubuntu 14.04 LTS
CPU: Core i7 2.93GHz
GPU: GeForce GTX 960
メモリ: 4GB

#Caffeインストール手順
基本的には[Caffe公式ページ](http://caffe.berkeleyvision.org/installation.html)に書いてある通りにやります
ここでは、構成を下記の様にしますが、環境に合わせて適宜変えてください
CUDA 7.0
cudnnを使う
ATLAS
Caffe(githubのマスターにある最新)
PyCaffeも使えるようにする

#General dependenciesのインストール
素直に公式に従う

```console:
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
```

#Remaining dependencies(14.04用)のインストール
これも素直に公式に従う

```console:
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
```

#ATLASのインストール
ATLASって何？って感じですが、数値計算(多分行列の微分とかする)用のライブラリ
Ubuntuなら簡単

```console:
sudo apt-get install libatlas-base-dev
```

#CUDAのインストール(GPU使う人だけ)
Ubuntuだとapt-getでいけるって書いてあるのですが、いろいろ見たところnVidia公式から取ってきて自前で入れたほうがいいっぽいので、自前で入れることにしました
(最新は7.5のようですが、7.0のときと同じだと思うのでそのまま書きます)
##CUDA本体のインストール
[nvidiaのdeveloperサイト](https://developer.nvidia.com/)からCUDA ZONE→CUDA DOWNLOADSと進んでCUDAのインストーラを落とします
その後(xxxは適宜落としたversionに読み替えてください)インストーラを実行します

```console:
chmod +x cuda_xxx_linux.run
sudo ./cuda_xxx_linux.run
```

あとは画面の指示に従うだけ

##cudnnのインストール
必須ではないようですが、公式によると、入れたほうが速いらしいので入れます
>cuDNN Caffe: for fastest operation Caffe is accelerated by drop-in integration of NVIDIA cuDNN. To speed up your Caffe models, install cuDNN then uncomment the USE_CUDNN := 1 flag in Makefile.config when installing Caffe. Acceleration is automatic. The current version is cuDNN v3; older versions are supported in older Caffe.

###ユーザ登録
上の[nvidiaのdeveloperサイト](https://developer.nvidia.com/)からdeveloper登録しておきます

###インストール
登録後、cudnnがダウンロードできるようになるので、[ここ](https://developer.nvidia.com/cudnn)からダウンロードする
そうしたら

```console:
sudo cp cudnn.h /usr/local/cuda/include/
sudo cp *.so /usr/local/cuda/lib64/
sudo cp *.a /usr/local/cuda/lib64/
```

として、ライブラリをコピーします
加えて、展開したファイル内にあるシンボリックリンクと同様のものを、
/usr/local/cuda/lib64内に作成してください(以下はダウンロード時の6.5のとき)

```console:
cd /usr/local/cuda/lib64/
sudo ln -s libcudnn.so.6.5.48 libcudnn.so.6.5
sudo ln -s libcudnn.so.6.5 libcudnn.so
```

#Caffeのインストール
これで準備は整いましたので早速入れていきます(pythonまわりで必要なものは別途準備出来ているものとします)

##Caffeをダウンロード
ここが何故か公式にちゃんと書いてくれてないんですが、githubから落とすのが正式なようです

```
git clone https://github.com/BVLC/caffe.git
```

##PyCaffeに必要なもののインストール
公式にある通り

```console:
for req in $(cat requirements.txt); do pip install $req; done
```

で終わりです。requirements.txtはcaffe/pythonに有ります
自分の環境ではgfortranが入っていなかったため、scipyのインストールで一回こけました。

```console:
error: Setup script exited with error: library dfftpack has Fortran sources but no Fortran compiler found
```

そのときはgfortranを入れてください。

```console:
sudo apt-get install gfortran
```

##Makefile.configの修正
これが重要です。ここをミスるとないものを使ってビルドしようとしたり、エラーのどつぼにハマる可能性があります
まずMakefile.config.exampleをコピーしてMakefile.configの原型をつくります

```console:
cp Makefile.config.example Makefile.config
```

Makefile.configが次のようになっていることを確認します。(環境によって適宜変えてください)
USE_CUDNN := 1 (cudnnを使う場合)
CPU_ONLY := 1 (GPUを使う場合コメントアウト)
CUDA_DIR := /usr/local/cuda (CPU_ONLYの場合はたぶんいらない)
CUDA_ARCH := -gencode arch=compute...のどの行もコメントアウトされていない(CPU_ONLYの場合はたぶんコメントアウト)
BLAS := atlas
PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/lib/python2.7/dist-packages/numpy/core/include
PYTHON_LIB := /usr/lib
あとはexampleのまま
##makeする
以上がおわったらもうすぐです。プロジェクトのルートでmakeしてください
(j8の部分はなくてもOKです。数字はCPUのコア数に合わせて適宜変えてください)

```console:
make all -j8
```

##正常にinstallできたかテストを回す
ここまできちんとできているか確認するため最後にテストをします

```console:
make runtest
```

次のようなログが数分続きます

```console:
[----------] 3 tests from DeconvolutionLayerTest/0, where TypeParam = caffe::CPUDevice<float>
[ RUN      ] DeconvolutionLayerTest/0.TestSetup
[       OK ] DeconvolutionLayerTest/0.TestSetup (0 ms)
[ RUN      ] DeconvolutionLayerTest/0.TestSimpleDeconvolution
[       OK ] DeconvolutionLayerTest/0.TestSimpleDeconvolution (1 ms)
[ RUN      ] DeconvolutionLayerTest/0.TestGradient
[       OK ] DeconvolutionLayerTest/0.TestGradient (623 ms)
[----------] 3 tests from DeconvolutionLayerTest/0 (624 ms total)
```

最後に次のようにPASSEDが出たら成功です

```console:
[==========] 1404 tests from 222 test cases ran. (221949 ms total)
[  PASSED  ] 1404 tests.
```

もし失敗した場合はMakefile.configの設定があっているかどうか確認してやり直してみてください。

#さいごに
おつかれさまでした。
次の記事では実際にCaffeを使ってDeep Learningの学習を走らせて見たいと思います