Ubuntu 16.04 をインストールして NVIDIAドライバ (410.48)と CUDA10.0 と cuDNN7.4.1 を入れて Tensorflow-gpu を動かすメモ

##環境 & 入れたもの
- Ubuntu 16.04 LTS
- GeForce RTX 2080 ti
- Nvidia ドライバ 410.48
- CUDA 10.0
- cuDNN 7.4.1
- tensorflow-gpu 1.13.1
- python 3.6

##1. Ubuntu 16.04をインストール
USBからBootしました。方法はこちら➡https://qiita.com/konzo_/items/6adfd816c54a4d9d6418
その後の有線接続はこちら➡https://qiita.com/konzo_/items/3ce20d3098f6c85c9f69

##2. 環境を最新にする
```
$ sudo apt-get upgrade
$ sudo apt-get update
$ sudo apt list upgradable
```

##3. Gitを入れる
```
$ sudo apt-get install git
```

##4. anacondaのインストール
ここを参考にpyenvから **anaconda3-2018.12** をインストールした➡https://qiita.com/aical/items/126128c3e8916ad1988f

##5. Nvidiaドライバのインストール
Nvidiaドライバは自身のGPUに合わせるのではなく，CUDAのバージョンと合わせる。
こちらから対応のバージョンを確認➡https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896
今回は410.48を入れる。
###5.1 nouveauグラフィックスドライバの無効化
linuxにデフォルトで入っているnouveauグラフィックスドライバを無効化しないと，うまくいかないらしい。

```ruby:nouveauを使ってるか確認
$ lsmod | grep -i nouveau
```

