TensorFlowのCUDA周りのUnknownError(convolution algorithm)を解決した話

Ubuntu 18.04 のCUDA周り（CuDnn）で苦戦したので,簡単にまとめておきます.比較的,初学者向けです.  
エラー文は以下

```:error_log_1
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.[Op:Conv2D]
```
## 先に結論
CuDnnを再インストールしただけ.
> **cudnn7.4.1.5-1+cuda10.0** &rarr; **cudnn7.6.5.32-1+cuda10.0**

## 以前の環境
* Ubuntu 18.04
* NVIDIA GeForce GTX 1080
* nvidia-driver 440
* CUDA 10.0
* cudnn 7.4
* Tensorflow-GPU = 2.0.0

## 解決後の環境
* Ubuntu 18.04
* NVIDIA GeForce GTX 1080
* nvidia-driver 440
* CUDA 10.0
* **cudnn 7.6**
* Tensorflow-GPU = 2.0.0

## 流れ
1. [TensorFlow　GPUサポート テスト済みビルド設定](https://www.tensorflow.org/install/source?hl=ja#linux)を参考に環境構築し,問題なく動作していた
2. 2020/04/10頃,同じPCにUbuntuを再インストールし,同じように環境構築
3. [keras.layers.Conv2D](https://keras.io/layers/convolutional/)を使用したモデルを動かそうとするとエラー（上記のエラー文）
4. GithubやStackOverflowにて,"CuDnnのバージョンを合わせろ"という議論を見つけたので,それに従う

## やったこと
### 1. CuDnn7.4のバージョンアップ
これまでの経験から,TensorFlowのCUDA周りは,documentに従うべきと知っていたので,cuda 10.0 cudnn 7.4の関係は崩さない（ここが大きな間違いでした;;）ように, 
> **cudnn7.4.1.5-1+cuda10.0** &rarr; **cudnn7.4.2.24-1+cuda10.0**

にしてみる.
[nvidiaのリポジトリ](https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/)から**cudnn7.4.2.24-1+cuda10.0**を落としてきて,とりあえずぶちこむ.

```:install_1
xxx@xxx:~$ sudo apt install libcudnn7-dev=7.4.2.24-1+cuda10.0 libcudnn7=7.4.2.24-1+cuda10.0
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
libcudnn7-dev : 依存: libcudnn7 (= 7.4.2.24-1+cuda10.0) しかし、7.6.5.32-1+cuda10.2 はインストールされようとしています
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```
当然のエラー.以前のが残っている.まずは,確認.

``` :package_check
dpkg -l | grep cuda

ii  cuda-10-0                                  10.0.130-1                                       amd64        CUDA 10.0 meta-package
ii  cuda-command-line-tools-10-0               10.0.130-1                                       amd64        CUDA command-line tools
ii  cuda-compiler-10-0                         10.0.130-1                                       amd64        CUDA compiler
ii  cuda-cublas-10-0                           10.0.130-1                                       amd64        CUBLAS native runtime libraries
ii  cuda-cublas-dev-10-0                       10.0.130-1                                       amd64        CUBLAS native dev links, headers
ii  cuda-cudart-10-0                           10.0.130-1                                       amd64        CUDA Runtime native Libraries
ii  cuda-cudart-dev-10-0                       10.0.130-1                                       amd64        CUDA Runtime native dev links, headers
ii  cuda-cufft-10-0                            10.0.130-1                                       amd64        CUFFT native runtime libraries
ii  cuda-cufft-dev-10-0                        10.0.130-1                                       amd64        CUFFT native dev links, headers
ii  cuda-cuobjdump-10-0                        10.0.130-1                                       amd64        CUDA cuobjdump
ii  cuda-cupti-10-0                            10.0.130-1                                       amd64        CUDA profiling tools interface.
ii  cuda-curand-10-0                           10.0.130-1                                       amd64        CURAND native runtime libraries
ii  cuda-curand-dev-10-0                       10.0.130-1                                       amd64        CURAND native dev links, headers
ii  cuda-cusolver-10-0                         10.0.130-1                                       amd64        CUDA solver native runtime libraries
ii  cuda-cusolver-dev-10-0                     10.0.130-1                                       amd64        CUDA solver native dev links, headers
ii  cuda-cusparse-10-0                         10.0.130-1                                       amd64        CUSPARSE native runtime libraries
ii  cuda-cusparse-dev-10-0                     10.0.130-1                                       amd64        CUSPARSE native dev links, headers
ii  cuda-demo-suite-10-0                       10.0.130-1                                       amd64        Demo suite for CUDA
ii  cuda-documentation-10-0                    10.0.130-1                                       amd64        CUDA documentation
ii  cuda-driver-dev-10-0                       10.0.130-1                                       amd64        CUDA Driver native dev stub library
ii  cuda-drivers                               440.64.00-1                                      amd64        CUDA Driver meta-package
ii  cuda-gdb-10-0                              10.0.130-1                                       amd64        CUDA-GDB
ii  cuda-gpu-library-advisor-10-0              10.0.130-1                                       amd64        CUDA GPU Library Advisor.
ii  cuda-libraries-10-0                        10.0.130-1                                       amd64        CUDA Libraries 10.0 meta-package
ii  cuda-libraries-dev-10-0                    10.0.130-1                                       amd64        CUDA Libraries 10.0 development meta-package
ii  cuda-license-10-0                          10.0.130-1                                       amd64        CUDA licenses
ii  cuda-memcheck-10-0                         10.0.130-1                                       amd64        CUDA-MEMCHECK
ii  cuda-misc-headers-10-0                     10.0.130-1                                       amd64        CUDA miscellaneous headers
ii  cuda-npp-10-0                              10.0.130-1                                       amd64        NPP native runtime libraries
ii  cuda-npp-dev-10-0                          10.0.130-1                                       amd64        NPP native dev links, headers
ii  cuda-nsight-10-0                           10.0.130-1                                       amd64        CUDA nsight
ii  cuda-nsight-compute-10-0                   10.0.130-1                                       amd64        NVIDIA Nsight Compute
ii  cuda-nvcc-10-0                             10.0.130-1                                       amd64        CUDA nvcc
ii  cuda-nvdisasm-10-0                         10.0.130-1                                       amd64        CUDA disassembler
ii  cuda-nvgraph-10-0                          10.0.130-1                                       amd64        NVGRAPH native runtime libraries
ii  cuda-nvgraph-dev-10-0                      10.0.130-1                                       amd64        NVGRAPH native dev links, headers
ii  cuda-nvjpeg-10-0                           10.0.130.1-1                                     amd64        NVJPEG native runtime libraries
ii  cuda-nvjpeg-dev-10-0                       10.0.130.1-1                                     amd64        NVJPEG native dev links, headers
ii  cuda-nvml-dev-10-0                         10.0.130-1                                       amd64        NVML native dev links, headers
ii  cuda-nvprof-10-0                           10.0.130-1                                       amd64        CUDA Profiler tools
ii  cuda-nvprune-10-0                          10.0.130-1                                       amd64        CUDA nvprune
ii  cuda-nvrtc-10-0                            10.0.130-1                                       amd64        NVRTC native runtime libraries
ii  cuda-nvrtc-dev-10-0                        10.0.130-1                                       amd64        NVRTC native dev links, headers
ii  cuda-nvtx-10-0                             10.0.130-1                                       amd64        NVIDIA Tools Extension
ii  cuda-nvvp-10-0                             10.0.130-1                                       amd64        CUDA nvvp
ii  cuda-repo-ubuntu1804                       10.0.130-1                                       amd64        cuda repository configuration files
ii  cuda-runtime-10-0                          10.0.130-1                                       amd64        CUDA Runtime 10.0 meta-package
ii  cuda-samples-10-0                          10.0.130-1                                       amd64        CUDA example applications
ii  cuda-toolkit-10-0                          10.0.130-1                                       amd64        CUDA Toolkit 10.0 meta-package
ii  cuda-tools-10-0                            10.0.130-1                                       amd64        CUDA Tools meta-package
ii  cuda-visual-tools-10-0                     10.0.130-1                                       amd64        CUDA visual tools
ii  libcudnn7                                  7.4.1.5-1+cuda10.0                               amd64        cuDNN runtime libraries
ii  libcudnn7-dev                              7.4.1.5-1+cuda10.0                               amd64        cuDNN development libraries and headers
ii  libnccl-dev                                2.6.4-1+cuda10.0                                 amd64        NVIDIA Collectives Communication Library (NCCL) Development Files
ii  libnccl2                                   2.6.4-1+cuda10.0                                 amd64        NVIDIA Collectives Communication Library (NCCL) Runtime
```

libcudnn7を削除.

```:remove_package
sudo apt-get --purge remove libcudnn7*
```
改めて,

```:install_1
sudo apt install libcudnn7-dev=7.4.2.24-1+cuda10.0 libcudnn7=7.4.2.24-1+cuda10.0
```
インストールが完了し,コードを実行するも,やっぱり同じエラー...

### 2.CuDnn7.4 &rarr; CuDnn7.6
長い長い実行ログを見ると,こんな1文を発見.

```:error_log_2
Loaded runtime CuDNN library: 7.4.2 but source was compiled with: 7.6.0.
CuDNN library major and minor version needs to match or have higher minor version in case of CuDNN 7.0 or later version.
If using a binary install, upgrade your CuDNN library.
If building from sources, make sure the library loaded at runtime is compatible with the version specified during compile configuration.
```
おっ！！CuDNN 7.6.0でコンパイルしてるだと！？（それ以外の文はバージョンあげろとか,一致させろとかお決まりの内容）
でも,待てよ...[TensorFlow　GPUサポート テスト済みビルド設定](https://www.tensorflow.org/install/source?hl=ja#linux)に従わなくて,何回か痛い目を見たぞ.
まぁ,とりあえずやってみますか！！！
1.と同じ手順で,パッケージをremoveし,**cudnn7.6.5.32-1+cuda10.0**を再インストール.

```:install_2
sudo apt install libcudnn7-dev=7.6.5.32-1+cuda10.0 libcudnn7=7.6.5.32-1+cuda10.0
```
で,コードを実行...

```
2020-04-15 23:54:10.330338: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
2020-04-15 23:54:10.330384: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2020-04-15 23:54:10.330412: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0
2020-04-15 23:54:10.330453: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0
2020-04-15 23:54:10.330482: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0
2020-04-15 23:54:10.330524: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0
2020-04-15 23:54:10.330553: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-04-15 23:54:10.333274: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
```
All Success!!!

## 結論
テスト済みビルドのページはなかなか更新されないみたいなので,ちゃんとログにしたがって,バージョンを合わせましょう.
詳細な原因は分かり次第,記述していくつもりです.（するとは言ってない）
原因をご存知の方はお教えいただけると幸いです.

## 参考文献
* [Ubuntu 18.04へのCUDAインストール方法
AWS](https://qiita.com/yukoba/items/4733e8602fa4acabcc35)
* [cuDNN初期化エラーが出てTensorFlowGPUの学習ができなくなったけど解決した話](https://qiita.com/Ka-k/items/cb942855ab669ff60630)
* [Error : 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. #24828](https://github.com/tensorflow/tensorflow/issues/24828)
* [Failed to get convolution algorithm. This is probably because cuDNN failed to initialize,](https://stackoverflow.com/questions/53698035/failed-to-get-convolution-algorithm-this-is-probably-because-cudnn-failed-to-in)

## note
ubuntu18.04.2以降使えるようになった

```bash: 
sudo ubuntu-drivers autoinstall
```
でGPU driverを入れると最新のCUDAバージョン(10.2 : 2020/04/15現在)がインストールされ,tensorflowのバージョンと合わないことがあります.
また,バージョンを合わせようとCUDAを再インストールするとGPU driverもインストールされ,driverが合わなくなる場合があります.
rebootする際には,十分にご注意ください.