WindowによりTensorflowとChainerの環境構築with CUDA(GPUあり)

今回はWindowにより深層学習の環境構築を紹介しようと思います。
TensorflowとChainerに悩む人多いと思うが、今回両方の入れ方を紹介します。

私は環境構築のためにソフト何回も再インストールしたりして、相当時間かかってしまいましたが、これでみんなが楽になるといいね～
#事前準備
###python 3.5.2
https://www.python.org/downloads/release/python-352/
###pip
https://bootstrap.pypa.io/get-pip.py
ここからpipをダウンロードし、またアドミンターミナルを開いて、さっきダウンロードした`get-pip.py`を探しやすいところに置いて、そのパスに入って

```
python get-pip.py
```
でpipをインストールしましょう

####numpy
```
pip install numpy
```
####matplotlib
```
pip install matplotlib
```
###NvidiaのGPU一枚
ここのリストに書いてあるものしかCUDAに対応できない

|    CUDA-capable GPU    |
:------------------:|
|        CUDA-Enabled Tesla Products        |
|       CUDA-Enabled Quadro Products       |
|       CUDA-Enabled NVS Products        |
|         CUDA-Enabled GeForce Products         |
|       CUDA-Enabled TEGRA/Jeston Products       |

詳細はこちらにご覧ください
https://developer.nvidia.com/cuda-gpus
#Visual Studioをインストール
マイクロソフトが開発したIDE、多数のプラットフォームに使えることで便利。
今回使うのは**Visual Studio 2015**
**<font color="red">注意：CUDA 8.0はVisual Studio2017にサポートされてない</font>**

