Windows Subsystem for Linux 2でCUDAを使えるようにする

1.cuda toolkitをインストール

sudo apt-key adv --fetch-keys 
http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub
cat <<EOF | sudo tee /etc/apt/sources.list.d/cuda.list
deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64 /
EOF
sudo apt update
sudo apt install cuda-toolkit-11-5

2.libcudnn8、libncclをインストール(任意)

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub
cat <<EOF | sudo tee /etc/apt/sources.list.d/cuDNN.list
deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64 /
EOF
sudo apt update
sudo apt install libcudnn8 libnccl-dev

3.動作確認

Tensorflowをインストールする。

pip install --upgrade tensorflow

以下を実行する。

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

実行結果の一部に下記が表示されていれば正常に導入できている。

 name: "/device:GPU:0"
 device_type: "GPU"

TensorflowからNVIDIAのGPUを使用する(Windows)

使用しているGPUがCUDAに対応していることを確認する

https://developer.nvidia.com/cuda-gpus#compute
上記サイトの一覧に自分のGPUがあることを確認する。

Build Tools for Visual Studio 2019をインストールする

https://visualstudio.microsoft.com/ja/downloads/
上記のページにアクセスし、Visual Studio 2019 のツールからBuild Tools for Visual Studio 2019をダウンロードする。
以下のC++ Build Toolsにチェックを入れてインストールする。それ以外はデフォルトで良い。

CUDA Toolkitをインストールする

https://developer.nvidia.com/cuda-toolkit-archive
上記のページにアクセスし、CUDA Toolkitをダウンロードする。
必ずTensorflowが動作保証しているバージョン(https://www.tensorflow.org/install/gpu)をダウンロードすること。最新バージョンではDLLが見つからないなどエラーが発生し、動作しない可能性が高い。
今回はTensorflow 2.3.0を使用するため、CUDA Toolkit 10.1 update2 (Aug 2019)をダウンロードする。

インストーラーを起動して以下のオプションを指定する。それ以外はデフォルトで良い。

cuDNNをインストールする

https://developer.nvidia.com/cudnn
上記のページにアクセスし、cuDNNをダウンロードする。(ダウンロードは無料だが、ユーザー登録が必要)
今回はTensorflow 2.3.0、CUDA Toolkit 10.1を使用するため、cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.1をダウンロードする。

ダウンロードしたファイルを解凍し、CUDAをインストールしたフォルダに上書きする。

動作確認

Tensorflowを実行し以下の通りGPUが読み込まれていることを確認できた。

2020-08-18 19:54:11.658397: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library nvcuda.dll
2020-08-18 19:54:11.895033: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: GeForce GTX 1070 computeCapability: 6.1
coreClock: 1.7715GHz coreCount: 15 deviceMemorySize: 8.00GiB deviceMemoryBandwidth: 238.66GiB/s
2020-08-18 19:54:11.895468: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudart64_101.dll
2020-08-18 19:54:11.924128: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cublas64_10.dll
2020-08-18 19:54:11.955523: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cufft64_10.dll
2020-08-18 19:54:11.962251: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library curand64_10.dll
2020-08-18 19:54:11.989806: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cusolver64_10.dll
2020-08-18 19:54:12.003706: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cusparse64_10.dll
2020-08-18 19:54:15.670393: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudnn64_7.dll
2020-08-18 19:54:15.670725: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1858] Adding visible gpu devices: 0