TensorFlow 0.8 GPU 版を Ubuntu 14.04 にソースコードからインストール

# 概要
TensorFlow の GPU 版をインストールするときは CUDA, cuDNN のバージョンをしっかりと合わせないと正常に動かない場合があります。前回は pip でインストールする方法を書きました。

[TensorFlow 0.8 GPU 版を Ubuntu 14.04 にインストール](http://qiita.com/akiraak/items/1c7fb452fb7721292071)

しかし TensorFlow はまだ発展途上なのでバグに遭遇することもあります。今回リリースしたばかりの 0.8 をインストールしたところ、可視化ツールの `tensorboard` に何も表示されないというバグに遭遇しました。

[tensorboard が真っ白 0.8.0 rc0 2016-04-20 時点](https://github.com/tensorflow/tensorflow/pull/1926/commits/4ce22cf418c522d31431d087f7627693075c9feb)

さいわい TensorFlow の github を確認すると、問題は既に修正され master ブランチにマージされています。

[Fix TensorBoard lib/css dependency #1926](https://github.com/tensorflow/tensorflow/pull/1926/commits/4ce22cf418c522d31431d087f7627693075c9feb)

pip のインストーラができるのを待つこともできますが、既に修正されているので今回はソースコードから TensorFlow をインストールすることにします。

# 環境
+ OS: Ubuntu Server 14.04 LTS (64bit) クリーンインストールし openssh-server のみをインストールした状態
+ GPU: NVIDIA TITAN X

# CUDA, cuDNN の入手
CUDA 7.5 と cuDNN v4 をダウンロードして Ubuntu の ~ に配置しておきます。

CUDA 7.5 は[こちら](https://developer.nvidia.com/cuda-downloads)から`cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb` をダウンロードしてください。

cuDNN v4 は[こちら](https://developer.nvidia.com/rdp/form/cudnn-download-survey)のサイトでアカウントを作成したのちログインし、アンケートをいくつか答えたのち`cuDNN v4 Library for Linux`のリンクから`cudnn-7.0-linux-x64-v4.0-prod.tgz`をダウンロードしてください。

# CUDA 7.5 のインストール
``` sh
$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
```

# cuDNN v4 のインストール
``` sh
$ tar xvzf cudnn-7.0-linux-x64-v4.0-prod.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/lib64/libcudnn*
```

# パスを通す
`~/.bashrc` に以下を追加

```
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
```

設定を反映させる

``` sh
$ . ~/.bashrc
```

# ビルドツール bazel のインストール

TensorFlow は bazel というツールでビルドします。インストール手順は[ここ] (http://bazel.io/docs/install.html)に書いてあります。手順は以下になります。

Java のインストール

``` sh
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
```

依存するパッケージをインストール

``` sh
$ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip
```

インストーラーをダウンロードして、インストール

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

実行ファイルへパスを通すため `.bashrc` に追記する。

```
export PATH="$PATH:$HOME/bin"
```

設定を反映させる。

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

# TensorFlow をビルド

virtualenv で TensorFlow のインストール先を作成

``` sh
$ sudo apt-get install python-dev python-virtualenv git swig
$ virtualenv ~/tensorflow-source-GPU
$ . ~/tensorflow-source-GPU/bin/activate
$ pip install numpy wheel
```

TensorFlow のソースコードを github から取得。

``` sh
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
```

後で必要になるので cuDNN の詳細なバージョンを調べる。`4.0.7` のようだ

``` sh
$ ls cuda/lib64/
$ libcudnn.so  libcudnn.so.4  libcudnn.so.4.0.7  libcudnn_static.a
```

`./configure` を実行してビルドの設定を行う。

``` sh
$ cd tensorflow
$ ./configure
Please specify the location of python. [Default is /home/akiraak/tensorflow-source-GPU/bin/python]:
Do you wish to build TensorFlow with GPU support? [y/N] y
GPU support will be enabled for TensorFlow
Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]:
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 7.5
Please specify the location where CUDA 7.5 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify the Cudnn version you want to use. [Leave empty to use system default]: 4.0.7
Please specify the location where cuDNN 4.0.7 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
［Default is: "3.5,5.2"]: 3.5
Setting up Cuda include
Setting up Cuda lib64
Setting up Cuda bin
Setting up Cuda nvvm
Setting up CUPTI include
Setting up CUPTI lib64
Configuration finished
```

GPU を使うかはy。Cudaは7.5。cuDNNは調べた4.0.7。最後の質問には3.5と答え、それ以外は何も入力しないでEnterを押す。

TensorFlow のビルド

``` sh
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
```

TensorFlow のインストール

``` sh
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package  /tmp/tensorflow_pkg
$ pip install /tmp/tensorflow_pkg/tensorflow-0.8.0rc0-py2-none-any.whl
```

# 動作確認

シンプルなサンプルで動作確認を行います。CPU 版と同じ以下のコードを実行します。

``` sh
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```

GPU 版では以下のような出力に変わります。

``` sh
$ python
...
>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:900] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties:
name: GeForce GTX TITAN X
major: 5 minor: 2 memoryClockRate (GHz) 1.076
pciBusID 0000:01:00.0
Total memory: 12.00GiB
Free memory: 11.87GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:755] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:01:00.0)
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
```

コンソールを新しく立ち上げた場合などは以下のコマンドを実行して TensorFlow を有効にします。

``` sh
$ . ~/tensorflow-source-GPU/bin/activate
```