Ubuntu18.04にCUDA10.1+cuDNN7.6.5+tensorflow-2.3.0をインストール

#はじめに
本投稿ではubuntu18.04環境でNVIDIAのGPUドライバ、CUDA10.1、cuDNN7.6.5、tensorflow2.3.0をインストールします。
環境は以下の通りです。
GPU : GTX1060
OS : Ubuntu18.04
Python : 3.6.9

**以下の参考手順は一例でありますの参考程度かつ自己責任でお願いいたします。**
またエンジニアではありませんので一部読みにくい表記などがございますが、ご容赦ください。


#機械学習のフレームワークについて
これまではtensorflow1.xx + kerasで学習を行っていましたが、tensorflow2についても興味があり、将来的なことも考えてtensorflow2に移行することにしました。
なお余談ですが使用中のGPUは将来的にはAmpere世代に交換予定です。Ampere世代ではCUDA11、cuDNN8が要求され、2020年11月時点ではtensorflow-nightly(2.4.0rc)で動作が確認されているとのことですが、正式版ではサポートはされていないようです。

#TensorflowのバージョンとCUDA, cuDNNの依存関係
GPUを利用して学習を高速化する場合には、tensorflow、CUDA、cuDNNのバージョンに気を付けなければなりません。[Tensorflowの公式サイト](https://www.tensorflow.org/install/source?hl=en "Tensorflowの公式サイト")を参照します。下図のようにtensorflow2.3.0をインストールする場合、cuDNNは7.6、CUDAは10.1である必要があります。とくにCUDAは10.1以上ではなく、10.1である必要があることに注意します。
![tensorflow_cuda_cudnn.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664963/2b8f013c-97be-f1a8-c76a-7640cc972731.png)

#NVIDIAのドライバインストール
###参考文献
この項目は以下を参考にさせていただきました。
・[UbuntuにNVIDIA driverをインストール/再インストールする方法](https://qiita.com/yto1292/items/463e054943f3076f36cc "UbuntuにNVIDIA driverをインストール/再インストールする方法")

・NVIDIAのドライバ、CUDAがインストールされている場合には下記のコマンドで削除します。

`sudo apt --purge remove nvidia-*`
`sudo apt --purge remove cuda-*`

・NVIDIAのGPUドライバは下記コマンドでaptを使ってインストールできます。
なお私の環境ではnouveauというubuntuデフォルトのドライバを無効化せずにインストール成功しました。
`sudo add-apt-repository ppa:graphics-drivers/ppa`
`sudo apt update`
`ubuntu-drivers devices`
ここでコンソール上にインストール可能なバージョンのリストが出てきます。
2020年11月時点の私の環境ではnvidia-driver-455がrecommendでした。
`sudo apt install nvidia-driver-<version>`
（注：`<version>` の部分はコンソール上に表示されるバージョンを入力）

###ドライバのインストールを確認
`nvidia-smi`と入力し下記のように指定したバージョンが表示されれば成功。

![NVIDIA-SMI.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664963/d612ecd7-628d-5096-abd4-a60fd7a401c9.png)


#CUDA10.1のインストール
[NVIDIAのサイト](https://developer.nvidia.com/cuda-10.1-download-archive-base?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=deblocal "NVIDIAのサイト")よりCUDAのdebファイルをダウンロードします。
ダウンロードしたディレクトリに移動後下記のコマンドでインストールします。
**最後のコマンドがポイントです!（理由は後述）**

`sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.105-418.39_1.0-1_amd64.deb`
`sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub`
`sudo apt-get update`
`sudo apt-get install cuda-toolkit-<version>`

NVIDIA公式サイトでは　`sudo apt-get install cuda`　と記載されていますが、これをしてしまうとGPUドライバのバージョンが変わってしまいまい、意図しない環境になることがあります。

###CUDAのPATHを通す
`export PATH="/usr/local/cuda/bin:$PATH"`
`export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"`

###CUDAのインストールを確認
コンソール上で `nvcc -V`　と入力し下記のように表示されればOKです。

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Fri_Feb__8_19:08:17_PST_2019
Cuda compilation tools, release 10.1, V10.1.105
```

###nvidia-smiとnvcc -Vで表示されるCUDAが違うが問題なし
CUDAにはランタイムとドライバAPIの二つのAPIがあるらしく、`nvidia-smi`と`nvcc -V`で表示されるCUDAバージョンが違っても問題ないらしい。実際にこれらのバージョンを合わせようと思ってインストールを繰り返した経験もあるが、結局バージョンが違ってもtensorflowの使用などには問題ないとわかった。
（もし認識が違っていればご教示ください。）

#cuDNNのインストール
ここまでうまくいっていれば、ほぼ終わったも同然です。
cuDNNはフリーでダウンロードできますが、[NVIDIAのサイト](https://developer.nvidia.com/cudnn-download-survey "NVIDIAのサイト")にメンバー登録してからダウンロードします。
以前のcuDNNは　Archived cuDNN Releases　をクリックして探します。
今回はUbuntu18.04に対応したcuDNN7.6.5のRuntime Library、Developer Library、Code SamplesのDebファイルをダウンロードします。
![CuDNN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664963/eec19b44-72d5-f3e6-1f30-d073bc60a789.png)
ダウンロードしたディレクトリで下記を実行します。
`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`

###cuDNNのテスト
コードサンプルの一つを実行し、エラーが出なければOKです。
`cp -r /usr/src/cudnn_samples_v7/ $HOME`
`cd  $HOME/cudnn_samples_v7/mnistCUDNN`
`make clean && make`
`./mnistCUDNN`

#Tensorflowのインストール
もう一息です。Tensorflow2ではpip3のupgradeが必要が必要です。
`python3 -m pip install --upgrade pip`
Tensorflowをインストールします。バージョンを指定しないと意図しないバージョンがインストールされてしまいます。<version>部分を`2.3.0`などのバージョンに置き換えて入力してください。
`python3 -m pip install tensorflow==<version>`

###python環境でtensorflowをimportできるか確認
`import tensorflow as tf`
`tf.__version__`
意図しているバージョンが表示されれば成功です。

#おわりに
Ubuntu18.04でGtensorflowによるGPUを使用した学習ができる環境を構築しました。Ampere世代のRTX30シリーズに入れ替え後に本記事を再度アップデートしたいと思います。エンジニアが本業ではないので、至らない点が多い投稿ですが参考になれば幸いです。