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.0cudnn7.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サポート テスト済みビルド設定を参考に環境構築し,問題なく動作していた
  2. 2020/04/10頃,同じPCにUbuntuを再インストールし,同じように環境構築
  3. keras.layers.Conv2Dを使用したモデルを動かそうとするとエラー(上記のエラー文)
  4. GithubやStackOverflowにて,"CuDnnのバージョンを合わせろ"という議論を見つけたので,それに従う

やったこと

1. CuDnn7.4のバージョンアップ

これまでの経験から,TensorFlowのCUDA周りは,documentに従うべきと知っていたので,cuda 10.0 cudnn 7.4の関係は崩さない(ここが大きな間違いでした;;)ように,

cudnn7.4.1.5-1+cuda10.0cudnn7.4.2.24-1+cuda10.0

にしてみる.
nvidiaのリポジトリから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 → 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サポート テスト済みビルド設定に従わなくて,何回か痛い目を見たぞ.
まぁ,とりあえずやってみますか!!!
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!!!

結論

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

参考文献

note

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

sudo ubuntu-drivers autoinstall

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