[Python] [R] tensorflow-gpuでGPUを認識させるまで

# 環境
Ubuntu 18.04
GeForce GTX 1050 (NVIDIA-SMI 390.116)
conda 4.6.14
R version 3.6.0 (2019-04-26)

# tensorflow-gpuでGPUが認識されない問題...

```shell
conda create -n ml tensorflow-gpu keras
```

としたところ、GPUが使用できませんでした。
パッケージを確認してみます。

```shell
conda list -n ml | grep -e python -e cud -e tensorflow
# python                    3.7.1             hd21baee_1001    conda-forge
# tensorflow                1.13.1                   py37_0    conda-forge
# tensorflow-estimator      1.13.0                     py_0  
# tensorflow-gpu            1.13.1               h0d30ee6_0  
```

cudnnとcudatoolkitがインストールされていません...
また、tensorflowとpythonが最新になってしまっているので、
もう少し古いものが欲しいところです。

# 解決

tensorflowとpython, cuda, cudnnの対応表を見ると、
（https://www.tensorflow.org/install/source#linux）
**Python=3.6, tenforflow=1.12, cuda=9.0, cudnn=7**が良さそうですので、
明示的にこれらをインストールします。

```shell
conda install -y -n ml python=3.6 tensorflow-gpu=1.12.0 keras &&
conda install -y -n ml cudatoolkit=9.0
```
なお、tensorflow-gpuをインストールするとcudatoolkit=9.2が付いてきます。
私の環境ではcudatoolkit=9.2は使えなかったため、
あとでcudatoolkit=9.0をインストールしています。

改めてインストールされたパッケージを調べます。
目的のバージョンがインストールされたことが確認できました。

```shell
conda list -n ml | grep -e python -e cud -e tensorflow
# cudatoolkit               9.0                  h13b8566_0  
# cudnn                     7.3.1                 cuda9.0_0  
# python                    3.6.7             h381d211_1004    conda-forge
# tensorflow                1.12.0          gpu_py36he68c306_0  
# tensorflow-base           1.12.0          gpu_py36h8e0ae2d_0  
# tensorflow-estimator      1.13.0                     py_0  
# tensorflow-gpu            1.12.0               h0d30ee6_0  
```

最後に、GPUが認識されているかを確認します。

```shell
conda activate ml
python -c "from tensorflow.python.client import device_lib; 
print(device_lib.list_local_devices())"
### 中略 ####
# physical_device_desc: "device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1"
############
```

GPUが無事認識されました！

# Rでも同じです

Rでtensorflow-gpuを使うときにも全く同じ解法が使えました。

```R
library(reticulate)
library(keras)
install_keras(tensorflow = "gpu")

device_lib <- reticulate::import("tensorflow.python.client.device_lib")
device_lib$list_local_devices()
```
これではCPUしか表示されませんでした。

さきほどのコードでr-tensorflowという仮想環境が作られているので、
その中のパッケージを確認してみます。

```shell
conda list -n r-tensorflow | grep -e python -e cud -e tensorflow
# python                    3.7.1             hd21baee_1001    conda-forge
# tensorflow                1.13.1                   py37_0    conda-forge
# tensorflow-estimator      1.13.0                     py_0  
# tensorflow-gpu            1.13.1               h0d30ee6_0  
```
`conda install tensorflow-gpu keras`の実行結果と全く同じですね。
では、明示的に古いバージョンを指定してインストールします。

```R
system("/$HOME/anaconda3/bin/conda install -y -n r-tensorflow python=3.6 tensorflow-gpu=1.12.0 keras")
system("/$HOME/anaconda3/bin/conda install -y -n r-tensorflow cudatoolkit=9.0")

device_lib <- reticulate::import("tensorflow.python.client.device_lib")
device_lib$list_local_devices()
### 中略 ####
# physical_device_desc: "device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1"
############
```

Rでも同様にGPUが認識されました！
これでGPUを使ってゴリゴリ計算を回すことができますね！