NVIDIA CUDA toolkit on Windows

この記事の内容
===
Windows環境でGPUを利用した機械学習環境を整備します。
自分のPCの設定メモですので、内容のほとんどは最後に紹介する参考サイトの焼き直しです。

CUDA Toolkitインストールの主な手順
===

1. 最新のGPUドライバの入手
2. GPUドライバ、Tensorflow に対応した CUDA、cuDNNの入手
3. ドライバのインストール
4. Tensorflow、Pytorch、CuPy のインストール


システム構成
===

- PC：[DELL XPS15 2017](https://www.dell.com/ja-jp/shop/cty/pdp/spd/xps-15-9550-laptop)（GeForce GTX 1050）
- NVIDIA GPUドライバ： 451.48（GPUドライバは最新版がよさそうです）
- CUDA Toolkit：
  - [CUDA Toolkit 10.0 Archive](https://developer.nvidia.com/cuda-10.0-download-archive)（Tensorflow）
  - [CUDA Toolkit 10.1 update2 Archive](https://developer.nvidia.com/cuda-10.1-download-archive-update2)（Pytorch）
- cuDNN： v7.4.2 (Dec 14, 2018), for CUDA 10.0
- Python3.7（Anaconda）

CUDA10.1 の cuDNN v7.4.2 がなかったことが気になりますが、```torch.cuda.is_available()```は True を返してくれたので、PytorchからGPUが見えている、と信じてます。


最新のGPUドライバの入手
===

[NVIDIAドライバダウンロード](https://www.nvidia.co.jp/Download/index.aspx?lang=jp) で自分のGPUに対応するドライバを選択します。  

![01_nvidia_driver_xps15_2017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/b14e8800-b80f-fabc-f179-b29ad092759e.png)


「検索」ボタンを押下するとGPUドライバのインストールファイルダウンロード画面に遷移します。で、この時、ドライバのバージョンを控えておきます。

![02_nvidia_driver_xps15_2017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/6469d30e-adbd-8e76-d702-bcd16db767b0.png)


GPUドライバのバージョンに対応したCUDAのインストール
===

[Release Notes :: CUDA Toolkit Documentation](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html) の [Table 2. CUDA Toolkit and Compatible Driver Versions](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) から GPUドライバ に対応した CUDA Toolkit のバージョンを調べます。  

![03_cuda_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/8ea87dc8-8679-9989-427c-54aa8ad6a4f8.png)


新しいものほど良い、という考え方は、だいたいあっているのですが、あまり最新を攻めすぎると、ビルド済みTensorflowを利用できなかったりします。  
なので、[TensorFlowのテスト済みのビルド構成](https://www.tensorflow.org/install/source#gpu) で TensorFlow と CUDA と cuDNN のバージョンを確認し、適切なバージョンを選択します。
Windows の記載は無いのですが、だいたい Linux と同じみたいです。細かいことは動かなかった時に考えます。

![04_tensorflow-gpu_cuda_cudnn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/bf8639d7-3c7c-724d-c446-41e9ac179753.png)

- CUDA は [CUDA Toolkit | NVIDIA Developer](https://developer.nvidia.com/cuda-toolkit) からダウンロードします。

- cuDNN は [NVIDIA cuDNN | NVIDIA Developer](https://developer.nvidia.com/cudnn) からダウンロードします。ダウンロードするためには NVIDIA DEVELOPERアカウント登録（無料）が必要です。


ドライバのインストール
===

### 1. GPUドライバ  
  特にこだわりがなければ、インストールダイアログに沿って「次へ」ボタンを押下しているとインストールが完了します。

### 2. CUDA Toolkit
 インストールしようとすると Visual Studio がインストールされていない旨のメッセージが出力されます。気にせずインストールもできます。  
 インストールする Visual Studio はなんでもいいわけではなく、インストール対象のCUDAのリリース時期を勘案したバージョンの Visual Studio をインストールする必要があります。2020年7月現在、Visual Studio 2017が安全そうです。  
 CUDA のインストール完了後、下記の3つのフォルダに環境変数 PATH の設定をします。

  - CUDA10.0
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include

  - CUDA10.1
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64
    - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include

### 3. cuDNN  
 ZIPファイルを展開し、dll が格納されているファイルにパスを通します。  
 展開場所はどこでもよいですが、あまり深いところにすると、自分でどこに置いたか忘れるため、ここでは ```C:\tools\``` で展開するものとします。  
  で、展開後、下記のフォルダパスを環境変数 PATH に登録します。

    C:\tools\cuda\bin


Tensorflow、Pytorch、CuPy のインストール
===

Anaconda等のPython3環境がすでにインストールされているものとします。

### Tensorflow

  ```cmd
  > pip install tensorflow-gpu==1.14.0
  ```

### Pytorch

 [PyTorch](https://pytorch.org/) でインストールコマンドを取得できます。ただ、CUDA10.0は対応していませんでした。

  ```cmd
  > pip install torch==1.5.1+cu101 torchvision==0.6.1+cu101 -f https://download.pytorch.org/whl/torch_stable.html
  ```

### CuPy

  ```cmd
  > pip install cupy-cuda100
  ```


GPUの動作確認
===

### Tensorflow

  ```python
  from tensorflow.python.client import device_lib
  device_lib.list_local_devices()
  ```

### Pytorch

  ```python
  import torch
  print(torch.cuda.is_available())
  ```

### CuPy

  chaninerのインストールが必要になりますが、下記コマンドを実行すると CuPy の情報に CUDAやcuDNN の情報が表示されます。

  ```cmd
  > python -c 'import chainer; chainer.print_runtime_info()'
  ```


参考サイト
===

- [NvidiaドライバとCUDAとcuDNNとTensorflow-gpuとPythonのバージョンの対応 - Qiita](https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896)
- [Windows版TensorFlowでGPUを使う (CUDAのインストール)](https://qiita.com/rhene/items/31bf4713b9dbda28bcc1)
- [Windows 10でtensorflow-gpuを使う方法](https://intellectual-curiosity.tokyo/2019/06/17/windows-10%E3%81%A7tensorflow-gpu%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/)

- [TensorFlowからGPUが認識できているかを2行コードで確認する - 動かざることバグの如し](https://thr3a.hatenablog.com/entry/20180113/1515820265)