Win10にTensorflow2.1.0, CUDA10.1, cudnn7.6.5を入れる

## 本記事の内容
Windows10マシンにTensorflow2.1.0 + CUDA10.1 + cuDNN 7.6.5 をインストールする手順をまとめます。

## 以前のバージョンとの違い
1. CUDAインストーラーがPATHを通してくれるようになった (環境変数を自分で変更しなくてよくなった)
2. Visual Studio 2017の C++ compilerでは動かなくなった (VS2019再配布可能パッケージを入れればOK)
3. CPU版tensorflowもC++ compiler必須になった (VS2019再配布可能パッケージを入れればOK)
4. ロングネームを有効にしなきゃいけなくなった (必須かどうか未確認)

## 導入環境
CPU: Intel core-i9 9900K
GPU: RTX2080Ti
OS: Windows10 Pro

## 入れるもの
Visual Studio 2015~2019 VC++ 再配布可能パッケージ
tensorflow-gpu 2.1.0
CUDA 10.1
cuDNN 7.6.5 for CUDA10.1
Anaconda 2019.03 for Windows 64 bit

## CUDA, cuDNN, tensorflowのバージョン選定
今回使うGPUはturingアーキテクチャのRTX2080TiですのでCUDAは10.0以降であれば使えます。
https://en.wikipedia.org/wiki/CUDA

pipでインストールできるtensorflow-gpuビルドは特定のバージョンのCUDA用にビルドされたものですので、例えばwindows用にビルドされたtensorflow-gpu 2.1.0はCUDA10.1でないとそのままでは動きません。自分でビルドすれば別バージョンのCUDAに対応できますが、結構ハードル高いので素直に対応するバージョンのものを入れた方が無難だと思います。tensorflow 2.1.0のリリースノートにCUDA10.1, cuDNN7.6でビルドしていると書かれていますので、今回はCUDA10.1とcuDNN 7.6.5 for CUDA10.1を使用しました。
https://github.com/tensorflow/tensorflow/releases

## 1. Visual Studio 2015~2019 再配布可能パッケージをインストールする

MicrosoftのサイトからVisual Studio 2015~2019 C++ compiler 再配布可能パッケージをダウンロードしてインストールします
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/b951a92b-c13e-2cdd-c066-3f5ed9275d35.png" width=50%>

## 2. CUDA, cuDNNをインストールする

NVIDIAの公式サイトからダウンロードしてインストールします。僕の環境だとWin10, x86_64になります。
https://developer.nvidia.com/cuda-downloads
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/236e09b5-fad9-807f-83f5-487fe44c4786.png" width=50%>

インストールを実行します。グラフィックドライバーも一緒に入れてくれます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/fd30b521-c6bc-2f73-fdb2-aa0f852aa7ae.png" width=50%>

以前はここでシステムの環境変数でPATHを通してましたが要らなくなったようです。
nvccコマンドを呼んでみます。

```terminal:コマンドプロンプト
> nvcc -V
```
これでバージョン情報が表示されたら正常です。

## 3. cuDNNをインストールする

公式サイトからダウンロードします。
今回はcuDNN v7.6.5 for CUDA10.1のWindows10用のものを使用しました。
https://developer.nvidia.com/rdp/cudnn-download
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/80386de1-b241-d320-98e1-39453ebcc1f7.png" width=50%>

ダウンロードしてきたzipファイル内のcudaフォルダ内にあるbin, include, extra を「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1」にコピーします。

これを
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/e7b812a4-b503-437b-eb63-1fa48dfc222e.png" width=30%>
ここにコピーですね
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/a2804202-05e5-2026-4ea3-3dfb16774b74.png" width=30%>

## 4. Anacondaでpython環境をインストール
公式サイトからWindows用python3系64bit版インストーラーをダウンロードしてインストールします。
https://www.anaconda.com/distribution/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/f6769134-0c7c-2f1c-d77b-37239046c909.png" width=50%>

## 5. conda環境を作ってpackageをインストールする

Anaconda Promptを起動してconda環境をつくります。tensorflow2からpython3.7が使えるようになったので今回は3.7でやってみます。以下では「tf」という名前でpython 3.7のconda環境を作成しています。

```:Anaconda_prompt
(base) > conda create -n tf python=3.7
```

conda環境をつくったら有効にしてtensorflow-gpuをインストールします。他のpackageをインストールした後にtensorflow-gpuをインストールするとtensorflow-gpuのimportに失敗するようになる事があるので最初にインストールして動作を確認するのがオススメです。

```:Anaconda_prompt
(base) > conda activate tf
(tf) > pip install tensorflow-gpu==2.1.0
(tf) > python
>>> import tensorflow as tf
>>> tf.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
```
上記でimportが失敗する場合、C++コンパイラが入ってないかもしれません。
また、tf.config.list_physical_devices('GPU')で空のリスト[]が返ってきた場合、GPUが認識されていません。

## 6. 機械学習系パッケージをインストールする

```terminal:Anaconda_prompt
(tf) $ pip install optuna tensorflow-addons numpy pandas xlrd openpyxl xlsxwriter sklearn scipy catboost xgboost lightgbm matplotlib japanize-matplotlib seaborn boruta pydot3 graphviz ipywidgets jupyter tqdm pyarrow psutil
```
あと、僕はいつもこの辺も入れてます

```terminal:Anaconda_prompt
(tf) $ pip install pillow opencv-python selenium jaconv pykakasi colour-science Imath OpenEXR
```

えんじょい