Win10にTensorflow2.0.0rc0, CUDA10.0, cudnn7.4.1, 機械学習環境一式を入れる

## 本記事の内容
Windows10マシンにCUDA使ってTensorflowが動くところまで機械学習環境を構築します。

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

## 入れるもの
Visual Studio 2017 community
CUDA 10.0
cuDNN 7.4.1 for CUDA10.0
Anaconda 2019.03 for Windows 64 bit
tensorflow-gpu==2.0.0rc0
python packageいろいろ (numpy, pandas, scipy, matplotlib, seaborn, scikit-learn)

## CUDA, cuDNN, tensorflowのバージョン選定
今回使うGPUはturingアーキテクチャの<font color="red">RTX2080TiですのでCUDAは10.0以降でないと使えません。</font>
https://en.wikipedia.org/wiki/CUDA

PyPIに置いてあるtensorflow-gpuは特定のバージョンのCUDA用にビルドされたものですので、例えばwindows用にビルドされたtensorflow-gpu==1.13.0ではCUDA9しか使えません。2019年5月20日現在CUDA10以降対応のビルドはtensorflow-gpu==2.0.0alphaのみで、CUDA10.0用のビルドとなります。自分でビルドすれば1.13.0でCUDA10.1を使うようなことも出来るようですがpipでインストール出来ちゃうならそれで良いですよね。tensorflow2では書き方含めいろいろ変わっちゃいますが、今回の用途ならそれで構いません。
https://www.tensorflow.org/install/source_windows

cuDNNのバージョンは〇〇以降という指定がされてる筈なんですが、どこに書いてあるのか見つけられませんでした。こちらの記事にcuDNN 7.4.1以降対応とありましたので、7.4.1を使うことにしました。
https://dev.infohub.cc/tensorflow2-alpha-gpu/

ということで、使用バージョンは以下となります。
CUDA 10.0
cuDNN 7.4.1 for CUDA10.0
tensorflow-gpu==2.0.0alpha

## 1. Visual Studio 2017 communityをインストールする

MicrosoftのサイトからVisual Studio 2017 communityをダウンロードしてインストールします
https://visualstudio.microsoft.com/ja/vs/older-downloads/

オプション設定メニューでC++によるデスクトップ開発とユニバーサルWindowsプラットフォーム開発を有効にしてインストールします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/2181967e-65bb-09e5-d023-24409e6cf495.png" width=60%>

## 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に以下３つを追加します。

```terminal:環境変数{PATH}
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
```
PATHが通ったか確認しておきます。

```terminal:コマンドプロンプト
> where nvcc.exe nvvp.exe cupti64*
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc.exe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp\nvvp.exe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\lib64\cupti64_100.dll
```
ついでにnvccコマンドを呼んでみます。

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

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

公式サイトからダウンロードします。
今回はcuDNN v7.4.1 for CUDA10.0の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%>

ダウンロードしてきたcudnn-10.0-windows10-x64-v7.4.1.5.zipを解凍し、出てきたフォルダを「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0」にコピーします。

これを
<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環境をつくります。<font color="red">2019年8月時点でtensorflowはpython3.5～3.6にしか対応していません。必ずpythonのバージョンを指定するようにします。</font>指定しないとpython 3.7がインストールされてしまってtensorflowが正常に動きません (importに失敗するはずです)。以下では「tf」という名前でpython=3.6のconda環境を作成します。

```terminal:Anaconda_prompt
(base) > conda create -n tf python=3.6
```
conda環境をつくったら有効にしてtensorflow-gpuをインストールします。他のpackageをインストールした後にtensorflow-gpuをインストールするとtensorflow-gpuのimportに失敗するようになる事があるので最初にインストールして動作を確認するのがオススメです。

```terminal:Anaconda_prompt
(base) > conda activate tf
(tf) > pip install tensorflow-gpu==2.0.0rc0
(tf) > python
>>> import tensorflow as tf
```
上記でインポートがすんなり通ったらCUDA, cuDNNが正常にインストールされています。

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

```terminal:Anaconda_prompt
(tf) $ pip install pip optuna tensorflow_addons numpy pandas xlrd sklearn scipy catboost xgboost lightgbm matplotlib seaborn boruta pydot3 graphviz ipywidgets jupyter tqdm pyarrow psutil
```
これでとりあえずの機械学習環境は用意できたと思います。
えんじょい

## 上手くいかないときにチェックすべきこと
- pythonのバージョンが3.5または3.6か (3.7はダメ)
- VC++コンパイラが入っているか (CUDAインストール時にVC++コンパイラがないことを警告されていないか)
- グラフィックボードに対応したCUDAを使っているか (2080TiだとCUDA10.0以降)
- CUDAバージョンに合ったcuDNNを使っているか (CUDAバージョンごとにcuDNNは別になるので注意)
- nvcc.exe, nvvp.exe, cupti64_***.dllにパスが通っているか
- tensorflow-gpuのバージョンは適切か (pipでインストールできるビルド済みtensorflowは特定のCUDAバージョンでしか使えない)
- ぜんぶ合ってるのにimportが通らない場合はconda環境を作り直して最初にtensorflowをインストールすると直ることがある

詳しくはこの辺を参照
https://en.wikipedia.org/wiki/CUDA
https://www.tensorflow.org/install/source_windows
https://dev.infohub.cc/tensorflow2-alpha-gpu/

## 更新履歴
20190905: conda環境作成～パッケージインストール手順を修正しました
20190905: 上手くいかないときにチェックすべきことを追記しました