CentOS7でGPU環境構築

深層学習モデルをGPUで動かしたい！！！
ただ自分が無知でめちゃくちゃに時間がかかったので、そんな人がもう現れないために。

#前提
OS：CentOS Linux release 7.9.2009
GPU：TU106 [GeForce RTX 2060 SUPER]
Tensorflow：2.2.0

#バージョン確認
結局これが一番大事、、
TensorflowとCUDA,cuDNNのバージョン確認
→ https://www.tensorflow.org/install/source#tested_build_configurations
以下のURLにもいろいろと。
→ https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

#環境構築手順
###①NVIDIAドライバーをインストールする
まず、デフォルトのnouveau ドライバーを無効化するらしいです。
ただ、私は最初から何もなかったので飛ばしました。

```shell:
$ lsmod | grep nouveau
$ vi /etc/modprobe.d/blacklist-nouveau.conf
# 最終行に追記 (ファイルがない場合は新規作成)
$ blacklist nouveau
$ options nouveau modeset=0
$ dracut --force
$ reboot
```

必要なパッケージをインストール。

```shell:
$ yum -y install kernel-devel-$(uname -r) kernel-header-$(uname -r) gcc make
```

NVIDIAサイトより、コンピューターに搭載されているグラフィックカード用のドライバーをダウンロード。
→ https://www.nvidia.com/Download/index.aspx?lang=en
調べる際、OSとGPUがなんなのかは以下のコマンドでわかります。

```shell:
#OS
$ grep -H "" /etc/*version ; grep -H "" /etc/*release

#GPU
$ lspci | grep -i nvidia
```

そしてインストール。

```shell:
$ bash (ダウンロードしたドライバー)
```

いろいろ聞かれますが、上手いこといけたらcompleateって言われます。

グラフィックカードの状態は、以下で確認できます。

```shell:
$ nvidia-smi
```

###②CUDAのインストール
CUDA (Compute Unified Device Architecture)
NVIDIA 社製グラフィックカードによる GPU コンピューティング GPGPU（General-Purpose computing on Graphics Processing Units) プラットフォーム 

以下のURLから適切なリポジトリをダウンロードします。
→ https://developer.nvidia.com/cuda-downloads
Installer Typeはrpm(network)を選択しました。

コマンドを出してくれます。（ありがたい）

```shell:
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
sudo yum clean all
sudo yum -y install nvidia-driver-latest-dkms cuda
sudo yum -y install cuda-drivers
```

そしてインストール。

```shell:
$ yum --enablerepo=epel -y install cuda-10-2
```

パスを通します。

```shell:
$ vi /etc/profile.d/cuda102.sh
# 新規作成
export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ source /etc/profile.d/cuda102.sh
```

念の為、~/.bashrcにも通してたら良いかも。
確認！！

```shell:
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89
```

操作確認できるらしいですけど、めんどくさいので省略しました。

###③cuDNNのインストール
cuDNN は深層ニューラル ネットワークに対するプリミティブの GPU で高速化されたライブラリです。
インストールするのに会員登録的なのが必要です。
無料だしすぐ終わるので、パッと。
→ https://developer.nvidia.com/cudnn

必ずCUDAと対応したバージョンをダウンロード！！！！！
ダウンロードしたcuDNNを解凍したい場所にうつして、解凍したあとにいろいろとコピー。

```shell:
$ tar zxvf cudnn-10.2-linux-x64-v7.6.5.32.tgz
$ cp ./cuda/include/cudnn.h /usr/local/cuda-10.2/include/ 
$ cp -a ./cuda/lib64/libcudnn* /usr/local/cuda-10.2/lib64/
```

②で作ったファイルにパスを通します。

```shell:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.2/extras/CUPTI/lib64

$source /etc/profile.d/cuda102.sh
```

これで確認。

```shell:
$ ldconfig -p | grep cudnn
libcudnn.so.7 (libc6,x86-64) => /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn.so.7
libcudnn.so (libc6,x86-64) => /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn.so
```

さて、、tensorflowが動くか確認しよう。

```python:
$ python
>>> import tensorflow as tf
>>> tf.test.is_gpu_available()
...#いろいろと出てます。
False
```

False！！！！失敗やんけ、、、
エラー文を見てみると、こんな文が。

```python:
Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory
```

あ、CUDA-10.1もいるのか。ということで、10.2 と同様にインストール。
ただしバージョンは10.2のままにしておきました。
そしてまたtensorflowが動くか確認すると、

```python:
$ python
>>> import tensorflow as tf
>>> tf.test.is_gpu_available()
...#いろいろと出てます。
True
```

うまくいきました。

###他に出たエラー
CNNを動かしたくて、GPU入れたのに以下のエラーが出ました。

```python:
tensorflow.python.framework.errors_impl.UnknownError:  Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
```

なんなの、、意味がわからないけど、調べたら解法ありました。
→ https://qiita.com/ysuzuki19/items/b727bbcb45f1cad37630

#参考
https://www.server-world.info/query?os=CentOS_7&p=tensorflow&f=2