概要
今更だけどもWindows10のcuda10.0固定環境にてTensorflow2を使いたくなったのでインストールをしたときのメモ。
TensorflowでGPUを使おうとすると、ドライババージョンやCUDAバージョン、GPUのCompatibility、対応するPython、cuDNN、Tensorflowのバージョンととにかく依存関係の処理が面倒くさい……
今の時代大人しくクラウドでnvidiaのマシンイメージ入れてDockerであれこれいじるのが一番ラクだし再現性も確実なのだが、どうしてもオンプレミスのWindows環境でなにかやる機会は無くならないものだ。
特に最近この記事で紹介されているようにGPUをDockerで動かす障壁も無くなってきているので、この記事は別途Linux環境を準備できてしまえば読む必要などない。
まとめ
(2021/5/10)意外と見られているようなので、少し追記した。
- tensorflow install からCUDAやPython、Tensorflowのバージョン対応を確認
- 何故かcondaで認識されるCUDAバージョンが異なる現象が発生
- 仕方がないのでpipでTensorflowをインストールしたらなんとかなった
一応動いたもののあまりきれいな解決ではないので、詳しい人いたら教えてください。
追記
結局これはCondaの仮想環境が引き起こしている問題ですので、Condaを使わなければこの問題にはぶち当たらない。もしかしたら .condarc
で仮想環境で使うCUDAのパスを変えたりできれば下に記したエラーは回避できるのかもと思ったり。
ただ私は別の記事でも書いたがAnacondaは商用利用のライセンスが面倒になったことやこういう特殊な仮想環境にまつわるトラブルが絶えないということもあり、最近は使うのをやめてしまった。
AnacondaなしでTensorflow + GPUの環境を作るのもきちんとバージョンを合わせた上で手順を踏めば実はそんなに難しくないので、本記事にあるような特殊な事情( Windows10 + anaconda + cuda 10.0がどうしても必要)がない場合、下記URLなどを参考にインストールを試みるのをおすすめする。
ここのサイトは非常に詳細かつステップバイステップで手順を記してくれているので、とても参考になります。CUDA、cuDNNのインストールもここのサイト見ながら入れるのがおすすめです。
詳細な手順は下へ
前提
- Windows 10 pro 1909
- conda 4.8.4
- CUDA toolkit(
cuda_10.0.130_win10_network.exe
をインストール済み)
はインストール済みとします。
CUDAドライバーはこちらから
> nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 442.23 Driver Version: 442.23 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce RTX 2070 WDDM | 00000000:42:00.0 On | N/A | | 45% 38C P8 16W / N/A | 1012MiB / 8192MiB | 11% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
nvidiaドライバーのバージョンは442.23なので、CUDA10.0には問題なく対応しているはず。 CUDA toolkit documentation
インストールするバージョンの確認
まず、Tensorflow + CUDA + CUDNN + Pythonのバージョン対応を確認する。ここを怠ると面倒なことになる。
tensorflow install の下のほう。
今回の場合CUDA10.0に固定するのがネックになるので、これに合わせようとすると 結果、Pythonは3.6、Tensorflow2.0、CUDNN7.4が最新になるらしい
また、どうやらTensorflow2.0はまだCPU版とGPU版が統合されていないようなので、インストール時にはtensorflow-gpuを指定する必要がある。
Python3.6のAnaconda環境を作成
> conda create -n tensorflow2 python=3.6
cuDNN インストール
> conda install cudnn==7.3.1 added / updated specs: - cudnn==7.3.1 The following packages will be downloaded : package | build ---------------------------|----------------- cudnn-7.3.1 | cuda10.0_0 148.7 MB ------------------------------------------------------------ Total: 148.7 MB The following NEW packages will be INSTALLED: cudatoolkit pkgs/main/win-64::cudatoolkit-10.0.130-0 cudnn pkgs/main/win-64::cudnn-7.3.1-cuda10.0_0
tensorflow-gpuのインストール
なぜかtensorflow-gpuのインストールをcondaからしようとすると、
> conda install tensorflow-gpu==2.0.0 The following specifications were found to be incompatible with your system: - feature:/win-64:: _cuda==10.2=0 - feature:|@/win-64::_cuda==10.2=0 Your installed version is: 10.2
といわれてしまいインストールできない。
nvcc -V
の結果は
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2018 NVIDIA Corporation Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018 Cuda compilation tools, release 10.0, V10.0.130
としっかりCUDA10.0なのに。。。
この問題は、どうやらcondaが独自のCUDAを持つことに起因する?しかし、cudnnインストール時にcuda-toolkitも同時にインストールされており、そのバージョンは10.0であるためこのエラーが起こる理由にはならないような気も... Cuda Problem #35270 -pytorch-
あまりpipとcondaを混ぜてはいけないというのは広く言われていることであるが、condaが原因であるならばということで、今回は仕方なく
pip install tensorflow-gpu==2.0.0
を行ったところ何の問題もなくインストールができた。
from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) [name: "/device:CPU:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 2016828516408465505 , name: "/device:GPU:0" device_type: "GPU" memory_limit: 6624727531 locality { bus_id: 1 links { } } incarnation: 17117474705175694148 physical_device_desc: "device: 0, name: GeForce RTX 2070, pci bus id: 0000:42:00.0, compute capability: 7.5" ]
ときちんとGPUを認識しているようである。
Tensorflow関連の記事
RadeonでTensorFlowを使える!tensorflow-directmlがすごいというお話 - 端の知識の備忘録