TensorFlow(GPU版) Installとお試しRNN 備忘録

#概要
GPU対応TensorFlow（以下TF）のインストール手順を備忘録として残す。
- 実施期間: 2020年2月
- 環境：Ubuntu18.04LTS
- Python2.7, 3.6.9インストール済み
- GPU: GeForce GTX 1070

##背景
4年ほど昔、Ubuntuの使い方も見様見真似だったころに挑戦したのだが、うまくいかず諦めた経験があり今回再挑戦してみた。
今はGoogle ColaboratoryのVM環境で、CUDA環境整備に悩まされることなくTF+Kerasを使った深層学習モデルで遊んでいる。使い勝手はほぼJupyter notebookと同じ。

![notebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/9b2792a5-fcb5-ec8e-2a56-2cb3376ca4a0.png)
[Colaboratoryのnotebook]

ことモデリングについていえば自前PCのGPUを必ずしも使用する必要はない。
ただ、折角手元のデスクトップPCにはGPUが刺さっているので、これでモデルの教育させたいと思うのが人情（VMにはGPU無料使用時間に制限があるし）。
そこで安直に[オフィシャル](https://www.tensorflow.org/install/gpu)が下記に推奨するよう、TF Dockerイメージで横着して環境を作ろうかと考えた。

_**「GPU サポートを含む TensorFlow の Docker イメージ（Linux 用のみ）を使用することをおすすめします。その場合セットアップに必要なのは NVIDIA® GPU ドライバだけです。」**_

楽チンできそうだが手順を読むと直感的に鵜呑みにできない。
他の選択肢も調べているなかで、素晴らしすぎるサイトを見つけた。[ここ](https://www.pugetsystems.com/labs/hpc/Install-TensorFlow-with-GPU-Support-the-Easy-Way-on-Ubuntu-18-04-without-installing-CUDA-1170/)によると、TFオフィシャル通りにするとUbuntu18.04対応状況の遅れから、はまる可能性が高いらしい。
これに従い以下手順を残す。

##Nvidia GPUドライバ更新
GPUドライバ396以降が必要らしい。
幸い430が入っていたので何もしなかったが、バージョンが古ければ下記の手順でUpdateする。

```terminal
sudo apt purge nvidia*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt install --no-install-recommends nvidia-driver-430
reboot
nvidia-smi	#reboot後、チェック
```
3行目の _"nvidia-driver-430"_ は2020年2月時点の最新版が430だから。
最新版は下記のPPAで都度確認できる。
https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

##Anacondaのインストール
[オフィシャルサイト](https://www.anaconda.com/distribution/#download-section)から、最新インストール用shファイル(Anaconda3-2019.10-Linux-x86_64.sh)をダウンロードする。
Minicondaの時と同じようにDownloadsフォルダでbash実行しインストール

```terminal
$ cd Downloads
$ bash Anaconda3-2019.10-Linux-x86_64.sh
```
下記の２行をbashrcに追記する。追記したらsource ~/.bashrcすればcondaをコマンドとして認識する。

```terminal
export PATH=/home/imo/anaconda3/bin:$PATH
source /home/imo/anaconda3/etc/profile.d/conda.sh
```

AnacondaをUpdateする。

```terminal
$ conda update conda
$ conda update anaconda
$ conda update --all
```
"conda update python"を実行すると、標準のPythonが3.9になるため行わないこと。
TensorflowはPython 3.9をサポートしていないため。

##conda仮想環境にTFインストール
前述の会心下記サイトを参考にインストールする。

https://www.pugetsystems.com/labs/hpc/Install-TensorFlow-with-GPU-Support-the-Easy-Way-on-Ubuntu-18-04-without-installing-CUDA-1170/

conda仮想環境(環境名はtf-gpu、表示名はTensorFlow-GPUとする)を作成する。

```terminal
$ conda create --name tf-gpu
$ conda activate tf-gpu
```

conda仮想環境内でTFと関連ツールをインストールする。

```terminal
(tf-gpu) conda install tensorflow-gpu
(tf-gpu) conda install ipykernel jupyter
(tf-gpu) python -m ipykernel install --user --name tf-gpu --display-name "TensorFlow-GPU"
(tf-gpu) python -c 'import tensorflow as tf; print(tf.__version__)'	#チェック　2.1.0がインストールされた
(tf-gpu) conda install keras-gpu
(tf-gpu) conda install pandas
(tf-gpu) conda install scikit-learn
(tf-gpu) conda install pillow
```

Jupyter notebookの起動する。

```terminal
(tf-gpu) jupyter notebook
```

![Jupyter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/ecc03157-bedf-bd63-a3b2-ec4ac54944a4.png)
[Jupyter notebook]

たったこれだけ。

##GPU認識確認
TensorflowがGPUを認識しているか確認する。


```terminal
$ conda activate tf-gpu
$ python
>>> import tensorflow as tf
>>> print(tf.__version__)
>>> gpu_num = len(tf.config.list_physical_devices('GPU'))
>>> print(gpu_num)
```

Jeff先生の教材を参考

https://github.com/jeffheaton/t81_558_deep_learning/blob/master/install/tensorflow-install-mac-jan-2021.ipynb


##RNNで動作確認
TFオフィシャルの[チュートリアル](https://www.tensorflow.org/tutorials/structured_data/time_series)のセルをコピペしRNNを実際に動作させてみた。
これはマックス・プランク研究所が提供する気象時系列データ（気温、湿度など14種類のデータ）でLSTM modelを学習させ、将来の気温を予測するチュートリアルである。
Part1が過去10分刻みの気温データで学習したモデルの予測で、Part2は気温、気圧、空気密度の3データで学習・予測させるもの。
Part2の方が予測精度が向上することが実体験できる。

参考までにPart1の結果だけ張り付ける。
チュートリアルの学習epoch数が10と控えめだったので、30まで伸ばしてみた。accuracyではなくlossで評価している。

![loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/34d5aeba-027a-0bd8-8e32-b916fdc465db.png)

TrainingもValidationもlossはともに収束しており、過学習の兆候はともに見られない。
なぜValidationの方がTrainingよりもlossが小さくなっているかはわからないので勉強が必要。
epoch=28でtrainingのlossが0.0140と最小値になってる。本来ならcallbackを組み込んでそこで学習が終わるようにすべき。

![epoch28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/cc33ff84-9be5-1653-389a-6c5e906de869.png)

epoch=10の時のtraining loss=0.0228だったのでepoch=30の0.0169は明らかに改善しており、その結果が下図の予測結果に表れている。
赤Xが実際の温度で、緑○が予測気温。

![predictions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/d2c68793-3906-1bfe-7eab-bf39a0164d04.png)

ひと通り楽しんだらJupyter notebookが起動しているブラウザを閉じ、実行中のターミナルは[Ctrl]+[c]で終了させ、仮想環境を抜ける。

```terminal
(tf-gpu) conda deactivate
```

##おまけ1  ~ Dockerのインストール ~
Docker版のTFもうまくいっていたので手順を残す。
参考にしたのは、本編で怪しいといった下記サイトで、実はDockerでも問題なかった。
https://www.tensorflow.org/install/docker

```terminal
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
docker version	#チェック
sudo docker pull tensorflow/tensorflow:latest-gpu-jupyter
sudo docker image
```