Ubuntu14.04 + GPU + TensorFlow 環境構築

#概要
####Ubuntu14.04LTS + GPU + TensorFlow の環境構築に苦労した人は多いのではないでしょうか。
GPU駆動でTensorFlowを使おうと思ったらUbuntu14.04は真っ先に挙がるOS候補ですが、気をつけて設定しないとGPUが認識されなかったり、tensorboardがうまく表示されなかったりと、山のようなバグに出会うことになります。GPU版TensorFlowをフル活用できる環境を構築できたので、同じように環境構築で困る人が出ないよう記録を残したいと思います。



遭遇したエラーの一部
・CUDA、cuDNNのバージョンを揃えないと上手く動かない
・NVIDIAドライバを"正しく"最新版にインストールしないと動かない(デフォルトのOSSドライバが邪魔をする)
・TensorFlow ver.7をpipインストールするとtensorboardが使えない
・Firefoxではtensorboardの一部が使えない
・Ubuntuのログインループと呼ばれるバグの発生



使用環境
・OS : Ubuntu14.04LTS
・GPU : NVIDIA GeForce Titan
・Python 2.7
・TensorFlow : Version master(2016年6月18日時点)
・CUDA 7.5
・cuDNN 4.0.7


目次
1. Ubuntu14.04のインストール
2. NVIDIAドライバのインストール
3. CUDA, cuDNNのインストール
4. TensorFlowのインストール
5. TensorFlowの実行テスト


#1. Ubuntu 14.04LTSのインストール

OSをクリーンインストールして、まっさらな状態から始める。

