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 と共に使う を参考に、Ubuntu 16.04LTSで、CUDA-8.0RCを、お手持ちのGeForce (GTX-1080, 1070, 750Tiなど、CUDA Computing Capability 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から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倍ぐらいですけど :-) )