機械学習用の環境を0から構築した(windows10 + Anaconda + VSCode + Tensorflow + GPU版)


少し間が開いてOSも再インストールしていたので、再度環境構築しました。
その時の備忘録です。

追記
- 2019年: ここ
- [2022年: Windows11 + TF2.10(tensorflow-gpu) + GPU の環境](https://qiita.com/pocokhc/items/ed2d25c5f6b63a9d11a4)
- [2023年: Windows11 + TF2.12 + WSL2 + GPU の環境](https://qiita.com/pocokhc/items/0a759130941090b1d231)
- [2025年: Windows11 + GPU + TensorFlowとPyTorch の環境](https://qiita.com/pocokhc/items/f796b4b3fa54510c8d3a)


# 概要
+ ほぼ0から機械学習(強化学習)の環境を構築した(GPU対応)
+ 環境
    + windows10
    + NVIDIA GeForce GTX 1060
+ 構築環境
    + Anaconda
    + VSCode
    + Tensorflow GPU対応の設定
    + AnacondaとVSCodeの連携
    + ChainerRL


# Tensorflow GPU版 を使うための準備
※ CPU版を使う場合は不要です。

項目は以下です。

+ 対応したグラボの購入およびドライバの更新
+ CUDA(v10.0)のインストール
+ CuDNN(v7.6.5 for CUDA 10.0)のダウンロード(無料の会員登録が必要)

バージョンが結構重要です。
対応していないバージョンを使うと別途設定が必要だったり動かなかったりします。

・参考

+ [windows10にTensorFlow GPUを入れる](https://qiita.com/milkchocolate/items/cdedd61a64862a65b84a)
+ [TensorFlow-GPUのインストールで詰まったときのメモ](https://nigimitama.hatenablog.jp/entry/2018/12/24/022756)
+ [Windows10にTensorFlow GPUとKerasをインストールする](https://kazusa-pg.com/install-tensorflow-gpu-keras/)
+ [TensorFlow 2.0 Alpha0（GPU版）の環境をWindowsで作る方法](https://dev.infohub.cc/tensorflow2-alpha-gpu/)


## グラボの Compute Capability の確認とドライバの更新

Tensorflow は Compute Capability が 3.5 以上のものが対応しているそうです。
対応表は[ここ](https://developer.nvidia.com/cuda-gpus#compute)にあります。
このPCのグラボは `NVIDIA GeForce GTX 1060` なので 6.1 ですね。

確認出来たらドライバも最新にしておきます。
ドライバのページ：https://www.nvidia.co.jp/Download/index.aspx?lang=jp



## CUDA v10.0 のインストール

CUDA v10.0 のダウンロードページ：https://developer.nvidia.com/cuda-10.0-download-archive
インストーラーの選択では「高速（推奨）」を選択してデフォルトでインストールしています。

ちなみに執筆時(2019/11)では v10.2 が最新です。
ただ v10.2 を入れると、Tensorflow が v10.0 のパスを参照しているようで後に以下のようなエラーがでます。

``` bash
> python -c "import tensorflow as tf; print(tf.__version__)"
2019-11-28 19:22:20.012829: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_100.dll'; dlerror: cudart64_100.dll not found
2.0.0
```

一応回避方法はあるらしいですが…、とりあえず動作優先で試していません。
回避方法：[CUDA 10.1で利用したい場合の追加手順](https://dev.infohub.cc/tensorflow2-alpha-gpu/#CUDA_101)




## CuDNN のインストール

CuDNN のダウンロードページ：https://developer.nvidia.com/rdp/cudnn-download
無料ですが、会員登録が必要です。
ログインしたら CUDA に対応した以下のバージョンをダウンロードします。

```
Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.0
```

CuDNN は zip ファイルなので解凍して CUDA フォルダに突っ込みます。
デフォルトだと CUDA フォルダは以下です。

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\
```



# Anaconda のインストール
CPU と GPU で環境を分けたかったので Anaconda を入れています。
DLページ：https://www.anaconda.com/distribution/

インストールした Anaconda は以下です。(バージョンは気にしなくてもよさげ)

```
Anaconda 2019.10 for Windows Installer
Python 3.7 version
```

インストールする時に環境変数も追加しておきます。(デフォルトだとチェックが外れています)
`Advanced Options` の `Add Anaconda to my PATH environment variable` にチェックをいれます。

環境変数を追加しているのでインストール後に再起動したほうがいいかも。


## 実行環境の作成(python3.7)
Anaconda Navigater を起動します。

```
プログラム一覧 → Anaconda3 (64-bit) → Anaconda Navigater (Anaconda3)
```

起動したら左のメニューから Environments を選択し、Create を押します。
ここで実際に動作させる時の環境を構築します。

- 設定値
    - Name: 自由に (ここでは py37-gpu としています)
    - Package は python 3.7 を選びます。  
(半年ほど前は Tensorflow が 3.7 で動かなかったのですが対応したようですね)

Create を押すと環境ができます。

環境ができたらクリック(py37-gpu)し、その後 ▶ をクリック → `Open Terminal` を選びます。
すると、Terminal が起動します。

今後 pip 等でパッケージを追加する場合はこの手順で実施します。
(もっと簡単なやり方がありそうですが…)

## Tensorflow のインストール

・CPUを使う場合

``` bash
> pip install tensorflow
```

・GPUを使う場合

``` bash
> pip install tensorflow-gpu
```

## 確認
### Tensorflow の確認
Terminal で以下コマンドをうちます。(ワンライナー)

``` bash
> python -c "import tensorflow as tf; print(tf.__version__)"
```

・CPU版表示結果

``` bash
>python -c "import tensorflow as tf; print(tf.__version__)"
2.0.0
```

・GPU版表示結果（dllがSuccessfullyになっていること）

``` bash
> python -c "import tensorflow as tf; print(tf.__version__)"
2019-11-28 19:59:12.696817: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2.0.0
```

### GPUデバイスの確認(GPU版のみ)

Terminal で以下コマンドをうちます。

``` python
> python
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
```

実行結果です。

``` bash
(py37-gpu) C:\Users\poco> python
Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> from tensorflow.python.client import device_lib
2019-11-28 21:33:00.714942: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
>>>
>>>
>>> device_lib.list_local_devices()
2019-11-28 21:33:05.777537: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-11-28 21:33:05.790386: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2019-11-28 21:33:05.813090: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: GeForce GTX 1060 3GB major: 6 minor: 1 memoryClockRate(GHz): 1.7085
pciBusID: 0000:01:00.0
2019-11-28 21:33:05.818802: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-11-28 21:33:05.823869: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2019-11-28 21:33:06.275014: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-11-28 21:33:06.279606: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0
2019-11-28 21:33:06.282091: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N
2019-11-28 21:33:06.285366: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/device:GPU:0 with 2108 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:01:00.0, compute capability: 6.1)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 15688037898080382701
, name: "/device:GPU:0"
device_type: "GPU"          # GPUが表示されていればおｋ
memory_limit: 2210712780
locality {
  bus_id: 1
  links {
  }
}
incarnation: 506641733629436041
physical_device_desc: "device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:01:00.0, compute capability: 6.1"
]
```



# VSCode のインストールと設定

IDE として VSCode を使っています。
DLページ：https://code.visualstudio.com/


## Extentions

VSCode を起動したら左メニューの Extensions から各名前を検索することで追加できます。

|名前|備考|
|---|---|
|Japanese Language Pack for Visual Studio Code|日本語しか分からないので|
|Python|Python用|

これ以外のは好みでどうぞ。


## Anaconda と VSCode の連携

やり方はいろいろあるので一例です。

### 1. フォルダ作成

作業用のフォルダを作成します。
VSCode で「ファイル → フォルダーを開く」で作業用フォルダを指定します。

### 2. テストファイルを作成

次に作業用フォルダの配下に適当な python ファイルを作成します。
テストファイルとして hello world を記載しておきます。

``` python:hello.py
import tensorflow as tf
msg = tf.constant('TensorFlow 2.0 Hello World')
tf.print(msg)
```

そしたらこのファイルを VSCode で開きます。


### 3. 設定ファイルの記載

「メニュー → デバッグ → 構成の追加 → Python File」を実行します。
すると `launch.json` が開きますのでこれを編集します。

が、編集する前に python のパスを確認する必要があるので Anaconda で確認します。
Anaconda の Terminal を開いて `conda info -e` コマンドを実行します。

``` bash
(py37-gpu) C:\Users\poco> conda info -e
# conda environments:
#
base                     C:\Users\poco\Anaconda3
py37-cpu                 C:\Users\poco\Anaconda3\envs\py37-cpu
py37-gpu              *  C:\Users\poco\Anaconda3\envs\py37-gpu
```

ここで指定したパスの環境で python を実行するようにしたいので、
確認した後、`launch.json` に以下のように `"pythonPath"` を追加します。

``` json:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",

            // ↓ python.exe を追加して追加
            "pythonPath": "C:\\Users\\poco\\Anaconda3\\envs\\py37-gpu\\python.exe"
        }
    ]
}
```

追加出来たら保存して、F5 または「デバッグ→デバッグの開始」を押し、hello world が実行できるか確認します。



# ChainerRL

今回は Keras-RL ではなく、ChainerRL を使ってみます。
強化学習のライブラリがこっちのほうが充実していそうだったので。

## pip インストール

Anaconda の Terminal から必要なパッケージを落としていきます。
以前([【強化学習】OpenAI Gym×Keras-rlで強化学習アルゴリズムを実装していくぞ（準備編）](https://qiita.com/pocokhc/items/a8120b0abd5941dd7a9f))に書いたパッケージなどです。

``` bash
# ChainerRL
> pip install chainerrl
> pip install cupy-cuda100  // GPU用、100はバージョンなのでCUDEのバージョンに合わせてください。

# gym
> pip install gym
> pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py

# 画像系
> pip install matplotlib
> pip install pillow
> pip install opencv-python

# 統計
> pip install pandas
```


# あとがき
とりあえず環境構築が終わりました。
次回は ChainerRL のチュートリアルをやりたいと思います。