TensorFlow, Caffe, Chainer と Deep Learning大御所を一気に source code build で GPU向けに setupしてみた

# Overview

TensorFlow, Caffe, Chainer と Deep Learningの大御所を、Ubuntu 16.04 + CUDA-8.0RC + cuDNN5.0 で 一気にsetupしてみた。

(現時点では、tensorflow with CUDA on Ubuntu 16.04だとbuild breakするので、patchを作って対処していますので、お役に立てば幸いです. )

# 下準備

[GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う](http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b) を参考に、Ubuntu 16.04LTSで、CUDA-8.0RCを、お手持ちのGeForce (GTX-1080, 1070, 750Tiなど、[CUDA Computing Capability](https://developer.nvidia.com/cuda-gpus) 3.0以上のGPUで.)

# TensorFlow

CUDA-8.0は、source code buildしないとサポートされていませんので、source codeを取得してbuildしていくという手順です。

## pip環境準備 (optional)

```
$ sudo apt-get install python-pip python-dev -y
$ sudo pip install --upgrade pip
```

## TensorFlowをbuildするのに必要なもののinstall

### Bazel の install

```
$ wget https://github.com/bazelbuild/bazel/releases/download/0.3.0/bazel-0.3.0-installer-linux-x86_64.sh
$ chmod +x bazel-0.3.0-installer-linux-x86_64.sh
$ ./bazel-0.3.0-installer-linux-x86_64.sh --user
```

~/.bashrc に以下を追加

```
source /home/hidenorly/.bazel/bin/bazel-complete.bash
export PATH=$PATH:/home/hidenorly/.bazel/bin
```

```
$ source ~/.bashrc
```

### 依存componentのinstall

```
$ sudo apt-get install python-numpy swig python-dev python-wheel
```

### cuDNN5.0のinstall

CUDA-8.0とともに使えるのは、まだcuDNN5.0のみです。
(今後cuDNN5.1が利用可能になるようですが未確認です)

cuDNNは [nVIDIA cuDNN](https://developer.nvidia.com/cudnn)からdownloadしてください(要登録)

```
$ cd ~/work/cuda
$ tar zxvf cudnn-8.0-linux-x64-v5.0-ga.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
```
## TensorFlowのdownload

```
$ git clone https://github.com/tensorflow/tensorflow
```

## TensorFlowのBuild

```
~/work/tensorflow$ ./configure 
```

まず全部defaultでOkです。

で、masterは、Ubuntu 16.04とCUDAの組み合わせではbuildが通りませんので、以下のpatchを当てます. masterだけでなく、v0.9 tagでも同様でした。

```
diff --git a/third_party/gpus/crosstool/CROSSTOOL b/third_party/gpus/crosstool/CROSSTOOL
index 8db81a9..61250bc 100644
--- a/third_party/gpus/crosstool/CROSSTOOL
+++ b/third_party/gpus/crosstool/CROSSTOOL
@@ -52,6 +52,8 @@ toolchain {
   cxx_flag: "-std=c++11"
   linker_flag: "-lstdc++"
   linker_flag: "-B/usr/bin/"
+  linker_flag: "-lrt"
+  linker_flag: "-lm"
```

```
~/work/tensorflow$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip install /tmp/tensorflow_pkg/tensorflow-X.X.X-py2-none-any.whl
```
最後の数字はX.X.Xは、その時によるので、補完したりしてみてください。

あとは、tensorflow/exampleの中を動かしてみたりして、動作中に、

```
$ nvidia-smi
```

して、pythonが利用していれば、ちゃんとGPU使われています。

# Caffe

## 依存するcomponentのinstall

```
$ sudo apt-get install -y build-essential cmake git pkg-config
$ sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install -y libatlas-base-dev 
$ sudo apt-get install -y --no-install-recommends libboost-all-dev
$ sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev

$ sudo apt-get install -y python-pip python-dev python-numpy python-scipy

$ sudo apt-get install -y libopencv-dev
```

## python2で使う人向け

```
$ sudo apt-get install --assume-yes libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
```

## python3で使う人向け

```
$ 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
```

## Caffeのdownload

```
$ git clone https://github.com/BVLC/caffe.git
$ cd caffe
$ cp Makefile.config.example Makefile.config
```

## makefileの編集

``` Makefile.config
# cuDNN acceleration switch (uncomment to build with cuDNN).
-# USE_CUDNN := 1
+USE_CUDNN := 1
```

## 依存コンポーネントの処理

```
$ find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libhdf5_serial.so libhdf5.so
$ sudo ln -s libhdf5_serial_hl.so libhdf5_hl.so
```

```
$ cd ~/work/caffe/python
$ sudo su
# for req in $(cat requirements.txt); do pip install $req; done
```

## build

```
$ cd ~/work/caffe
$ make all
$ make test
$ make runtest
$ make distribute
```


# Chainer

## .bashrcの設定

``` ~/.bashrc
    export CUDA_PATH=$CUDA_HOME
```

```
$ source ~/.bashrc
```

## 依存コンポーネントのinstall (skip可能. Caffeでinstall済みのはず)

```
$ sudo apt-get install libhdf5-dev
$ pip intall h5py
```

## source code取得

```
$ git clone https://github.com/pfnet/chainer.git
```

## build

```
$ cd chainer
$ sudo CUDA_PATH=/usr/local/cuda python setup.py develop
```

## ちなみに、動作確認

```
~/work/chainer/examples/word2vec$ python ../ptb/download.py
~/work/chainer/examples/word2vec$ python train_word2vec.py --gpu 0
```

別のconsoleで、

```
$ nvidia-smi
```

です。

あんまりGPUに負荷かけられていないので、chainerは、tensorflowに比べると速度の面ではいまいちかもですが、--gpu 0を入れない状態で、GTX750Tiでも、i7-870 CPUの10倍高速でした。

なお、GTX-1080はGTX-750Tiの6倍速いです。
( 価格は今10倍ぐらいですけど :-) )