【Windows10環境構築】Keras-gpuとChainer-gpuの環境構築♬

備忘録ですが、いつもやっている気がする。。。何度やっても何か躓く。。
ただし、少しずつ進化しているかも。。世の中
今回は参考①を中心に参考にしています。
【参考】
⓪[【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～Chainer環境構築](https://qiita.com/MuAuan/items/3fc4dba323446024f471)
①[Keras-TensorFlow-GPU-Windows-Installation (Updated: 12th Apr, 2019)](https://github.com/antoniosehk/keras-tensorflow-windows-installation#keras-tensorflow-gpu-windows-installation-updated-12th-apr-2019)
②[pip で OpenCV のインストール](https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb)

###やったこと
（０）不必要なものを減らして空き容量を１５GB程度まで増やす
（１）Anacondaをダウンロードしてインストール
（２）Update Anaconda
（（３）Visual Studio 2015 Community Editionをインストール）
（４）Cudaをダウンロードしてインストール
（５）Cudnnをダウンロードしてインストール
（６）AnacondaのPythonを3.6環境に変更する
（７）conda activate keras-gpu
（８）mnist_mlp.pyを動かす
（９）pip install matplotlib, pip install sklearn, pip install 
opencv-pythonなどをインストール
（１０）chainer-gpuインストール
###（０）不必要なものを減らして空き容量を１５GB程度まで増やす
これ途中で止まると結局最初からやり直しになるから、十分確保して始めることをお勧めします。
なお、環境が錯綜するといろいろ弊害がある可能性があるので、前回インストールしたものは、サクッとアンインストールすることをお勧めします。
###（１）Anacondaをダウンロードしてインストール
[Anaconda Distribution](https://www.anaconda.com/distribution/)
18／5／2019現在は、Anaconda 2019.03 for Windows Installerで、Python3.7です。
なお、最新バージョンをダウンロードして後でpython3.6に変更します。
###（２）Update Anaconda
AnacondaPromptから以下を入力して最新化します。

```condaPrompt.
>conda update conda
>conda update --all
```
驚くほど、いろいろ変わります。
###（（３）Visual Studio 2015 Community Editionをインストール）
この工程がありません。
今回は入れていませんが、前回の環境が有効になっているようなので、必要ないのかどうかは不明ですが、参考①にはありません。
###（４）Cudaをダウンロードしてインストール
ここは以前と変わりません。
Cudaバージョンは、[CUDA Toolkit 10.1 Update 1 Download](https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10)です。
windows-x86_64-10-exe_localをダウンロードします。
インストール時間は１時間程度（目安）かかります。
###（５）Cudnnをダウンロードしてインストール
登録が面倒ですが、登録すればダウンロードするだけです。
バージョンは以下のとおりです。
Download cuDNN v7.5.1 (April 22, 2019), for CUDA 10.1
そしてある意味、ここ変わりました。
D:\cudnn-10.1-windows10-x64-v7.5.1.10
などのDirに解凍します。そして、この配下のcuda-binを環境変数を編集を実行してPATHに追加します。
そして、変更したら

```
echo %PATH%
```
※CUDAへの上書きは必要ないようです
![cudnn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/17559383-766b-9435-d124-63e0fbfab4b5.jpeg)
###（６）AnacondaのPythonを3.6環境に変更する

```command.
conda create -n keras-gpu python=3.6 numpy scipy keras-gpu
```
これも結構変わりますが、時間は短いです。
###（７）conda activate keras-gpu
コマンドはconda Promptから実行します。

```command.
(base) C:\Users\user>conda activate keras-gpu
```
これを実行するとconda Promptが以下のように変わります。

```before.
(base) C:\Users\user>
```

```after.
(keras-gpu) C:\Users\user>
```
###（８）mnist_mlp.pyを動かす
KerasもTensorflow-gpuも明示的にはインストールしていませんが、これで以下のアプリが動きます。簡単とは言え、４０ｓで終わり、精度もなかなかです。
[keras/examples/mnist_mlp.py](https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py)
###（９）pip install matplotlib, pip install sklearn, pip install opencv-pythonなどをインストール

グラフやちょっと機械学習、そして何よりOpenCVは必須なので入れます。
簡単に以下のコマンドですんなり入ります。

```
(keras-gpu) C:\Users\user\ObjectiveNuro>pip install matplotlib
(keras-gpu) C:\Users\user\ObjectiveNuro>pip install sklearn
(keras-gpu) C:\Users\user\ObjectiveNuro>pip install opencv-python
```
###（１０）chainerインストール
また、将棋AIをやりたいので、Chainerも入れます。
以下のとおり、Chainerは最新版のchainer-6.0.0が入りました。
しかし、Cupyは入っていません。。。

```
Successfully installed chainer-6.0.0 filelock-3.0.10 typing-3.6.6 typing-extensions-3.7.2

(keras-gpu) C:\Users\user\ObjectiveNuro>python
Python 3.6.8 |Anaconda, Inc.| (default, Feb 21 2019, 18:30:04) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cupy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cupy'
>>> import chainer
>>>
```
ということで、Cupyをインストールしました。
以下のようにたくさん怒られましたが、インストールできました。

```
  WARNING: Subprocess output does not appear to be encoded as cp874
/  WARNING: Subprocess output does not appear to be encoded as cp874
done
  Stored in directory: C:\Users\user\AppData\Local\pip\Cache\wheels\27\5a\67\bfaf1d3ad99e17b134c31cf0b2ac352b7491d64d36134b4379
  Building wheel for fastrlock (setup.py) ... |  WARNING: Subprocess output does not appear to be encoded as cp874
  WARNING: Subprocess output does not appear to be encoded as cp874
/  WARNING: Subprocess output does not appear to be encoded as cp874
done
  Stored in directory: C:\Users\user\AppData\Local\pip\Cache\wheels\73\2b\fe\8bdf21b8ebdc58dfafa3a0935767d2ae9c8f68e49d04c5a190
Successfully built cupy fastrlock
Installing collected packages: fastrlock, cupy
Successfully installed cupy-6.0.0 fastrlock-0.4
```
そして、無事に[chainer版train_mnist.py](https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py)がGPU上で動きました。
ただし、以下のとおりなので、cuDNNは失敗しているみたいです。
⇒ということで、通常環境でCuPyとChainerを入れなおした結果、おまけの最後のように無事にエラーは消えました。

```
Please reinstall CuPy after you install cudnn
(see https://docs-cupy.chainer.org/en/stable/install.html#install-cudnn).
  'cuDNN is not enabled.\n'
```
###おまけ
```
>python mnist_mlp.py
Using TensorFlow backend.
60000 train samples
10000 test samples
WARNING:tensorflow:From C:\Users\user\Anaconda3\envs\keras-gpu\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From C:\Users\user\Anaconda3\envs\keras-gpu\lib\site-packages\keras\backend\tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 512)               401920
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_2 (Dense)              (None, 512)               262656
_________________________________________________________________
dropout_2 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_3 (Dense)              (None, 10)                5130
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
WARNING:tensorflow:From C:\Users\user\Anaconda3\envs\keras-gpu\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Train on 60000 samples, validate on 10000 samples
Epoch 1/20
2019-05-18 19:40:29.684671: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2019-05-18 19:40:29.871613: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: GeForce GTX 1060 3GB major: 6 minor: 1 memoryClockRate(GHz): 1.7335
pciBusID: 0000:01:00.0
totalMemory: 3.00GiB freeMemory: 2.43GiB
2019-05-18 19:40:29.878198: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-05-18 19:40:30.405281: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-05-18 19:40:30.409132: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0
2019-05-18 19:40:30.410497: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N
2019-05-18 19:40:30.411980: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2116 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:01:00.0, compute capability: 6.1)
2019-05-18 19:40:30.971229: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally
60000/60000 [==============================] - 3s 53us/step - loss: 0.2452 - acc: 0.9249 - val_loss: 0.1012 - val_acc: 0.9707
Epoch 2/20
60000/60000 [==============================] - 2s 27us/step - loss: 0.1037 - acc: 0.9684 - val_loss: 0.0931 - val_acc: 0.9733
Epoch 3/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0743 - acc: 0.9771 - val_loss: 0.0802 - val_acc: 0.9785
Epoch 4/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0601 - acc: 0.9814 - val_loss: 0.0737 - val_acc: 0.9801
Epoch 5/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0507 - acc: 0.9847 - val_loss: 0.0821 - val_acc: 0.9785
Epoch 6/20
60000/60000 [==============================] - 2s 28us/step - loss: 0.0445 - acc: 0.9868 - val_loss: 0.0865 - val_acc: 0.9789
Epoch 7/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0370 - acc: 0.9891 - val_loss: 0.1013 - val_acc: 0.9758
Epoch 8/20
60000/60000 [==============================] - 2s 25us/step - loss: 0.0331 - acc: 0.9902 - val_loss: 0.0960 - val_acc: 0.9801
Epoch 9/20
60000/60000 [==============================] - 2s 25us/step - loss: 0.0312 - acc: 0.9908 - val_loss: 0.0964 - val_acc: 0.9817
Epoch 10/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0294 - acc: 0.9916 - val_loss: 0.0891 - val_acc: 0.9802
Epoch 11/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0257 - acc: 0.9930 - val_loss: 0.0942 - val_acc: 0.9822
Epoch 12/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0264 - acc: 0.9928 - val_loss: 0.0946 - val_acc: 0.9820
Epoch 13/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0233 - acc: 0.9934 - val_loss: 0.1079 - val_acc: 0.9811
Epoch 14/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0219 - acc: 0.9938 - val_loss: 0.0978 - val_acc: 0.9831
Epoch 15/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0199 - acc: 0.9944 - val_loss: 0.1021 - val_acc: 0.9828
Epoch 16/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0210 - acc: 0.9940 - val_loss: 0.1109 - val_acc: 0.9813
Epoch 17/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0192 - acc: 0.9947 - val_loss: 0.0997 - val_acc: 0.9831
Epoch 18/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0186 - acc: 0.9953 - val_loss: 0.1085 - val_acc: 0.9830
Epoch 19/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0187 - acc: 0.9951 - val_loss: 0.1135 - val_acc: 0.9819
Epoch 20/20
60000/60000 [==============================] - 2s 26us/step - loss: 0.0200 - acc: 0.9950 - val_loss: 0.1159 - val_acc: 0.9838
Test loss: 0.11590634980594598
Test accuracy: 0.9838
```

```
>python train_mnist.py -g 0
C:\Users\user\Anaconda3\envs\keras-gpu\lib\site-packages\chainer\backends\cuda.py:143: UserWarning: cuDNN is not enabled.
Please reinstall CuPy after you install cudnn
(see https://docs-cupy.chainer.org/en/stable/install.html#install-cudnn).
  'cuDNN is not enabled.\n'
Device: @cupy:0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.191225    0.11152               0.941917       0.9644                    9.78808
2           0.0748072   0.0944838             0.976016       0.9714                    12.9273
3           0.0492318   0.0654779             0.984065       0.9796                    16.0494
4           0.0343065   0.0732255             0.989165       0.9793                    19.1852
5           0.0295044   0.0734612             0.990148       0.9793                    22.3522
6           0.0247848   0.0943174             0.991898       0.9777                    25.5636
7           0.0231668   0.0842453             0.992265       0.9798                    28.7199
8           0.0156254   0.110529              0.994799       0.9732                    31.8454
9           0.0176786   0.114648              0.993748       0.9758                    34.9805
10          0.0152345   0.079431              0.994615       0.9836                    38.1459
11          0.011109    0.0769602             0.996415       0.9825                    41.2668
12          0.0152396   0.121492              0.995532       0.9789                    44.3852
13          0.0110979   0.100953              0.996216       0.9813                    47.4914
14          0.0107481   0.0838874             0.996532       0.9828                    50.6697
15          0.00976045  0.111761              0.996999       0.9792                    53.8031
16          0.0112281   0.0990215             0.996566       0.9807                    57.014
17          0.0120273   0.0895522             0.996849       0.9814                    60.2077
18          0.00841965  0.0982618             0.997599       0.9809                    63.3512
19          0.00829624  0.106039              0.997515       0.9805                    66.5261
20          0.00973309  0.089214              0.997083       0.9828                    69.6759
```
Chainer-gpu環境
通常の環境でcupyとChainerをインストールすると、cuDNNのエラーが消え、１０％程度速くなりました。

```
>python train_mnist.py -g 0
Device: @cupy:0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.187907    0.0998692             0.9427         0.9685                    9.84457
2           0.072782    0.0879277             0.97665        0.972                     12.8331
3           0.0481786   0.0700986             0.984382       0.9797                    15.6598
4           0.0339355   0.0739472             0.988765       0.9791                    18.4719
5           0.0294084   0.0685768             0.990415       0.9812                    21.2692
6           0.0242083   0.0775707             0.992032       0.9795                    24.0988
7           0.0184116   0.115758              0.993832       0.9712                    26.9162
8           0.0195167   0.0967818             0.993532       0.9787                    29.7348
9           0.0143791   0.0879228             0.995632       0.9802                    32.6102
10          0.0165612   0.0826924             0.994549       0.9823                    35.4114
11          0.0131159   0.0921784             0.996115       0.9807                    38.2368
12          0.0102195   0.0954736             0.997099       0.9812                    41.0551
13          0.0142131   0.112369              0.995582       0.9784                    43.8236
14          0.0128743   0.108042              0.996665       0.9816                    46.6102
15          0.00885911  0.0942717             0.997232       0.9827                    49.4152
16          0.0105739   0.109479              0.996965       0.982                     52.2094
17          0.0124391   0.0934018             0.996299       0.9845                    55.0255
18          0.00904854  0.083856              0.997532       0.985                     57.8454
19          0.00706091  0.126763              0.997849       0.9786                    60.6811
20          0.0109141   0.0873466             0.996699       0.9843                    63.4866
```