Ubuntu18.04 + AMD Radeon + Kerasでディープラーニングするための環境構築

# 注意(追記)
環境構築して再起動したら，画面の表示が乱れ，ログインできなくなりました．Ctrl+Alt+F3で一時的にCUIで操作できるようになるのですが，5秒程で強制的にGUIに切り替えられます．おそらく，GPUのドライバーをインストールしたことが原因だと思われます．

上記のような不具合を避けるために，Dockerで環境構築し直しました．
[Keras + AMD Radeon + Dockerでディープラーニングするための環境構築](https://qiita.com/yoshikit1996/items/9063e15756fa96553369)

# 環境
OS: Ubuntu 18.04.1 LTS
GPU: Radeon RX 560 Series (POLARIS11 / DRM 3.23.0 / 4.15.0-39-generic, LLVM 6.0.0)

# インストール
```shell
# ドライバーのインストール
wget --referer=http://support.amd.com https://www2.ati.com/drivers/linux/beta/ubuntu/amdgpu-pro-17.40.2712-510357.tar.xz
tar -Jxvf amdgpu-pro-17.40.2712-510357.tar.xz
cd amdgpu-pro-17.40.2712-510357
chmod u+x ./amdgpu-pro-install
sudo ./amdgpu-pro-install --compute -y

# python，keras等のインストール
sudo apt install python3.7 clinfo
sudo -H pip install -U plaidml-keras plaidbench
```

GPUが認識されているかどうか確認する

```text
hoge@fuga:~$ clinfo | grep "Device Board Name"
  Device Board Name (AMD)                         Radeon RX 560 Series
```
# plaidml-setup

```text
hoge@fuga:~$ plaidml-setup

PlaidML Setup (0.3.5)

Thanks for using PlaidML!

Some Notes:
  * Bugs and other issues: https://github.com/plaidml/plaidml
  * Questions: https://stackoverflow.com/questions/tagged/plaidml
  * Say hello: https://groups.google.com/forum/#!forum/plaidml-dev
  * PlaidML is licensed under the GNU AGPLv3
 
Default Config Devices:
   No devices.

Experimental Config Devices:
   llvm_cpu.0 : CPU (LLVM)
   opencl_amd_baffin.0 : Advanced Micro Devices, Inc. Baffin (OpenCL)

Using experimental devices can cause poor performance, crashes, and other nastiness.

Enable experimental device support? (y,n)[n]:y

Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:

   1 : llvm_cpu.0
   2 : opencl_amd_baffin.0

Default device? (1,2)[1]:2

Selected device:
    opencl_amd_baffin.0

PlaidML sends anonymous usage statistics to help guide improvements.
We'd love your help making it better.

Enable telemetry reporting? (y,n)[y]:n

Almost done. Multiplying some matrices...
Tile code:
  function (B[X,Z], C[Z,Y]) -> (A) { A[x,y : X,Y] = +(B[x,z] * C[z,y]); }
Whew. That worked.

Save settings to /home/hoge/.plaidml? (y,n)[y]:y
Success!
```


# ベンチマーク
ベンチマーク用のライブラリをインストール

```shell
pip install plaidml-keras plaidbench
```
ベンチマークを計測する(GPU Radeon RX 560 Series (POLARIS11 / DRM 3.23.0 / 4.15.0-39-generic, LLVM 6.0.0))

```text:GPU
hoge@fuga:~$ plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1
INFO:plaidml:Opening device "opencl_amd_baffin.0"
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.6/mobilenet_1_0_224_tf.h5
17227776/17225924 [==============================] - 13s 1us/step
17235968/17225924 [==============================] - 13s 1us/step
Model loaded.
Compiling network...
Warming up ...
Main timing
Example finished, elapsed: 2.88427686691 (compile), 7.65398216248 (execution), 0.00747459195554 (execution per example)
Correctness: PASS, max_error: 1.81299965334e-05, max_abs_error: 6.70552253723e-07, fail_ratio: 0.0
```
ベンチマークを計測する(CPU AMD Ryzen Threadripper 2950X 16-Core Processor)

```text:CPU
hoge@fuga:~$ plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1
INFO:plaidml:Opening device "llvm_cpu.0"
Model loaded.
Compiling network...
Warming up ...
Main timing
Example finished, elapsed: 4.06161594391 (compile), 139.089559078 (execution), 0.135829647537 (execution per example)
Correctness: PASS, max_error: 1.7511049009e-05, max_abs_error: 6.55651092529e-07, fail_ratio: 0.0
```

GPUでは，コンパイル時間が約71%，実行時間が約6%になった

# 参考文献
- [GitHub - plaidml/plaidml](https://github.com/plaidml/plaidml)
- [Running AMD Radeon GPUS on Ubuntu 16.04](https://gist.github.com/9bitbear/ed22baac9b59ae53bbee74ab9bff7150)