先日TensorFlow2.1がリリースされました。大きな変更点の1つとして「CPU版とGPU版の統合」があります。今までは環境に応じてinstall tensorflowとinstall tensorflow-gpuを使い分けていたのですが、全てtensorflowで一括管理されるようになりました。これは嬉しい!
というわけなので、早速私の環境にもTensorFlow2.1を入れてみました。conda install tensorflow=2.1
を実行し、GPUを確認してみましょう^^
>from tensorflow.python.client import device_lib
>device_lib.list_local_devices()[name: “/device:CPU:0”
device_type: “CPU”
memory_limit: 268435456
locality {
}
incarnation: 4003817743788326505
]
GPUが認識されませんね…。私も一発で上手くいくなんて思ってなかったです。というわけで、今回はこの状況を直してみたいと思います。
今回の環境:
・OS:Windows 10
・Python:3.7.3 Anaconda
・Cuda:10.1
・CuDNN:7.6.5 for Cuda 10.1
前提:Cudaのバージョンは正しい
TensorFlow 2.1はCudaが10.1である必要があります。念のためにnvcc -V
でCudaのバージョンを確認してみましょう。
>nvcc -Vnvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.1, V10.1.243
うん。当然10.1が入ってます。とりあえずここは問題ないようです。
(Cuda 10.1が入っていなかった方は、Cudaとそれに対応するcudnnを以下からインストールしてください。詳細は他サイト様が詳しく解説していますのでここでは割愛します。)
他の問題を検討してみましょう。
浮き上がる様々な原因
① Anaconda側でインストールされているCuDNNのビルドが対応していない
conda list
でcudnnのバージョンを確認してみると以下の通りでした。
cudnnのビルドがcuda10.0になっています。元々tensorflow 2.0を使用していた環境をアップデートさせたのですがcudnnがこれに追従していなかったようです。 nvcc -V
では見破れない罠でした。なので、ビルドをcuda10.1に指定してアップデートしましょう。
conda install cudnn=7.6.5=cuda10.1_0
でいけるはずです。tensorflowをpipで入れた方は、こちらもpipでインストールした方が無難だと思います。
さてこれで直りましたでしょうか。私はまだ直りませんでした。(後述しますが、このcudnnのビルド対応処理は必須です。)
② tensorflowのビルドが悪いのかも
現在、私のtensorflowのビルドはmklになっています。
Anacondaにおいてtensorflowのビルドはeigen, gpu, mklの3種類が存在します。今回は他のビルドでインストールし直してみましょう。
- eigenの場合...
conda install tensorlfow=2.1.0=eigen_py37hd727fc0_0
→ダメでした。 - gpuの場合...
conda install tensorflow=2.1.0=gpu_py37h7db9008_0
→いけました!
ちなみにこの後、cudnnのビルドを10.0(=TensorFlow2.1に対応していないバージョン)に下げようとしたところ、「tensorflowのビルドもmklに変更するけどいい?」と聞かれました。
そのため
- Cudaのビルドも一致している必要がある=①の処理も必須
- mklはTensorFlow 2.1でもCPU専用っぽい。
ということが分かりました。
今回やったこと
>conda list
# Name Version Build Channel
cudnn 7.6.5 cuda10.1_0
tensorflow 2.1.0 gpu_py37h7db9008_0
tensorflow-base 2.1.0 gpu_py37h55f5790_0