Windows10にCUDA9.0とPyCUDAをインストールしてテストが動きcupyインストールに苦労してChainerのMNISTチュートリアルでGPU使用で速度が約6倍となるのを確かめるまで

[Windows10にCUDA8.0とPyCUDAをインストールしてテストが動くまで](https://qiita.com/ryo-yamaoka/items/5e09c2f2f0a24fce3282) を参考にさせていただきましたが、Ver違いか、PC環境の違いかPyCUDAのインストール方法等が一部異なっていたので、以下記録を公開します。

# 環境
CPU: Core i7 7700K
RAM: 32GB
GPU: GeForce GTX1080
OS: Windows10 Home 64bit

Windows Power Shell （アイコン右クリック「管理者として実行する」）で実行

# Anaconda
https://www.anaconda.com/download/
インストール時にチェックを入れた
　Add Anaconda to my PATH environment variable
　Register Anaconda as my default Python 3.6

Python 3.6.3  Anaconda 5.0.1 

# Visual Studio
環境変数のPathに下記を追加する
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

# CUDA Toolkit
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal
cuda_9.0.176_win10


# GPU デバイスドライバ
http://www.nvidia.co.jp/Download/index.aspx?lang=jp
より自分のOS, GPUに対応したものをインストール


# 環境変数を設定
ブログ例とは 10.0. 以下のバージョンが更新されていたので下記を試みた

```
setx /M INCLUDE ’C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\ucrt’
```

# pipでpycudaをインストール
```
pip install numpy
```

次に

```
pip install pycuda
```


を試みたが正常インストールせず。Pythonの文字コードの問題？

c.f. https://qiita.com/zinziroge/items/a55eda9ae0a8fdfac304
c.f. https://qiita.com/masato/items/713fa8876e50a65d575c
などを参考に、結局下記のインストールを行った。

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda から
pycuda‑2017.1.1+cuda90176‑cp36‑cp36m‑win_amd64.whl
をダウンロード

```
pip install 'C:\Users\｛自分のユーザ｝\Downloads\pycuda-2017.1.1+cuda90176-cp36-cp36m-win_amd64.whl'
```

# 再起動
再起動前は
import pycuda.driver as cuda
でエラーが出たが再起動で問題がなくなった。

# Chainer MNIST例でGPU使用で約6倍高速
## Chainerインストール

```
pip install chainer
```
chainer-3.2.0

## cupy インストール

```
pip install cupy
```
だがWindows環境だと動かず

```
PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\Users\\aoki\\AppData\\Local\\Temp\\pip-build-a3r0ap5k\\cupy'
```
なエラーが出る
[Win + Python3.6で「pip install」を実行したときに「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83」と表示される。](https://qiita.com/regeeeepg/items/be6a58276bdbd67dc096)
を参考にして ＿init＿.py を修正して再度 pip install cupy でOK
__あっちこっち検索してここに行き着いた。こんなの分かんないよ__ 
## MNIST例をGPU使用で実行
https://github.com/chainer/chainer/archive/v3.2.0.tar.gz をダウンロードして解凍


### チュートリアル実行
```
python chainer-3.2.0/examples/mnist/train_mnist.py
```

```
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.193365    0.102962              0.941033       0.9658                    24.631
2           0.07364     0.0768279             0.97685        0.9766                    44.4353
3           0.0476017   0.0678121             0.985117       0.9783                    64.3442
4           0.0363481   0.0621047             0.988317       0.9814                    84.6944
5           0.0288391   0.0700695             0.990767       0.9799                    105.237
6           0.0222801   0.0815667             0.992317       0.9789                    125.582
7           0.0233189   0.0941376             0.99295        0.9765                    145.872
8           0.0195297   0.072608              0.993267       0.982                     166.44
9           0.0121415   0.0803006             0.996183       0.9825                    187.566
10          0.0183421   0.072313              0.993967       0.9832                    208.961
11          0.0127146   0.0885336             0.995583       0.9817                    230.528
12          0.0120679   0.110891              0.9965         0.9802                    251.782
13          0.0149653   0.0880673             0.995467       0.9808                    273.149
14          0.00883313  0.0925014             0.997333       0.9805                    295.164
15          0.0121797   0.106574              0.99625        0.9795                    317.23
16          0.00828545  0.117745              0.997567       0.9815                    339.405
17          0.0130495   0.0902346             0.996367       0.9833                    361.733
18          0.00622861  0.144263              0.998083       0.9777                    384.78
19          0.0122948   0.10164               0.996317       0.9827                    408.305
20          0.00753224  0.0918758             0.99765        0.9835                    432.642
```

### GPU使用時は ‐g 0 をつける
```
python chainer-3.2.0/examples/mnist/train_mnist.py -g 0
```

```
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.193117    0.103204              0.942433       0.9673                    3.23175
2           0.0732215   0.0745765             0.976482       0.9778                    5.78444
3           0.0478743   0.0838417             0.984848       0.9745                    8.26351
4           0.0385924   0.0775026             0.987282       0.9787                    10.804
5           0.0282176   0.0765588             0.990781       0.9793                    13.3531
6           0.0238069   0.0894794             0.992031       0.9784                    15.879
7           0.0207121   0.102661              0.993332       0.9743                    18.406
8           0.0179733   0.0875146             0.993998       0.9798                    20.9028
9           0.0152781   0.0864125             0.995265       0.9809                    23.4604
10          0.0194912   0.0782601             0.993565       0.9812                    25.988
11          0.0111541   0.0869075             0.996666       0.982                     28.5471
12          0.0122531   0.0947352             0.996215       0.9818                    31.0586
13          0.0146315   0.0888069             0.995482       0.9797                    33.5438
14          0.0112458   0.0867098             0.996465       0.9819                    36.0318
15          0.00814456  0.0958816             0.997366       0.9818                    38.532
16          0.0103134   0.109307              0.997132       0.9807                    41.0771
17          0.0115547   0.0960045             0.996199       0.9825                    43.5898
18          0.00831023  0.107684              0.997749       0.9824                    46.1141
19          0.010538    0.104213              0.996699       0.9825                    48.6488
20          0.0104301   0.143603              0.997049       0.9781                    51.293
```

データやNNの組み方によっても早さは変わるのだろうが約8倍となった。そんなでもないなと思ったけど1週間かかるものが1日、8時間かかるテストが1時間、と考えるとやっぱりいいよな。

# TensorFlowも
## cuDNN
https://developer.nvidia.com/rdp/cudnn-download
Download cuDNN v7.0.5 (Dec 11, 2017), for CUDA 9.1 をダウンロード
http://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-windows を参照して3つのファイルを所定の場所にコピーする

- PCの環境変数のCUDA_PATHに　C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0　を指定する
- Visual Studio を起動し