UbuntuにGPU環境を構築する

ディープラーニングを始めようと思ったら、処理時間の短縮のためにGPUの使用を考えるべきです。
GPUを使うためには、GPU（NVIDIA）付きのPCを手に入れて環境を構築する必要があります。

ここでは、フレームワークとしてTensorFlow、Kerasを使う予定で構築していきます。



## システム環境
`OS`：Ubuntu Desktop 18.04.4
`GPU`：GeForce GTX 1660Ti



## NVIDIAドライバーのインストール
### セキュアブートの無効化
LinuxカーネルではUEFI（BIOS）でセキュアブートが有効になっていると、NVIDIAのドライバーをロードすることができません。
なので無効化します。

起動中のロゴ画面でF2ボタンを押し続けると、以下のようなUEFI画面になります。
ここでセキュアブートを無効化します。
<img width="600" alt="setup-gpu-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/5af56bec-e8ae-7174-8a09-b3a5938d32b5.jpeg">


### nouveauの無効化
nouveauと呼ばれるフリーのドライバーがデフォルトでロードされているのですが、これがロードされているとNVIDIAのドライバーと競合する可能性があります。
なので無効化します。

nouveauがロードされているかは以下のコマンドで確認できます。
何かしら出力されていればロードされています。

```
$ lsmod | grep -i nouveau
```

以下のコマンドを入力し、/etc/modprobe.d/blacklist-nouveau.confを作成します。

```
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
```

このファイルには次のように書き込んで保存します。

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

以下のコマンドでカーネルモジュールを再読み込みし、再起動します。

```
$ sudo update-initramfs -u
```

再起動後、再び以下のコマンドを入力し、nouveauがロードされているか確認します。
何も出力されなければ、nouveauの無効化は完了です。

```
$ lsmod | grep -i nouveau
```


