Windows 10 + Visual Studio 2017 previewの環境でのpip経由のChainerインストール(with GPU)

タイトルの環境でpipでchainer(でGPUを使うためのcupy)をインストールしようとすると，fatal error C1083とかInclude files not found: ['cudnn.h']とか，Check your CFLAGS environment variableとか，モジュールとビルドターゲットのアーキテクチャが競合しています(リンカ ツール エラー LNK1112)とか，識別子が見つかりませんでしたとか，Cannot Determine the location of the VS common tools folderとか，さまざまなエラーメッセージに見舞われた．
こんな環境を使っていて且つこんなところでハマる人が他にいるのかわからないが解決したのでまとめておく．

# 環境など
- Windows 10 Creators Update (バージョン1703 OSビルド15063.296) x64
- Anaconda3 4.3.1
- Visual Studio Community 2017 Preview version 15.3 (26510.0-Preview) と Previewじゃない方の共存
- CUDA Tool kit 8.0
- cuDNN **5.1** (6はpipに対応していないので)
- GPU: NVIDIA GeForce GTX 960M

# 手順
以下，VSやCUDAなどは入っている前提．
## VSのコンポーネント選択
(選択していなかった場合のみ)Visual Studio Installer で変更をクリックし，

- .Net デスクトップ開発

個別のコンポーネントで

- デスクトップC++ x86およびx64用 Windows 10 SDK
- VC++ 2015.3 v140 ツールセット

を選択しインストール．

## vcvarsall.bat などの編集
### vcvarsall.bat
C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\vcvarsall.bat
の10行目をコメントアウトする．

```
REM if not exist "%~dp0..\common7\IDE\wdexpress.exe" goto setup_buildsku
```
元のファイルをvcvarsall.bat.oldなどとリネームしておいてから編集し，vcvarsall.batとして別名で保存するとよいだろう．
### vcvars64.bat
vcvarsall.batと同様にして
C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\bin\amd64\vcvars64.bat
の
11-14行目をコメントアウト

```
::@call :GetVSCommonToolsDir
::@if "%VS140COMNTOOLS%"=="" goto error_no_VS140COMNTOOLSDIR

::@call "%VS140COMNTOOLS%VCVarsQueryRegistry.bat" No32bit 64bit %1 %2
```

先頭に以下を追加

```
@SET VSINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\
@SET VCINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\
@SET FrameworkDir64=c:\Windows\Microsoft.NET\Framework64\
@SET FrameworkVersion64=v4.0.30319
@SET Framework40Version=v4.0
```

## **システム**環境変数の設定
以下それぞれないものがあれば追加または作成する．

* Path

>C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\bin
>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp
>C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
>C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64

<br>

* INCLUDE

>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt
>C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\include
>C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared

<br>

* LIB

>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64
>C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64
>C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x64
>C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\lib



## condaで環境を作る
Python 3.6にはまだ諸々対応してないっぽいので3.5の環境を作ってそこでchainerを使うことにする．
コマンドプロンプト(管理者として実行)で

```
conda create -n chainer python=3.5
activate chainer
```

## numpyなどを入れる
http://www.lfd.uci.edu/~gohlke/pythonlibs/
から探して入れると何かと都合がいい気がする．
筆者は numpy‑1.12.1+mkl‑cp35‑cp35m‑win_amd64.whl をダウンロードして
`pip install "numpy‑1.12.1+mkl‑cp35‑cp35m‑win_amd64.whl"`
とした．
matplotlibやscipyもこのサイトにあるものを入れておくとよいだろう．

## chainerのインストール
まずCuPyからインストールした．

```
pip install cupy
pip install chainer
```

そして https://github.com/pfnet/chainer をクローンして examples\mnist\train_mnist.py で試してみる．
`python train_mnist.py -g 0`
すると動いた...！
筆者の環境だとCPUのみのときと比べて6倍ぐらい速くなった(そんだけかよ)．

# 最後に
よくわからないでいじってたし記憶も曖昧で，上記で過不足ないか・安全かどうかはわからないのでコメント下さい．

<br><br><br><br><br><br><br><br><br>
# 参考
http://hurikake.hatenadiary.jp/entry/2016/09/26/232246
https://devtalk.nvidia.com/default/topic/969047/cuda-8-vs2015-corecrt-h-error/
https://developercommunity.visualstudio.com/content/problem/22031/unusable-vc-build-tools-2015-installed-with-vs2017.html
https://stackoverflow.com/questions/3461275/vs2010-command-prompt-gives-error-cannot-determine-the-location-of-the-vs-comm