まずhttps://www.visualstudio.com/ja/downloads/
ここから
![image](https://qiita-image-store.s3.amazonaws.com/0/169507/c96e68cf-b114-30b3-d9d4-d9a8e643430f.png)
ウェブインストーラーをダウンロードしましょう。
ダウンロードしたインストーラーを開きましょう
わたしは英語版を入れたので、日本語の表示は分からないが、確かに「自動インストール」と「手動インストール」、選択肢二つがあって、ここで**「手動インストール」（下の方）**を選択してください。
これで
![image](https://qiita-image-store.s3.amazonaws.com/0/169507/86c2bb24-cd28-1742-fdc6-2f854906fa88.png)

このような画面に入る。ここで、必ず**Visual C++をチェック入れてください**
私はVSのIDEが使いやすそうで、Pythonのツールも入れた。
インストールが終わるまで待つ

#CUDA+cuDNNをインストール
###CUDA
まずhttps://developer.nvidia.com/cuda-downloads
ここからCUDAをダウンロードしましょう。
CUDAのインストールは特に注意事項ないが、自動インストールを選択していい。
ただし、さっきVisual Studio 2017をインストールしてしまった人はここで「Visual Studioが検出できません」を出てくるので、**無視しないように、Visual Studio 2015を入れなおしましょう**。そうしないと、悪夢に入ってしまう。T_T

インストールは結構時間かかるので待ちましょう......

最後は必ずNsight Studioの状態を大変そうに報告してくると思うが、そこも無視してよい。
全部終わったら、ターミナルで

```
nvcc
```
を入力し、コマンドノットファウンドが出てきてない限りインストールが成功した。
###cuDNN
https://developer.nvidia.com/cudnn
ここは登録が必要となっていて、登録して、ログインしたら、
![image](https://qiita-image-store.s3.amazonaws.com/0/169507/e89e9c42-0a9f-2a81-d37f-4a3b9c7d5dcf.png)
このような画面が出てくる。`I Agree`にチェックを入れたら、選択肢がでてくる。
赤い枠をクリックすると、さらにリストがでてきて、その中の**cuDNN v5.1 Library for Windows 7**をダウンロードしましょう。
**Windows 10を使っている方はWindows 10の方を**
**TensorflowはcuDNN 6.0をサポートしないです。**
ジップファイルをダウンロードしたら、`cuda->(bin,include,lib)`の構造になっていて、`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\8.0`に相応のフォルダーがあるので、それぞれを相応のパスにコピーすること。

これが終わったら、環境変数の`PATH`という変数に`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin`が入っているかを確認する。

#Chainer+CuPyをインストール
順番は必ずCuPy -> Chainer
さっきpipをインストールしたので、ここで
###CuPy

```
pip install cupy
```
ここまでのインストールを油断した方は、ここでバグ出てくると思うが、一つは

```
error: Unable to find vcvarsall.bat
```
これはVisual StudioにC++を入れていないせいだ。
あと

```
error: command 'cl.exe' failed: No such file or directory
```
これは環境変数の`PATH`にVisual studioのパスが入っていないせいだ。
###Chainer

```
pip install chainer
```
でインストールする。

これでChainerのインストールが完了したが、ターミナルで

```
python -c "import chainer; print(chainer.cuda.available)"
```
を入力し、**True**を返されてきたら、chainerはうまくGPUとつないでいること。

#Tensorflow
二つの方法もあるが、ここでpipでインストールする方法を紹介します。

```
pip install --upgrade tensorflow-gpu
```
あるいは

```
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl
```

これでインストールしたら、このコードで正しくインストールしたかどうかを確かめよう
https://gist.github.com/mrry/ee5dbcfdd045fa48a27d56664411d41c

英語苦手な人もいると思いますが、ここで日本語に訳して貼ります。

```tf_selfcheck_jp.py
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""A script for testing that TensorFlow is installed correctly on Windows.
The script will attempt to verify your TensorFlow installation, and print
suggestions for how to fix your installation.
"""

import ctypes
import imp
import sys

def main():
  try:
    import tensorflow as tf
    print("TensorFlowインストールされています")
    if tf.test.is_built_with_cuda():
      print("このバージョンはGPUサポートを含めています\n")
      message = input("'gpu'を入力してGPUの状況を確認します。\n他の入力でチェックが終了いたします。\n\ninput:")
      if message == "gpu":
        from tensorflow.python.client import device_lib
        print(device_lib.list_local_devices())
    else:
      print("このバージョンはGPUサポートを含めていません")
    sys.exit(0)
  except ImportError:
    print("ERROR: Failed to import the TensorFlow module.")

  candidate_explanation = False

  python_version = sys.version_info.major, sys.version_info.minor
  print("\n- Python version is %d.%d." % python_version)
  if python_version != (3, 5):
    candidate_explanation = True
    print("TensorFlow for Windowsを使うのは "
          "Python version 3.5.が必要となります")
  
  try:
    _, pathname, _ = imp.find_module("tensorflow")
    print("\n- TensorFlow is installed at: %s" % pathname)
  except ImportError:
    candidate_explanation = False
    print("""
- Tensorflowというモジュールがない。`pip install tensorflow`.でダウンロードしましょう""")

  try:
    msvcp140 = ctypes.WinDLL("msvcp140.dll")
  except OSError:
    candidate_explanation = True
    print("""
- 'msvcp140.dll'をロードできませんでした。 このDLLを入れるためには、Microsoft Visual
  C++ 2015 Redistributable Update 3 をインストールすることが必要だ。
  URL:https://www.microsoft.com/en-us/download/details.aspx?id=53587""")

  try:
    cudart64_80 = ctypes.WinDLL("cudart64_80.dll")
  except OSError:
    candidate_explanation = True
    print("""
- 'cudart64_80.dll'をロードできませんでした。 このDLLを入れるためには、CUDA 8.0 をインストー
  ルすることが必要だ。
  URL: https://developer.nvidia.com/cuda-toolkit""")


  try:
    nvcuda = ctypes.WinDLL("nvcuda.dll")
  except OSError:
    candidate_explanation = True
    print("""
- 'nvcuda.dll'をロードできませんでした。 このDLLは基本'C:\Windows\System32'にあるはずが
  もしなければ、あなたのGPUはCUDA使えるか、ドライバーが正しく入っているかを、もう一度確かめてください。""")
    
  try:
    cudnn = ctypes.WinDLL("cudnn64_5.dll")
  except OSError:
    candidate_explanation = True
    print("""
- 'cudnn64_5.dll'をロードできませんでした。  このDLLを入れるためには、cuDNN 5.1 をインストー
  ルすることが必要だ。cuDNNはデフォルトでCUDAと一緒にインストールされるものではないのです。
  もしすでにcuDNN 6.0を入れた場合、'cudnn64_6.dll'を削除して、他のファイルとも、貼りなおしましょう
  URL:https://developer.nvidia.com/cudnn""")

  if not candidate_explanation:
    print("""
- Tensorflowに必要となるDLLは揃えています。
  TensorFlow GitHub page: https://github.com/tensorflow/tensorflow/issues""")

  sys.exit(-1)

if __name__ == "__main__":
  main()
```

日本語版はインストールが成功したら最後に問われるところを追加したと思いますが、そこで`gpu`を入力し、
また、英語版を実行した方は、ターミナルで

```
python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
```

を実行して、最後に

```
name: GeForce GTX 980M
major: 5 minor: 2 memoryClockRate (GHz) 1.1265
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 3.83GiB
2017-07-07 17:18:53.446905: I c:\tf_jenkins\home\workspace\release-win\m\windows
-gpu\py\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:961] DMA: 0
2017-07-07 17:18:53.448085: I c:\tf_jenkins\home\workspace\release-win\m\windows
-gpu\py\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:971] 0:   Y
2017-07-07 17:18:53.449183: I c:\tf_jenkins\home\workspace\release-win\m\windows
-gpu\py\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1030] Creating Tenso
rFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 980M, pci bus id: 0000:01
:00.0)
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 5743970950694766450
, name: "/gpu:0"
device_type: "GPU"
memory_limit: 3798282240
locality {
  bus_id: 1
}
incarnation: 5780768353725891859
physical_device_desc: "device: 0, name: GeForce GTX 980M, pci bus id: 0000:01:00
.0"
]
```
一番下のところでこのような結果が出てきたら、Tensorflowのインストールはこれで完了しました。

#参考リンク
####総合
[Linuxを中心とした環境構築（これは見れないと思いますが）](
https://www.idr.ias.sci.waseda.ac.jp/wiki/index.php/Linux%E3%82%92%E4%B8%AD%E5%BF%83%E3%81%A8%E3%81%97%E3%81%9F%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
[Windows10にcuDNN+chainerをインストール](http://qiita.com/mana-murakami/items/c5075b98c5a83517529e)
[Windows上にChainer v1.5+CUDA+cuDNNを一番簡単に入れれる方法](http://qiita.com/okuta/items/f985b9da6de33a016a75#cuda%E3%81%AE%E7%A2%BA%E8%AA%8D)
####Visual Studio
[vcvarsall.bat needed for python to compile missing from visual studio 2015 ( v 14)](https://stackoverflow.com/questions/33323172/vcvarsall-bat-needed-for-python-to-compile-missing-from-visual-studio-2015-v-1)
[Visual studio doesn't have cl.exe [closed]](https://stackoverflow.com/questions/31953769/visual-studio-doesnt-have-cl-exe)
[Would cuDNN v6.0 work with TensorFlow currently?](https://stackoverflow.com/questions/43171406/would-cudnn-v6-0-work-with-tensorflow-currently)
####CUDA
[CUDA Installation Guide for Microsoft Windows](http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#verify-you-have-cuda-enabled-system)
[how to setup cuDnn with theano on Windows 7 64 bit](https://stackoverflow.com/questions/36248056/how-to-setup-cudnn-with-theano-on-windows-7-64-bit)
####Chainer
[python pip on Windows - command 'cl.exe' failed](https://stackoverflow.com/questions/41724445/python-pip-on-windows-command-cl-exe-failed)

####Tensorflow
[Installing TensorFlow on Windows](https://www.tensorflow.org/install/install_windows)
[Error importing tensorflow on windows 10 ( Tensorflow 0.12.0 RC0, python3.5 ) ](https://github.com/tensorflow/tensorflow/issues/5949)