ubuntu18環境でCaffeをビルドする 

# 概要
Ubuntu18.04環境でCaffeをビルドしたときにメモを残しておく。

このメモは、ubuntu16のCaffeビルド手順をベースにしている。
そのため、本来不要な作業も含まれているかもしれない。

errorやfailedは出ないことは確認したが、warningメッセージはいろいろ表示されていた。（今回は無視した）
なお、ちゃんと動作確認したわけではない。

主な参考サイト
https://gist.github.com/pjspillai/87625e1b6a129335eb363a4131a301f2
http://caffe.berkeleyvision.org/installation.html


## PC環境

|項目              |                              値|
|:-----------------|:------------------------------:|
|CPU               |                    Core-i7 8700|
|GPU               |                     RTX 2080 Ti|
|メモリ            |                            64GB|
|OS                |     18.04.1 LTS (Bionic Beaver)|
|Nvidia Driver     |                         430.34 |

|項目              |                              値|                 インストール先パス|
|:-----------------|:------------------------------:|:---------------------------------:|
|CUDA              |                       10.0.130 |               /usr/local/cuda-10.0|
|cuDNN             |                        7.4.2.2 |    $(HOME)/cudnn/cudnnv742_cuda100|
|Python環境        |    Anaconda 3.5.2(Python3.6.8) |       $(HOME)/anaconda/anaconda352|

CUDAやcuDNN、Anacondaのインストール手順は省略。

## 作業項目

- 環境変数の設定
- openCV3のインストール
- OSパッケージのインストール
- Caffeソースコードの入手
- Makefile.configの作成
- Makefileの修正
- CMakeLists.txtの追記
- Caffeのビルド
- pycaffeのビルド
- 環境変数の設定
- 動作確認(import確認）

### 環境変数の設定

ホームディレクトリ直下の.bash_profileに、anaconda/cuda/cudnn用の環境変数を追記する。
.bash_profileはなければ作成する。

```
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# anaconda(python3) "base" environment
export ANACONDA=$HOME/anaconda/anaconda352
export LD_LIBRARY_PATH=$ANACONDA/lib:$LD_LIBRARY_PATH
export PATH=$ANACONDA/bin:$PATH

# cuda10.0
export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export PATH=$CUDA_HOME/bin:$PATH

# cudnn7
export CUDNN=$HOME/cudnn/cudnnv742_cuda100
export LD_LIBRARY_PATH=$CUDNN/lib64:$LD_LIBRARY_PATH
```


### openCV3のインストール

anacondaのpython環境にopenCV3をインストールする。


```
conda install -c menpo opencv=3
```

### OSパッケージのインストール

公式サイトを参考に、OSパッケージをインストール（要rootまたはsudo）。

```
apt-get install protobuf-compiler
apt-get install libboost-all-dev
apt-get install build-essential cmake git pkg-config
apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libatlas-base-dev libboost-all-dev libgflags-dev libgoogle-glog-dev liblmdb-dev
apt-get install python-pip
apt-get install python-dev
apt-get install python-numpy python-scipy
apt-get install python3-dev
apt-get install python3-numpy python3-scipy
apt-get install libopencv-dev
```


### Caffeソースコードの入手

Caffe1.0のソースコードを入手する。

```
wget https://github.com/BVLC/caffe/archive/1.0.tar.gz
```

tar.gzファイルを展開する。

```
tar -xvf ./1.0.tar.gz
```

Caffeのソースコードは、ホームディレクトリに展開している（任意の場所でＯＫ）。

```
$HOME/caffe-1.0
```

### Makefile.configの作成

Makefile.configファイルをテンプレートからコピー作成し、中身を修正する。

コピー

```
cp Makefile.config.example Makefile.config
```

Makefile.configの修正（修正部分のみ抜粋）

```
# cuDNNを使用するのでコメントアウト
USE_CUDNN := 1

# openCV3を使用する
OPENCV_VERSION := 3

# CUDAインストールディレクトリに合わせてパスを設定する
CUDA_DIR := /usr/local/cuda-10.0

# CUDA_ARCHの2行目から有効になるように変更する
#CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
CUDA_ARCH := -gencode arch=compute_20,code=sm_21 \

# anacondaインストール先パスに合わせる
ANACONDA_HOME := $(ホーム)/anaconda/anaconda352

PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                $(ANACONDA_HOME)/include/python3.6m \
                $(ANACONDA_HOME)/lib/python3.6/site-packages/numpy/core/include

PYTHON_LIBRARIES := boost_python-py36 python3.6m

PYTHON_LIB := $(ANACONDA_HOME)/lib

# pythonレイヤを使用する場合はコメントアウト
WITH_PYTHON_LAYER := 1

# cuDNNのパスを忘れずにセットする
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial $(ホーム)/cudnn/cudnnv742_cuda100/include

# cuDNNのパスを忘れずにセットする
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial $(ホーム)/cudnn/cudnnv742_cuda100/lib64
```

### Makefileの修正

405行目付近のNVCCFLAGS行を修正する

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

### CMakeLists.txtの追記

CMakeLists.txtの末尾に、以下の行を追記する

```
# ---[ Includes
set(${CMAKE_CXX_FLAGS} "-D_FORCE_INLINES ${CMAKE_CXX_FLAGS}")
```

### Caffeのビルド

ここからがCaffeのビルド作業。

makeの実行。末尾の数字は並列数。

```
make all -j12
make test -j12
```

テスト

```
make runtest -j12
```

こんなログが最後に表示されればOK。さすが2080Ti。めっちゃ早いな。。

```
[----------] Global test environment tear-down
[==========] 2101 tests from 277 test cases ran. (261658 ms total)
[  PASSED  ] 2101 tests.
```


※エラーが発生したら、make cleanを実行する。

```
make clean
```


### pycaffeのビルド

pycaffeのmake

```
make pycaffe -j12
```

エラーになる場合には、caffe-1.0/python/requirements.txtを満たしているか確認する

自分の環境では未実施だが、念のためメモしておく（各種ライブラリのインストールコマンド）

```
cd $HOME/caffe-1.0/python
for req in $(cat requirements.txt); do pip install $req; done
```


### 環境変数の設定

.bash_profileに、PYTHONPATHの環境変数を追記する

```
export PYTHONPATH=$HOME/caffe-1.0/python
```


### 動作確認(import確認）

pythonを対話形式で起動して、caffeをimportする。
エラーがでなければまずは成功

```
import caffe
```

以上。
数年前の論文で、caffeのコードを使用していることがあるので、自分はまだcaffeと付き合っていかないといけないんだけど
caffeを使用している人ってもうあまりいないのかな。