NVIDIA Quadroでtensorflow-gpu環境構築

# はじめに
Quadro(P3200)を搭載したパソコンがあり、tensorflow-gpuの環境を構築しようとして調べたところ、あまり前例がなかったので、動作報告と備忘録を兼ねて方法を残しておきます。

この手順で入れ立てUbuntuからできると思います。

後から気づいたのですが、CondaやDockerを使った方が良いようなので、これから環境構築する方はご注意ください。

# 先にすること
まずは必要なパッケージのバージョンを確認します。今回はCUDA, libcudnn, tensorflow-gpuの３つで、tensorflowの[公式にバージョン関係](https://www.tensorflow.org/install/source#linux)が表にされている。私がみた時点での状態は以下となっており、最上段のバージョンの各パッケージをインストールすることにした。

<img width="885" alt="スクリーンショット 2019-08-10 4.28.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/620d0c96-0b4b-96bc-7d1f-089215626f66.png">

# CUDAのインストール
"CUDA install"と調べて一番上に出てくる公式ページを開くと`CUDA10.1`がインストールされてしまうので、注意が必要である。[こちら](https://developer.nvidia.com/cuda-10.0-download-archive)からドライバをダウンロードしてきてインストールする。

コマンドラインからインストールしても良いのだが、`open`をクリックして`Ubuntu Software`を選択するとワンクリックでインストールすることができる。（ださいけど）

私の場合は`CUDA10.1`を先にインストールしてしまったため、本記事下部に記載した方法でダウングレードしたらうまくいった。

# libcudnnのインストール
"cudnn download"と調べて公式ページに入って"Archived cuDNN Releases"をクリックすることで、前のバージョンの一覧を確認・ダウンロードすることができるので、先ほど確認したcudnn7.4の中から、`for CUDA10.0`と続いているものをダウンロード・インストールする。Archiveが表示されているページが[こちら](https://developer.nvidia.com/rdp/cudnn-archive)

コマンドラインからインストールしても良いのだが、`open`をクリックして`Ubuntu Software`を選択するとワンクリックでインストールすることができる。（ださいけど）

# tensorflow-gpuのインストール

```sh:install_tensorflow-gpu
$ sudo pip3 install tensoflow-gpu
```

# 各種チェック方法
## CUDAチェック
NVIDADRIVERとCUDAのバージョンが確認できるので便利である。

```sh:check_cuda_1
$ nvidia-smi
```

[こちら](https://qiita.com/peaceiris/items/21fb40964c875b91439f)に記載されていた。

```py:check_cuda.py
import torch
print(torch.cuda.is_available())
```

## GPUの識別チェック
[こちら](https://qiita.com/peaceiris/items/21fb40964c875b91439f)に記載されていた。

```py:check_gpu_detect.py
import torch
torch.cuda.get_device_name(0)
```

## tensorflowが使用できるCPU,GPUチェック
[こちら](http://thr3a.hatenablog.com/entry/20180113/1515820265)に記載されていた。

```py:check_tensorflow_cpugpu_status.py
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

この結果に、`device_type: "GPU"`というワードが存在していれば、無事使える。
`"device: XLA_GPU device"`というワードも出力されるのだが、こちらしかないGPUは動作しない(?)ようだ。

## GPU動作チェック
確実に動作する画像処理機械学習プログラムを準備して実行する。その時、`system monitor`を開いてCPUの使用率を確認したら、

- GPU:OK -> CPU:8~12%
- GPU:NG -> CPU:88~95%

となっており、GPUが動作していないとCPUが重くなる。

きちんとGPUが処理しているかを確かめたい場合は、新しくターミナルを開いて以下のスクリプトを走らせながらtensorflowプログラムを実行すると良いだろう。

```sh:gpu_status.sh
while :
do
  clear
  nvidia-smi
  sleep 1
done
```

プログラムの実行前後では、確認した範囲では

- 前:GPU-Util -> 0~5%
- 後:GPU-Util -> 66~88%

となっていた。

# CUDAダウングレード
以下は[こちら](https://dmitry.ai/t/topic/33)の引用である。

```sh:hot_to_downgrade_cuda
$ apt-get --purge remove "*cublas*" "cuda*"
$ reboot
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt install cuda-10-0
$ reboot
```

実際に私の場合これを実行することでGPUが動くようになったので、この方法で解決するのだろうが、自分の環境で`nvidia-smi`をすると`CUDA Version: 10.1`と出力されるので、謎である。

# 参考、URL
- https://www.tensorflow.org/install/source#linux
    - 対応バージョン表の確認
- https://dmitry.ai/t/topic/33
    - CUDAのダウングレード方法
- https://qiita.com/peaceiris/items/21fb40964c875b91439f
    - pytorch,tensorflowを用いてGPUのチェック方法
- https://developer.nvidia.com/cuda-10.0-download-archive
    - CUDAインストーラのダウンロード
- https://developer.nvidia.com/rdp/cudnn-archive
    - cuDNNインストーラのダウンロード