Ubuntu18.04にCUDA・cuDNN・tensorflow-gpuをインストールする

# はじめに
ほぼ自分用メモです。OSの入っていないPCにGPUでのディープラーニング開発環境を構築する必要があったのでせっかくなのでと思い記事にしました。
# 環境
* Ubuntu 18.04 LTS
* Nvidia Geforce GTX1060
* Python 3.6.7
* CUDA9.0
* cuDNN 7.2.1

CUDA、cuDNNはバージョン間の互換を確認する必要があるのですが、この記事が参考になりました。

[NvidiaドライバとCUDAとcuDNNとTensorflow-gpuとPythonのバージョンの対応](https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896)

# 前準備
Ubuntuの公式リポジトリにはnvidia-driverのバージョン390までしか入っていないようなのでNvidiaのリポジトリを追加します。

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt install -y software-properties-common
$ sudo apt install -y build-essential
$ sudo apt -y update
$ sudo apt -y upgrade
```

この後、デフォルトでロードされているnouveauドライバーを無効化します。
無効化するとGUIがまともに動作しないのでCUDAのファイルのダウンロード等はこのタイミングで済ませておく方がいいです。
また、CUIだとコピペできないので長いの打ちたくないって方はシェルスクリプトを作成しておいて実行すると楽です。
### ここからはCUIで作業していきます。
```
$ lsmod | grep nouveau
```

で`nouveau`ドライバーが動作していることを確認します。

動いている場合、`/etc/modprobe.d/blcaklist-nouveau.conf`に以下を追記します。(無ければ新規作成)

```:blcaklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```

追記したあと

```
$ update-initrmfs -u
$ reboot
```

で再起動して設定を反映させます。
ここはこのページを参考にしました。
[https://www.server-world.info/query?os=Ubuntu_18.04&p=nvidia](https://www.server-world.info/query?os=Ubuntu_18.04&p=nvidia)

# CUDAのインストール

ここからが苦戦するポイントだと思います。
私は何度もOSのインストールからやり直したのですが...
私の環境ではCUDAのインストールの際、networkからダウンロードするとTensorFlowとのバージョン互換が上手くいかないようでした。
なので、localからインストールしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260014/b8099201-3351-ce8b-c921-9e9baa1a8403.png)

CUDAのダウンロードページで上記の画像のように選択します。CUDA9.0ではUbuntu18.04向けのインストーラーは用意されていないので17.04向けのものを使用します。Installer Typeで`deb(local)`を選択します。

```
$ sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
$ sudo dpkg -i cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb
$ sudo apt update
$ sudo apt install cuda
```
※公式だと`apt-key`と`dpkg`の順番が逆ですが私の環境ではどうにも上手くいきませんでした。

でnvidia-driverも同時にインストールされますがこのままでは

```
$ nvidia-smi
```

が動作しないので一度再起動します。
再起動後、`nvidia-smi`が動作することを確認します。

```
$ nvidia-smi
Mon May 27 13:46:38 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.116                Driver Version: 390.116                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:01:00.0  On |                  N/A |
| 33%   34C    P0    30W / 120W |    355MiB /  6075MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1053      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1223      G   /usr/bin/gnome-shell                          48MiB |
|    0      3801      G   /usr/lib/xorg/Xorg                           156MiB |
|    0      3934      G   /usr/bin/gnome-shell                         105MiB |
+-----------------------------------------------------------------------------+
```

# cuDNNのインストール

こちらはダウンロードするのにNVIDIA Developerに登録する必要があります。今回はCUDA9.0をインストールしたのでfor 9.0と書かれたものをダウンロードします。最新のバージョンを入れるとtensorflow-gpuが対応していない可能性があるのでインストール前に確認しましょう。

```
$ sudo dpkg -i libcudnn7_7.2.1.38-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.2.1.38-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.2.1.38-1+cuda9.0_amd64.deb
```

上のコマンドは順番を間違えると上手くいかないようなので注意しましょう。

# tensorflow-gpuのインストール

実際に`tensorflow-gpu`をインストールして動作確認をします。
ここでインストールする`tensorflow-gpu`のバージョンはCUDA,cuDNNとのバージョン互換を確認してください。pipでインストールする場合、`==version`で
バージョンを指定できます。
私はvirtualenvを使ってPython環境を構築するので、以下のようにしました。

```
$ sudo apt install virtualenv python3-dev python3-pip
$ virtualenv -p python3 myenv 
$ source ~/myenv/bin/activate
$ pip install tensorflow-gpu==1.9
```
※　`myenv`の部分は好きな名前で構いません。

※　追記 `tensorflow-gpu`のバージョンが1.12.0でも動作することを確認しました。

virtualenv等を使わない場合は以下のようにします。UbuntuではOSのインストール時に、Python2.7とPython3がインストールされるようなのでpip3と指定しないとPython2.7のpipが動作します。Pythonインタプリタの起動も同様にpython3とする必要があります。

```
$ pip3 install tensorflow-gpu==1.9.0
```


# 動作確認

インストールしたら、Pythonインタプリタで

```:python3
>>> import tensorflow as tf
>>> tf.Session()
2019-05-27 13:48:09.175814: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-05-27 13:48:09.263421: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:897] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-05-27 13:48:09.263727: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1392] Found device 0 with properties: 
name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate(GHz): 1.7085
pciBusID: 0000:01:00.0
totalMemory: 5.93GiB freeMemory: 5.50GiB
2019-05-27 13:48:09.263740: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1471] Adding visible gpu devices: 0
2019-05-27 13:48:09.431030: I tensorflow/core/common_runtime/gpu/gpu_device.cc:952] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-05-27 13:48:09.431057: I tensorflow/core/common_runtime/gpu/gpu_device.cc:958]      0 
2019-05-27 13:48:09.431062: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0:   N 
2019-05-27 13:48:09.431164: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5271 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0, compute capability: 6.1)
<tensorflow.python.client.session.Session object at 0x7fee08798dd8>

```

と入力してみましょう。
ここで動作すればディープラーニングのための環境構築は終了です。


# 参考記事等
[ubuntu18.04にCuda9.0を入れてtensorflow-gpuを使う](https://qiita.com/tsukasa1301/items/654b4ed30897aa349b10)

[NvidiaドライバとCUDAとcuDNNとTensorflow-gpuとPythonのバージョンの対応](https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896)

[直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ](https://www.oreilly.co.jp/books/9784873118260/)

Antonio Gulli (著), Sujit Pal (著), 大串 正矢 (翻訳), 久保 隆宏 (翻訳), 中山 光樹 (翻訳)　付録A　GPUを考慮した開発環境の構築