初期OSもUbuntuを仮定。[ここ](https://www.ubuntulinux.jp/download/ja-remix)からisoイメージ ubuntu-ja-14.04-desktop-amd64.iso をダウンロード。
USBメモリをさし、"スタートアップディスクの作成"アプリを使い、ディスクを作成。
再起動し、ASUSのブート画面が表示されたときにF2を押して、Ubuntuのインストールに入る。

※ここは特に問題なく進めると思うので、他の記事などを参考に進めてください。

#2. NVIDIAドライバのインストール
NVIDIA GPUの確認

```
$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation GK110 [GeForce GTX Titan] (rev a1)
$ 
```

次にドライバを[ここ](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)から自分に合うものを検索してダウンロード。

```

$ ls ~/Downloads
NVIDIA-Linux-x86_64-367.27.run
$ mv ~/Downloads/NVIDIA-Linux-x86_64-367.27.run ~

```

次にCtrl＋Alt＋F1でコンソールモードに入り、次のように進める。
※コンソールモード：OSをCUIで動かすモードのこと。逆にGUIモードに戻る場合はCtrl＋Alt+F7を押す。

```
$ sudo apt-get purge nvidia*
$ sudo service lightdm stop
$ sudo chmod 755 ~/Downloads/NVIDIA-Linux-x86_64-367.27.run
$ sudo ~/Downloads/NVIDIA-Linux-x86_64-367.27.run

```

実行するとなにやら色々始まるが、基本的にyesと答えて進める。
最後に再起動して、正常に起動するのを確認する。


#3. CUDA, cuDNNのインストール
CUDA7.5　[ここ](https://developer.nvidia.com/cuda-downloads)からcuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debをダウンロードする。

cuDNN4.0.7 [ここ](https://developer.nvidia.com/rdp/form/cudnn-download-survey)のサイトでnvidia developerの登録を済ます必要がある。登録には１日ほどかかる。アカウントを取得した後、ログインして、アンケートを答え、cuDNN v4 Library for Linuxのリンクからcudnn-7.0-linux-x64-v4.0-prod.tgzをダウンロード。


```
$ cd ~
$ ls ~/Downloads
cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb 　cudnn-7.0-linux-x64-v4.0-prod.tgz 
$ mv ~/Downloads/* ~
CUDAのインストール
$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
cuDNNのインストール
$ 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に以下の２行を加えて保存

```~/.bashrc

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

```

設定を反映させる

```

$ . ~/.bashrc

```


#4. TensorFlowのインストール
ここでは最も新しい安定版 Version : master をインストールする。
まずは必要なもののインストール、そしてpipインストール

```
$ cd ~
$ sudo apt-get install python-pip python-dev
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

```

※Ver.9でも問題無いかもしれません。[公式](https://www.tensorflow.org/versions/r0.9/get_started/index.html)では version: r0.9 がデフォルトで開かれますが、今回はmasterをインストールするので気をつけてください。
※数カ月前の日本語記事などを参照してVer.7などをインストールすると、Ubuntu環境下＋pipでのインストールでバグが起こり、tensorboardに何も表示されないという事態に陥ります。同じような人が続出し、Googleの開発者が相談の場に現れたりしています。問題はすでに修正されているようなので、四の五の言わずに最新版をインストールしましょう。
・[Tensorboard from pip installation broken](https://github.com/tensorflow/tensorflow/issues/530)
・[TensorBoard showing nothing!](https://github.com/tensorflow/tensorflow/issues/1421)





#5. TensorFlowの実行テスト

最低限の動作確認。
TensorFlowが正しくインストールされていることの確認。

```
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
..
>>> 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
>>> 

```

GPUが正しく認識されていることの確認。

```

>>> 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
major: 3 minor: 5 memoryClockRate (GHz) 0.8755
pciBusID 0000:01:00.0
Total memory: 6.00GiB
Free memory: 5.92GiB
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, pci bus id: 0000:01:00.0)
>>> 

```


最後にtensorboardの実行確認。[この記事](http://qiita.com/supersaiakujin/items/aa598c942c3ec82d0c8c)が非常に良いチュートリアルなので、１つめのコードを保存して実行する。

```

$ vim tensorboard_test.py

```


```tensorboard_test.py

import tensorflow as tf
import numpy as np

WW = np.array([[0.1, 0.6, -0.9], 
               [0.2, 0.5, -0.8], 
               [0.3, 0.4, -0.7],
               [0.4, 0.3, -0.6],
               [0.5, 0.2, -0.5]]).astype(np.float32)
bb = np.array([0.3, 0.4, 0.5]).astype(np.float32)
x_data = np.random.rand(100,5).astype(np.float32)
y_data = np.dot(x_data, WW) + bb

with tf.Session() as sess:

    W = tf.Variable(tf.random_uniform([5,3], -1.0, 1.0))
    # The zeros set to zero with all elements.
    b = tf.Vari......
  
コード全部を載せるのは失礼なので省略
上記記事を参照すること


```

実行とその結果。

```

$ python tensorboard_test.py 
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
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
major: 3 minor: 5 memoryClockRate (GHz) 0.8755
pciBusID 0000:01:00.0
Total memory: 6.00GiB
Free memory: 5.92GiB
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, pci bus id: 0000:01:00.0)
WARNING:tensorflow:Passing a `GraphDef` to the SummaryWriter is deprecated. Pass a `Graph` object instead, such as `sess.graph`.
step = 0 acc = 3.11183 W = [[-0.82682753 -0.91292477  0.78230977]
 [ 0.43744874  0.24931121  0.13314748]
 [ 0.85035491 -0.87363863 -0.81964874]
 [-0.92295122 -0.27061844  0.15984011]
 [ 0.33148074 -0.4404459  -0.92110634]] b = [ 0.  0.  0.]
step = 10 acc = 0.127451 W = [[-0.44663835 -0.09265515  0.30599359]
 [ 0.56514043  0.63780373 -0.12373373]
....

```


実行後、/tmp/tensorflow_logというフォルダが作成されている。
tensorboardコマンドで今回の学習を可視化する。下のようになれば成功。http://0.0.0.0:6006 をブラウザで表示させるとtensorboardが立ち上がる。ただし、FirefoxではTensorboardのGraphページが見れないというバグが確認されているので、Google Chromeなどを使うこと。


```

$ tensorboard --logdir=/tmp/tensorflow_log
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
Starting TensorBoard 16 on port 6006
(You can navigate to http://0.0.0.0:6006)

```

![Screenshot from 2016-06-19 22:16:22.png](https://qiita-image-store.s3.amazonaws.com/0/72840/5991d54a-98c2-5af4-5112-e77e4bfaf28b.png)



＜参考記事＞
・[Ubuntu スタートアップ・ディスクの作成 その1 - USBスタートアップディスクを作成する](http://kledgeb.blogspot.jp/2012/10/ubuntu-1-usb.html)
・[Ubuntu に最新の NVIDIA Driver をインストールする。](http://zondeel.hateblo.jp/entry/2014/08/29/202919)
・[TensorFlow 0.8 GPU 版を Ubuntu 14.04 にインストール](http://qiita.com/akiraak/items/1c7fb452fb7721292071)