【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～Chainer環境構築

本書はいわゆる将棋AIをPythonで実現する手法の解説本でありながら、ディープラーニングが学べるというものである。
<img width="200" style="float: left;" alt="将棋AIで学ぶディープラーニング" src="https://qiita-image-store.s3.amazonaws.com/0/233744/ded117b9-37c7-1b41-033d-960e63ca5fe1.jpeg">
※この画像サイズ指定のマークダウン記法は以下参考
[Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
alignment効いてないけど、。。
[Markdown and image alignment](https://stackoverflow.com/questions/255170/markdown-and-image-alignment)

しかし、なんといっても最初の一歩であるChainer環境構築が結構大変。ということで今日はここをまとめておこうと思う。
結局、ほぼほぼ以下の参考のとおりです。
【参考】
・[WindowsでChainer（Cuda＋Cupy）をインストールしようとしたらハマったのでメモ](https://qiita.com/shichiria/items/99a2f2b8cde3b552813f)
###やったこと（やるべきこと）
（１）Pythonのインストール
（２）Visual Studio 2015 Community Editionをインストール
（３）Cudaのインストール
（４）cudnnのインストール
（５）rc.exeとrcdll.dllをコピー
（６）fastrlockのインストール
（７）Cupyのインストール
（８）Chainerのインストールと確認
###（１）Pythonのインストール
本書では、python3.5系をAnaconda３－４．２．０系でインストールするのを推奨しているのでその通りやってみる。
[https://repo.continuum.io/archive/](https://repo.continuum.io/archive/)
から 
Anaconda3-4.2.0-Windows-x86_64.exe 391.4M20 16-09-27 15:57:21
をダウンロードしてインストールしました。
※この本が出たのは昨年なので参考によればchainerがpython3.6系対応してるんですね
[https://www.anaconda.com/download/](https://www.anaconda.com/download/)
###（２）Visual Studio 2015 Community Editionをインストール
ここがたぶん最大の難関です。
つまり正規サイトはVSの過去版が昨夜は404が出て削除されていましたが、今日は掲載されています。
[https://visualstudio.microsoft.com/ja/vs/older-downloads/](https://visualstudio.microsoft.com/ja/vs/older-downloads/)
ということで参考が示している以下サイトから入手しました。
[https://download.cnet.com/Visual-Studio-Community-2015/3000-2212_4-76440611.html](https://download.cnet.com/Visual-Studio-Community-2015/3000-2212_4-76440611.html)
インストールは本書のとおりの設定つまり
カスタムーVisual C++とPython Tools for Visual Studioをチェック
でインストールします。
※結構時間かかります
###（３）Cudaのインストール
ここは本書の通りでうまくいけると思います。
つまり、
[CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive)
から
CUDA Toolkit 9.0 (Sept 2017)
をクリックして条件入力してexe(local)をダウンロードしてインストールします。
※上記参考では、Chainer3.6系に対してCUDA Toolkit 9.1 (Dec 2017)を使っています
<img width="400" style="float: left;" alt="cuda.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/233744/7c36a81e-6213-f468-920e-cf552f3b954f.jpeg">
###（４）cudnnのインストール
cudnnのインストールではNvidiaでユーザ登録する必要があります。
[https://developer.nvidia.com/cudnn](https://developer.nvidia.com/cudnn)
リンクをたどっていき
Download cuDNN v7.2.1 (August 7, 2018), for CUDA 9.0 
を選び、
cuDNN v7.2.1 Library for Windows 10
をダウンロードして解凍します。
そして解凍先からbin, include, libを先ほどインストールしたcudaに上書きします。
※上書きというのではまりました
これ単に

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
```
にドラッグ＆ドロップします。怒られても続行します。
###（５）rc.exeとrcdll.dllをコピー

```
C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64
```
からrc.exeとrcdll.dllをコピー。

```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64
```
へペースト。
※windows10のversionは異なるようです
###（６）fastrlockのインストール
これ本書には記載ないですが、参考のとおりやらないと先に進めませんでした。
[https://pypi.org/project/fastrlock/#files](https://pypi.org/project/fastrlock/#files)
から
fastrlock-0.3.tar.gz (42.7 kB)
をダウンロードして

```
python setup.py install
```
を実行でfastrlockをインストールします。
###（７）Cupyのインストール
Chainerでcudaやcudnnを利用するには、このCupyをインストールできるかが鍵である。
まずはpipを最新版にします。

```
python -m pip install -U pip
```

ここまでくれば、単に

```
pip install cupy
```
でインストールできると思います。
ちなみに以下の種々のインストールは参考になると思います。
[Installation Guide@Cupy](https://docs-cupy.chainer.org/en/latest/install.html)

###（８）Chainerのインストールと確認

普通に

```
pip install chainer
```
でインストールできると思います。
ここで、インストール確認

```
>python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cupy
>>> import chainer
>>>
```
最後に、以下cupyとchainerを一度uninstallしてから再度以下のとおり綺麗にインストールしなおします。

```
pip install cupy --no-cache-dir -vvvv
pip install chainer --no-cache-dir -vvvv
```
###まとめ
・Chainer事始めでインストールしてGPUを利用できるようになった
・基本的な構築の流れは今回のやり方でいけると思う

・各種フレームワークの更新が早いので半年前の話がもう古くなっていると感じた
・今後Versionを上げる必要があるかもしれない
###おまけ
以下、CPUとGPUでMNISTの例を実行したものを並べてみると、経過時間から実行速度はだいたい一桁違う。

```
python 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.192806    0.0850449             0.94215        0.9718                    9.75484
2           0.0733078   0.0746161             0.977033       0.978                     12.9071
3           0.048877    0.0774014             0.983866       0.9775                    15.6654
4           0.0326726   0.068165              0.989549       0.9802                    18.4044
5           0.0313268   0.0606614             0.989765       0.9833                    21.0591
6           0.0246596   0.0687122             0.992049       0.9831                    23.7006
7           0.0185879   0.086345              0.993998       0.9791                    26.3792
8           0.0177547   0.0804703             0.994165       0.9812                    29.0443
9           0.0156006   0.0737531             0.995282       0.9821                    31.7208
10          0.0153562   0.099546              0.995032       0.9779                    34.442
11          0.00978246  0.106456              0.996966       0.9783                    37.1574
12          0.0156983   0.091956              0.995099       0.9816                    39.8492
13          0.013879    0.0950948             0.995949       0.9822                    42.5079
14          0.0117834   0.101035              0.996732       0.9799                    45.2011
15          0.0136471   0.0887717             0.995532       0.9827                    47.8526
16          0.00867114  0.100181              0.997465       0.9809                    50.5429
17          0.00791029  0.0882384             0.997866       0.9836                    53.2253
18          0.0115128   0.126878              0.996415       0.9794                    55.9443
19          0.0107526   0.0885034             0.996966       0.9846                    58.5775
20          0.00521568  0.102447              0.998316       0.983                     61.2171

>python 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.189209    0.0875581             0.9427         0.9735                    25.3126
2           0.073236    0.0692626             0.9773         0.978                     52.0837
3           0.0481918   0.106838              0.984567       0.9681                    79.3083
4           0.0348265   0.0659303             0.988783       0.98                      106.283
5           0.028921    0.0650097             0.990017       0.9824                    133.321
6           0.0229345   0.0768484             0.992683       0.9783                    160.562
7           0.0189791   0.0841197             0.99375        0.9797                    188.195
8           0.0180559   0.077855              0.993883       0.9807                    215.909
9           0.0180099   0.0911617             0.994283       0.9762                    243.806
10          0.012737    0.0954341             0.995883       0.9782                    272.119
11          0.0187078   0.0765396             0.994367       0.9836                    300.487
12          0.00986514  0.098215              0.9971         0.9786                    329.268
13          0.00901476  0.0943318             0.997333       0.9815                    358.506
14          0.0150975   0.115421              0.99525        0.9768                    387.79
15          0.0107619   0.089286              0.996567       0.9814                    417.653
16          0.00918265  0.101557              0.997117       0.9823                    447.854
17          0.0102194   0.0930422             0.9968         0.9817                    478.13
18          0.00661841  0.0889919             0.998283       0.9833                    508.768
19          0.0125522   0.110633              0.9965         0.9809                    539.433
20          0.0117108   0.10781               0.99675        0.9817                    570.328
```