01.03a tensorflowとCUDA

【現 象】

機械翻訳機作成時、CUDAで「NOY FOUND」エラーが発生するとともに、CPUが高負荷となりGPUが使用されていない状況となりました。

【使用環境】

    python             : Python 3.7.6 (default, Jan 8 2020, 20:23:39)
    Keras              : 2.3.1
    tensorflow-gpu  : 1.15.0



【原 因】

下記は成功した場合のメッセージですが、エラー時「Successfully opened dynamic library」が「NOT FOUND」でした。

成功例をよくみると「cudart64_100.dll」とあります。

pciBusID: 0000:01:00.0
2020-10-16 19:47:41.339759: I tensorflow/stream_executor/platform/default/dso_loader.cc:44]
	Successfully opened dynamic library cudart64_100.dll
2020-10-16 19:47:41.354568: I tensorflow/stream_executor/platform/default/dso_loader.cc:44]
	Successfully opened dynamic library cublas64_100.dll

以前最初にGPUとCUDAを使用した際にも同じことになり、その際はPATHが切れていないという理由で「NOT FOUND」になったと思っていましたが、その時出ていたDLL名もバージョン指定されており早く気が付くべきでした。

つまり、tensorflow-gpuは予め該当のCUDA バージョンが決められているということです。



【対 策】

色々調査すると、下記サイトに対応表がありました。


【Tensorflow GPU, CUDA, CuDNNのバージョン早見表】

https://www.tensorflow.org/install/source#tested_build_configurations

GPU
バージョン              Python Ver      コンパイラ  ビルドツール    cuDNN   CUDA
tensorflow-2.1.0        2.7、3.5~3.7   GCC 7.3.1   Bazel 0.27.1    7.6     10.1
tensorflow-2.0.0        2.7、3.3~3.7   GCC 7.3.1   Bazel 0.26.1    7.4     10.0
tensorflow-gpu-1.14.0   2.7、3.3~3.7   GCC 4.8     Bazel 0.24.1    7.4     10.0
tensorflow-gpu-1.13.1   2.7、3.3~3.7   GCC 4.8     Bazel 0.19.2    7.4     10.0
tensorflow-gpu-1.12.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.11.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.10.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.9.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.11.0    7       9
tensorflow-gpu-1.8.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.10.0    7       9
tensorflow-gpu-1.7.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.9.0     7       9
tensorflow-gpu-1.6.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.9.0     7       9
tensorflow-gpu-1.5.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.8.0     7       9
tensorflow-gpu-1.4.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.5.4     6       8
tensorflow-gpu-1.3.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.5     6       8
tensorflow-gpu-1.2.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.5     5.1     8
tensorflow-gpu-1.1.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.2     5.1     8
tensorflow-gpu-1.0.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.2     5.1     8
これによると、

「tensorflow-gpu V1.00.x」~「tensorflow-gpu V1.04.x」  CUDA v08
「tensorflow-gpu V1.05.x」~「tensorflow-gpu V1.12.x」  CUDA v09
「tensorflow-gpu V1.13.1」~「tensorflow-gpu V1.15x」  CUDA v10.0
「tensorflow V2.0.0」 CUDA 10.0
「tensorflow V2.1.0」 CUDA 10.1

とあり、現在CUDA最新はV11.1です。

今までは簡単に「pip」でtensorflowをインストールして使用してきましたが、その都度CUDAのバージョンも交換する必要があり、同時にcuDNNはCUDAに依存するので同時に変更しないと動作しません。


少なくとも現在はCUDAがエラーでGPUを使用していないので「CUDA V10.0」をインストールしなおします。


しかしそうすると前回のKeras編でやったように 実際のところテキストごとに「tensorflow」「keras」のバージョン指定があるので、その都度インストールが必要になってしまいます。

これが面倒なので、GGEの場合は次のようにしました。

・ CUDA、CuDNNは対なので対のまま下記バージョンを下記と同じ順番でインストールします。
    複数のバージョンをバージョンが古い順にインストールしていくという意味です。
    CUDA V9.0 → CUDA V10.0 → CUDA V10.1 → CUDA V11.1(2020/10最新)

・ CuDNNを展開し下記フォルダー内にあるCUDAの同じバージョン内にコピーします。
    「c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\」

・ システムの詳細設定→環境変数
    「CUDA_PATH」と「NVCUDASAMPLES_ROOT」を使用するCUDAバージョンに変更
    最初最新になっているので「CUDA V10.0」の場合は「CUDA V10」にするという意味です




【結 果】

この状態だとドライバーは最新版を使用しているのに、パスは該当のバージョンのものを使用することになっているので、エラーは回避できますが、ゲームなどで最新のCUDAを使用しているものは異常になるかもしれませんので、正確には専門サイトでご確認ください。


一応これで動かすとGPU使用率が上がりCPU使用率が低下したのでOKのような気がします。


【参考文献】


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system