### リポジトリの追加
通常のリポジトリには最新のドライバーが含まれていないので、以下のコマンドでリポジトリを追加します。

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
```


### インストール
まず、以下のコマンドでNVIDIAドライバーのバージョンを確認します。
僕の環境では「nvidia-driver-440」でした。

```
$ ubuntu-drivers devices
```

以下のコマンドでNVIDIAのドライバーをインストールします。

```
$ sudo apt install nvidia-driver-440
```

インストールが完了したら再起動して、さらに以下のコマンドを入力します。

```
$ nvidia-smi
```

以下のような結果が表示されれば成功です。
<img width="600" alt="setup-gpu-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/a0e557f0-6f1b-7d7b-ceb5-ede254ec9380.jpeg">



## 各種バージョン確認
TensorFlowは、CUDA、cuDNNのバージョンに依存しますので、事前にインストールするバージョンを確認しておきます。

まず以下のサイトからインストールするCUDA、cuDNNのバージョンを確認します。
「テスト済みのビルド構成」のセクションを確認します。
[https://www.tensorflow.org/install/source](https://www.tensorflow.org/install/source)

今回はTensorFlow2.1.0をインストールしていきたいと考えていますので、対応するバージョンはCUDA10.1、cuDNN7.6ということがわかります。

次に以下のサイトからNVIDIAドライバーとCUDAのバージョンに問題ないかどうか確認します。
[https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html)

僕の環境ではNVIDIAドライバーはバージョン440なので、問題ないことが確認できました。



## CUDAのインストール
以下のサイトからバージョン10.1の中で一番新しいものを選び、端末にダウンロードします。
ここではcuda-repo-ubuntu1804_10.1.243-1_amd64.debを選びました。
[http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/](http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/)

以下のコマンドを入力し、インストールを行います。

```
$ sudo dpkg -i cuda-repo-ubuntu1840_10.1.243-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/
$ ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt update
$ sudo apt install cuda-toolkit-10-1
```

インストール後、環境設定を行います。

```
$ sudo vim ~/.bashrc
```

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

再起動後、以下のコマンドを入力してバージョン等が表示されれば、CUDAのインストールに成功しています。

```
$ nvcc -V
```

<img width="600" alt="setup-gpu-3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/45be55c7-1d07-9d05-044d-57093dafedc3.jpeg">



## cuDNNのインストール
以下のサイトからdebファイルをダウンロードします。

種類は 以下の3つです。

- cuDNN Runtime Library for Ubuntu 18.04 (Deb)
- cuDNN Developer Library for Ubuntu 18.04 (Deb)
- cuDNN Code Samples and User Guide for Ubuntu 18.04 (Deb)

なお事前に無料のアカウント登録が必要です。
[https://developer.nvidia.com/rdp/cudnn-download](https://developer.nvidia.com/rdp/cudnn-download)

以下のコマンドでインストールを行います。

```
$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb
```

以下のコマンドでインストールテストを行い、「Test passed!」と表示されることを確認します。

```
$ cp -r /usr/src/cudnn_samples_v7/ $HOME
$ cd $HOME/cudnn_samples_v7/mnistCUDNNN
$ make clean && make
$ ./mnistCUDNAA
```

<img width="600" alt="setup-gpu-4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/ecfb3974-50b1-255c-21e1-d60edfc4d3be.jpeg">



## TensorFlowのインストール
TensorFlowをインストールしていきます。
なおPythonのバージョンは3.6.9です。

python3-dev、python3-pip、python3-venvをインストールします。

python3-dev、python3-pipは以下のサイトに指定があったので、インストールします。
[https://www.tensorflow.org/install/pip?hl=ja](https://www.tensorflow.org/install/pip?hl=ja)

python3-venvは仮想環境の構築のために、インストールします。

```
$ sudo apt install python3-venv python3-pip python3-venv
```

仮想環境を有効化します。

```
$ python3 -m venv venv36dl
$ . venv36dl/bin/activate
```

pipをアップグレードしておきます。

```
$ pip install --upgrade pip
```

バージョンを指定し、インストールします。

```
$ pip install tensorflow==2.1.0
```

以下のコマンドでインストールテストを行います。

```
$ python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
```

<img width="600" alt="setup-gpu-5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/e2fc7af9-1b8a-4c00-9a28-43376a5791bd.jpeg">

またTensorFlowがGPUを認識しているかをPythonインタプリタで確認します。
GPUの表記があれば認識しています。

```
$ python
```

```:インタプリタ
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
```

<img width="600" alt="setup-gpu-6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/5b2d07ec-017f-9199-752a-e469a67cef33.jpeg">



## 補足
TensorFlowについてですが、バージョン1.1.5以前は、tensorflow（CPU用）とtensorflow-gpu（GPU用）に分かれていましたが、バージョン1.1.5より新しいものはtensorflowパッケージでGPUサポートも含まれています。
[https://www.tensorflow.org/install/gpu?hl=ja](https://www.tensorflow.org/install/gpu?hl=ja)

KerasはTensorFlowとは独立したパッケージとTensorFlowに統合されたパッケージの2種類あります。
ですが、最近開発者がTwitter上で「Keras＝tf.keras」で発言していることもあり、今後はTensorFlowに統合されたパッケージが主流になっていくだろうとのことです。
[https://www.atmarkit.co.jp/ait/articles/2005/13/news017.html](https://www.atmarkit.co.jp/ait/articles/2005/13/news017.html)

僕もTensorFlowに統合されたパッケージを使っていく予定です。



## 参考サイト
- [https://qiita.com/konzo_/items/3e2d1d7480f7ef632603](https://qiita.com/konzo_/items/3e2d1d7480f7ef632603)
- [https://thr3a.hatenablog.com/entry/20180113/1515820265](https://thr3a.hatenablog.com/entry/20180113/1515820265)



## 参考文献
TensorFlowではじめるDeepLearning実装入門

https://www.amazon.co.jp/dp/4295003182

PythonとKerasによるディープラーニング

https://www.amazon.co.jp/dp/4839964262