もし入っていたら，なんか返ってくる。
そすたら，/etc/modprobe.d/blacklist-nouveau.confを作成して，以下を打ち込む。このへんは[ここ](https://qiita.com/daikumatan/items/26039fc23edabf76a9c4)を参考にした。

```ruby:/etc/modprobe.d/blacklist-nouveau.confを作成
$ sudo sh -c "cat << ETX > /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
ETX" && cat /etc/modprobe.d/blacklist-nouveau.conf
```
```ruby:/etc/modprobe.d/nouveau-kms.confの作成
$ sudo sh -c "echo 'options nouveau modeset=0' > /etc/modprobe.d/nouveau-kms.conf" && cat /etc/modprobe.d/nouveau-kms.conf
```

で。反映させて再起動。

```ruby:反映
$ sudo update-initramfs -u
$ sudo reboot
```

ちなみに[このサイト](http://swytel.hatenablog.com/entry/2018/05/08/174943)のように，X Serverは止めなかった。

###5.2 ビルドツールのインストール
なぜやるのかは分からないが，やってる人が多かったのでやっておいた

```
$ sudo apt-get install build-essential
```

###5.3 NVIDIAドライバのダウンロード
[NVIDIAのサイト](https://www.nvidia.com/Download/index.aspx?lang=en-us)からは最新バージョンしかダウンロードできなかたので，ppaのレポジトリを追加してインストールする。

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt-get install nvidia-410
```
最新バージョンをダウンロードするときは，[ここ](https://medium.com/@avinchintha/how-to-install-nvidia-drivers-and-cuda-10-0-for-rtx-2080-ti-gpu-on-ubuntu-16-04-18-04-ce32e4edf1c0)に書いてあるように，`sudo ./NVIDIA-Linux-x86_64–バージョン.run --no-x-check`にするとうまくいくかも！

```
$ nvidia-smi
```
表のようなものが出てきたらOK！

##6. CUDAとcuDNNのインストール
###6.1 CUDA
CUDA10.0をインストールする。
かなり参考にしたサイト➡https://qiita.com/min9813/items/90a1ef62b3dc37d0cc33 

公式サイト➡https://developer.nvidia.com/cuda-toolkit-archive から対応のバージョンを選択。

こんな感じで。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/5543e2f9-6f0c-6fac-7b3c-fa2eca18ef8c.png)

ちなみにインストールタイプの違いはこちらのサイト➡http://gihyo.jp/admin/serial/01/ubuntu-recipe/0456
今回は,[このサイト](https://qiita.com/min9813/items/90a1ef62b3dc37d0cc33)に倣ってnetworkにした。

で，ダウンロードしたディレクトリに移動し，公式のダウンロードサイトのの通りインストールしていく。
**※`sudo apt-get install cuda`だけではなく，末尾に`cuda-toolkit-10-0`を打つこと！
でないと最新のNVIDIAドライバが勝手にインストールされ，グラボとの対応が悪いとログインループになる！**


```ruby:CUDAのインストール
$ cd /home/ほにゃららららら
$ sudo dpkg -i cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda-toolkit-10-0
```

ちなみに上から3つめのコマンドはエラーっぽいことが返ってくるが，そのまま無視してインストールした。
環境設定をしておわり。

```ruby:環境設定
$ nano ~/.bashrc 
``` 

末尾に移動して以下の2行を書き込む

```
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```

```ruby:再起動
$ sudo reboot
```
以下のコマンドでCUDAが入っているか確認できる(^^)/

```ruby:CUDAの確認
nvcc -V
```

###6.2 cuDNN
公式サイトhttps://developer.nvidia.com/cudnn にログインして(会員登録が必要)，同意するにチェックを入れると最新バージョンが出てくる。
7.4をダウンロードしたいので，アーカイブをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/00b96b0f-175f-30a4-0827-56c12d20ff9f.png)

ずらっとアーカイブがでてくる。
7.4.2と7.4.1があったが，7.4だったらどっちでも良いだろうと7.4.1をダウンロードした。
CUDA10.0のUbuntu16.04(x86_64)の中の

- Runtime
- Developer Library
- Code Samples and User Guide

3つをダウンロードする。コードサンプルとかいらないのかも。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/0d8464ea-75b1-200b-c80f-a9b5bb1e74b3.png)

ダウンロードしたディレクトリに移動して以下のコマンドを実行。
Installation Guideに詳しく書いてある！ちなみにこの順番で実行しないとうまくいかない。

```ruby:cuDNNのインストール
$ sudo dpkg -i libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.4.1.5-1+cuda10.0_amd64.deb
```
これでOK

##7. tensorflow-gpu 1.13.1のインストール
CUDAとの対応は1.13.0が良いらしいが，なぜかerrorが出たので1.13.1をインストールした。
tensorflow-gpu 1.13.1はPython2.7か3.3～3.6の仮想環境が必要なので，環境をつくってそこにインストールしていく。

```ruby:環境構築
$ conda create -n 環境名 python=3.6
```
```ruby:仮想環境をアクティベート
$ source activate 環境名
```
`(環境名)～～～～$`と表示されたらOK！
以下のように，`==`でバージョンを指定してインストールする。

```ruby:Tensorflow-gpuのインストール
$ pip install tensorflow-gpu==1.13.1
```
エラーでなければOK。

##8. 確認
###8.1 tensorflowをインポートする
環境をアクティベートして，pythonを開いて(pythonとコマンドを打つだけ)，

```ruby:tensorflowをインポートする
$ import tensorflow
```
してエラーがでなければ成功！
もし，以下のようなエラーを吐かれてインポートできなければ，それは何らかのバージョンがあっていない証拠。

```ruby:バージョンの相性が悪いこと示すエラーの例
ImportError: libcudart.so.9.0: cannot open shared object file: No such file or directory
```
これは，CUDA9.0じゃないとダメだと怒っているエラー。もう一度バージョンの対応を確認する必要あり。

```ruby:バージョン確認のコマンド
$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
$ dpkg -l | grep cudnn
$ pip show tensorflow-gpu
```

###8.2 TensorflowがGPUを認識しているか確認
tensorflowが無事にインポートできたら，tensorflowからGPUを認識しているか確認する。
[このサイト](http://thr3a.hatenablog.com/entry/20180113/1515820265)がわかりやすい！

```
$ from tensorflow.python.client import device_lib
$ device_lib.list_local_devices()
```
GPUの表示があれば認識してる。

ちなみにtensorflowとtensorflow-gpuが両方インストールされていると，競合してしまい，ダメらしい([ここ情報](https://teratail.com/questions/132094))。なので，もしインストールしていたら`pip uninstall`で両方アンインストールする。その後もう一度tensorflow-gpuのみをインストールするとうまくいった！

##おまけ
https://devtalk.nvidia.com/default/topic/1031213/linux/problem-installing-nvidia-390-42-driver-on-ubuntu-16-04/
ここによると，CUDA→ドライバ→cuDNNの順番でCUDAを先にインストールしてもうまくいくのかも。試す前にうまくいったので，いつかログインループが起きたらやってみる！

おしまい。