Windows版Anacondaを使わずにChainerをGPUで動かしてみた

今回はchainerをGPUで動かせるようにセットアップをしてみました。調べてみると情報量はありますが、windowsの場合はChainerをAnacondaで環境構築している事が多いようです。普通のpythonから環境構築しようとすると自分で環境変数を追加することが多くなったりして、手間がかかるからだと思います。ただ、僕の場合はすでにpythonの環境構築をしていて、またAnacondaで新たに環境を構築するのはそれはそれで手間がかかるので、すでにWindowsにPythonの環境を構築した人向けに記録を書こうと思います。

*※2018年3月2日：追記箇所がいくつかあるので、ご注意ください。*

##環境
使用マシンはSurface Bookで、以下はそのスペックです。
OS: Windows 10 Pro 64ビット
CPU: Intel Core i7-6600U
メモリ: 8GB
GPU: NVIDIA GeForce GTX 965M

##事前準備

- [python3.6](https://www.python.org/downloads/)をインストール
- 以下の変数をシステム環境変数の```Path```に追加(Cドライブ直下にPython36フォルダがある場合)

```
C:\Python36
```
```
C:\Python36\Scripts\
```
- pipコマンドを使えるようにする(Python3.6をインストールした場合はすでに入ってるので大丈夫です)
- エディタはコマンドプロンプトでもPowerShellでもいいです

##構築手順
###仮想環境を作成
普通のPythonからこの先のセットアップをすると、バージョンアップをした時に環境構築の変更が面倒なので、任意の場所に仮想環境を作成しましょう

```
> python -m venv /path/to/ml_venv
```
すでにnumpyやmatplotlibなどを仮想環境ではない環境でインストールしている場合はこのコマンドの続きに```--system-site-package```を追加すると仮想環境でもそのまま使えます。完成したら、以下のコマンドで実行します

```
> ml_venv\Scripts\activate
```

###Microsoft Build Tools 2015 をダウンロード
CupyやCUDAをセットアップするときにC++のコンパイラが必要になるため、[以前のVisual Studioソフトウェアのダウンロード](https://www.visualstudio.com/ja/vs/older-downloads/)から、**Visual Studio Community 2015**をインストールします。インストールが終わったら以下をシステム環境変数```Path```に追加します。

```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
```

###環境変数を設定
環境変数```INCLUDE```として以下を追加します(やり方は先程PythonのPathを設定するときとほぼ同じやり方ですが、変数名に```INCLUDE```がない場合は新規ボタンから新たに追加します)

```
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
```

##CUDA Toolkit
[CUDA Toolkit Download](https://developer.nvidia.com/cuda-toolkit)からマシンのスペックに合わせて選択します。Install Typeに関してはexe(local)はダウンロードに時間がかかるのでnetworkを選択した方がいいです。

##GPUドライバ
[ドライバダウンロード](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)からマシンのスペックに合わせてダウンロードします。

##cuDNNをインストール
[NVIDIA cuDNN](https://developer.nvidia.com/cudnn)にアクセスし、インストールしたCUDAのバージョン、OSに合わせてダウンロードします。ダウンロードしたら展開し、ファイルをCUDAの該当パスにコピーするか、展開したフォルダのパスを通します。


###再起動
ここまでできたら念のため再起動をします。

##pipで必要なライブラリをインストール

###pycuda(なくても良さそうです)
もしnumpyをインストールしてない場合はここでインストールします

```
> pip install numpy
```
インストールできたら、pycudaをインストールします

```
> pip install pycuda
```
###cupy

```
> pip install cupy
```
※2018年3月2日追記
キャッシュを無効にして再インストールしました。

```
> pip install cupy --no-cache-dir -vvvv
```

もし、このときにエラーメッセージで```UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83```のようなエラーが出たら、　[Win + Python3.6で「pip install」を実行したときに「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83」と表示される。](https://qiita.com/regeeeepg/items/be6a58276bdbd67dc096)を参考にして\__init__.pyを修正してみましょう。それ以外のエラーが出る場合はコンパイラのPathが正しく通ってないか、コンパイラ自体に問題があるかもしれません。特に```Path```や```INCLUDE```の値に関してはマシンによって変わる可能性がございますのでご確認を。
###chainer

```
> pip install chainer 
```

※2018年3月2日追記
こちらもキャッシュを無効にして再インストールしました。

```
> pip install chainer --no-cache-dir -vvvv
```

終わったら、正しくインストールできてるか確認するために、以下のコマンドを入力します。

```
> python -c "import chainer; print(chainer.cuda.available)"
```
これでもし```True```が返ってきたら、ChainerはGPU
をつなげています。

##動作チェック
ここまでできたら、実際にプログラムを動かしてみます。今回はchainerのMNISTサンプルで動作チェックを行います。 https://github.com/chainer/chainer/archive/v3.2.0.tar.gz からダウンロードし適当な場所で解凍します(tarファイルなので解凍ソフトが必要です)

終わったら、サンプルを実行します。まずはGPUを使わずに(CPUのみで)実行してみます

```
> 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.190951    0.0908168             0.94225        0.9718                    41.0858
2           0.0741212   0.0857352             0.976767       0.9738                    88.1086
3           0.0494363   0.0736024             0.984283       0.9775                    132.785
4           0.0349904   0.076048              0.9891         0.9787                    176.63
5           0.0298322   0.0777685             0.990417       0.9789                    224.378
6           0.024639    0.0727158             0.99205        0.9801                    267.11
7           0.0199962   0.0723381             0.993633       0.9812                    308.429
8           0.014239    0.0818458             0.995267       0.9815                    353.45
9           0.0195226   0.0805969             0.993233       0.9794                    400.009
10          0.012115    0.0975619             0.996133       0.9793                    442.733
11          0.0171161   0.0974695             0.9945         0.9794                    485.669
12          0.0133646   0.088806              0.9959         0.98                      529.05
13          0.00832344  0.101258              0.997633       0.9789                    574.713
14          0.0144544   0.107601              0.995717       0.9792                    619.056
15          0.014508    0.0879238             0.9957         0.9831                    664.027
16          0.00860224  0.0829529             0.997617       0.9836                    709.962
17          0.00989336  0.0946949             0.996967       0.9824                    756.367
18          0.00828606  0.0899459             0.997433       0.983                     803.215
19          0.00645237  0.112903              0.99785        0.9831                    850.539
20          0.0123574   0.116718              0.99655        0.982                     902.438
```
今度は同じプログラムをGPUを使って実行します。先程のコマンドに```-g 0```をつけるとGPUが使えます

```
> python chainer-3.2.0/examples/mnist/train_mnist.py -g 0
```
結果はこちら

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

C:\Users\***\Documents\ml_venv\lib\site-packages\chainer\cuda.py:85: UserWarning: cuDNN is not enabled.
Please reinstall CuPy after you install cudnn
(see https://docs-cupy.chainer.org/en/stable/install.html#install-cupy-with-cudnn-and-nccl).
  'cuDNN is not enabled.\n'
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.190668    0.0854138             0.943184       0.9724                    5.65133
2           0.0761028   0.0777232             0.976632       0.9763                    11.2321
3           0.0496006   0.073066              0.984615       0.9772                    16.8865
4           0.0362269   0.0802193             0.988349       0.9784                    22.4185
5           0.0299697   0.0765652             0.990099       0.9802                    27.9922
6           0.0246631   0.070867              0.991932       0.9824                    33.5942
7           0.0206386   0.076023              0.993365       0.9823                    38.9228
8           0.0164893   0.0791374             0.994816       0.9809                    44.2431
9           0.015917    0.0781484             0.994815       0.982                     49.467
10          0.0172795   0.0973235             0.994432       0.9811                    54.7838
11          0.0126648   0.0965343             0.996115       0.9786                    60.0568
12          0.0118577   0.105981              0.996283       0.9784                    65.4209
13          0.0134358   0.0903537             0.995999       0.9822                    70.6901
14          0.0139644   0.100845              0.995665       0.9795                    75.9644
15          0.00960354  0.121914              0.996966       0.9787                    81.3283
16          0.012138    0.114238              0.996432       0.9789                    86.6215
17          0.0082195   0.0909245             0.997683       0.984                     91.9384
18          0.00706095  0.106649              0.998166       0.9824                    97.3137
19          0.0121552   0.118355              0.996316       0.9791                    102.588
20          0.00839044  0.108653              0.997416       0.9838                    107.956
```

~~※実行したときにエラーが出ていますが、結果は問題なく出力されているので修正はまた今度します。~~

※再インストールを行い、エラーは修正されました。（追記箇所参照）

それぞれの右端にある数字がトータルの時間ですが、GPUを使用したことで速さが8倍近くになりました。

##おまけ
TensorflowをGPU付きで実行できるように設定しようと思いましたが、

``` Download and install CUDA 8.0 from this URL:https://developer.nvidia.com/cuda-toolkit```
といったエラーが出たため、TensorflowはCUDAのバージョンが8.0じゃないと動作しないようです。もしTensorflowもGPUで試したい場合は8.0で改めて環境構築するといいようです。

##参照
[Download Python](https://www.python.org/downloads/)

[環境変数Pathの設定](https://www.pythonweb.jp/install/setup/index1.html)

[28.3. venv — 仮想環境の作成](https://docs.python.jp/3/library/venv.html)

[Windows10にCUDA8.0とPyCUDAをインストールしてテストが動くまで](https://qiita.com/ryo-yamaoka/items/5e09c2f2f0a24fce3282)

[Windows10にCUDA9.0とPyCUDAをインストールしてテストが動きcupyインストールに苦労してChainerのMNISTチュートリアルでGPU使用で速度が約6倍となるのを確かめるまで](https://qiita.com/aokikenichi/items/dd6cb0d611784581c001) 

[WindowsにChainer v3+CUDA9+cuDNN7をインストールする](http://tadaoyamaoka.hatenablog.com/entry/2017/10/28/230738)