【Python】Anaconda＋TensorFlow 2.3.0 (GPU) の環境構築

# はじめに
　最近、Pythonでディープラーニングの勉強ができる環境を構築したので、備忘録としてまとめます。PC環境は以下の通りです。

　・OS: Windows 10 Pro
　・CPU: intel Core i9-9900K
　・GPU: Geforce RTX2070
　・メモリ: 32GB

特に、TensorFlowでGPUが認識されずに苦労しました。Anacondaのバージョンは4.9.2、Pythonのバージョンは3.8.5です。Anacondaにこだわる理由は、MATLABユーザの私にとって、Pythonエディタの「Spyder」が使いやすいからです。Spyderをpipでインストールして構築するのは初心者の私には無理でした。

# 記事の内容
　Anaconda環境で、TesonrFlowをインストールする。

# TensorFlowとは
　TensorFlowは、Googleが公開している機械学習ライブラリです。2015年に登場したそうです。TesonrFlowはGPUを用いて高速な計算を行うことができます。GPUを使って計算ができるディープラーニングフレームワークは他にもChainerやPyTorchなどがあります。

# 環境構築の際の注意点
　Python + TensorFlow + GPU の環境を構築する際、バージョンの対応を合わせないといけません。対応表は下記のリンクを参考にしてください。

　・https://www.tensorflow.org/install/source?hl=ja#tested_build_configurations

特に、TensorFlowでGPUを認識させたい場合、cuDNNとCUDAのバージョンに注意が必要です。
本記事ではTensorFlow 2.3.0をインストールします。そのため、CUDA、cuDNNのバージョンは

　・CUDA: 10.1
　・cuDNN: 7.6

となります。

# CUDA 10.1のインストール
　映像を出力するためには、GPUという部品が必要です。パソコンには必ずついてます。ノートパソコンのCPUはたいてい、CPUの中にGPUが組み込まれています（内臓グラフィック）。しかし、もっと高性能なGPUを使いたい！という方は、外付けGPUを使うわけです。それがいわゆるグラボです。
　そのグラフィックス担当のGPUを、グラフィックス以外に使えるようにしてやろうというのがCUDAです。CUDAは下記リンクからダウンロードできます。CUDA Toolkit 10.1 update2をインストールします。

　・https://developer.nvidia.com/cuda-toolkit-archive

Select Target Platformでは、

　・Operating System: Windows
　・Architecture: x86_64
　・Version: 10
　・Installer Type: exe (local)

を選択します。exeを立ち上げて、CUDAをインストールできます。特別な設定はなく、インストーラーに従ってインストールすれば大丈夫だと思います。

# cuDNNのインストール
　cuDNNはディープラーニング用のGPU高速処理ライブラリです。下記リンクからダウンロード可能です。ダウンロードには、アカウントを作成する必要があります。

　・https://developer.nvidia.com/rdp/cudnn-archive

ダウンロードしたzipファイルは、

　・C:\tools\cuda\bin

に展開します。

# パスの設定
システム環境変数のPathに、次のディレクトリを追加します。

　・C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
　・C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64
　・C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
　・C:\tools\cuda\bin

# TensorFlowのインストール
　TensorFlowはAnaconda promptを開いて以下のコマンドでインストールできます。

```none
pip install tensorflow-gpu==2.3.0
```
### なぜ conda install を使わないのか
　実は最初、conda install tensorflowでTensorFlowをインストールしてたのですが、GPUを認識せず苦労しました。conda install tensorflow では、TensorFlow 2.3.0がインストールされます。しかし、これがまずいらしい。

参考記事
　1. [TensorFlow2.1でCuda10.1なのにGPUが認識されない問題の解決法](https://medium.com/lsc-psd/tensorflow2-1%E3%81%A7cuda10-1%E3%81%AA%E3%81%AE%E3%81%ABgpu%E3%81%8C%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%81%AE%E8%A7%A3%E6%B1%BA%E6%B3%95-6be5137ec216)
　2. [Why is Tensorflow not recognizing my GPU after conda install?](https://stackoverflow.com/questions/65273118/why-is-tensorflow-not-recognizing-my-gpu-after-conda-install)

参考記事1によると、tensorflowのビルドはeigen, gpu, mklの3種類が存在していて、これが適切でないとGPUを認識してくれないそうです。そこで、[Anaconda.org](https://anaconda.org/anaconda/tensorflow/files) にとんだところ、tensorflow2.3.0にはgpuのビルドがないっぽい。ということで、condaではなくpipからインストールすることにしたのでした。

# 動作確認
　Spyderを開き、下記のコードを実行します。

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

出力はこんな感じ

```python
Out[38]: 
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 2745453239044564304,
 name: "/device:XLA_CPU:0"
 device_type: "XLA_CPU"
 memory_limit: 17179869184
 locality {
 }
 incarnation: 13175026954206619824
 physical_device_desc: "device: XLA_CPU device",
 name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 6531337689
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 18329998037222519679
 physical_device_desc: "device: 0, name: GeForce RTX 2070, pci bus id: 0000:01:00.0, compute capability: 7.5",
 name: "/device:XLA_GPU:0"
 device_type: "XLA_GPU"
 memory_limit: 17179869184
 locality {
 }
 incarnation: 3378513503248220410
 physical_device_desc: "device: XLA_GPU device"]
```
device_type: "GPU" との記載があるので、GPUがちゃんと認識されているようです。XLAはAccelerated Linear Algebraの略で、線形代数の演算に特化したコンパイラだそうです（参考：[TensorFlowでGPUが使えることの確認](https://sciencompass.com/machine-learning/tensorflow-gpu-check)）。

# おわり
pipを使ってTensorFlowをインストールしました。