Radeonを用いてPlaidMLを利用するためにAnaconda3の仮想環境を構築する

# はじめに
公式のgithubのドキュメントを参考にAnaconda3の仮想環境にPlaidMLを構築していたら、一部はまった部分があるので共有しておく。

# 構築環境
- Macbook pro 15インチ
- macOS Catalina 10.15.1
- Radeon pro 555x
- Anacond3 2019.10 

# 手順
[公式ドキュメント](https://github.com/plaidml/plaidml)を参考に進める.

- Anacondaの仮想環境を作る.--name以降は好きな名前で良いが便宜上plaidmlとしておく.また、pythonのバージョンはopencvを使うので3.5としてある.

```
conda create --name plaidml python=3.5
```

- 作成した仮想環境を活性化する.

```
conda activate plaidml
```

- plaidml-kerasとplaidbenchをインストールする。condaではインストールできないので、ここではpip3を用いている。

```
pip3 install plaidml-keras plaidbench
```

- 環境変数を定義する(公式ドキュメントにはない作業).

```
export PLAIDML_NATIVE_PATH=/Library/Python/3.7/lib/libplaidml.dylib
export RUNFILES_DIR=/Library/Python/3.7/share/plaidml
```
※人によってはlibplaidml.dylibとplaidmlが上記のパスにない恐れがあるため、次の作業でエラーがでたらfindなどを利用してパスを探し環境変数を上書きする.


- 以下のコマンドを実行し、アクセラレータを選択する.(上記の環境変数を設定しなければここでエラーが出る)

```
plaidml-setup
```

- 以下のように表示されたらyを押して進める.

```
PlaidML Setup (0.6.4)

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 Apache License 2.0
 

Default Config Devices:
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   metal_amd_radeon_pro_555x.0 : AMD Radeon Pro 555X (Metal)

Experimental Config Devices:
   llvm_cpu.0 : CPU (LLVM)
   opencl_intel_uhd_graphics_630.0 : Intel Inc. Intel(R) UHD Graphics 630 (OpenCL)
   opencl_cpu.0 : Intel CPU (OpenCL)
   opencl_amd_radeon_pro_555x_compute_engine.0 : AMD AMD Radeon Pro 555X Compute Engine (OpenCL)
   metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
   metal_amd_radeon_pro_555x.0 : AMD Radeon Pro 555X (Metal)

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

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

```

- Radeonを使いたいので4を押してenter.(人によっては4ではない可能性があるので要確認)

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

   1 : llvm_cpu.0
   2 : opencl_intel_uhd_graphics_630.0
   3 : opencl_cpu.0
   4 : opencl_amd_radeon_pro_555x_compute_engine.0
   5 : metal_intel(r)_uhd_graphics_630.0
   6 : metal_amd_radeon_pro_555x.0

Default device? (1,2,3,4,5,6)[1]:
```

- yを押してセーブする.

```
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 /Users/hondatakumi/.plaidml? (y,n)[y]
```

# ベンチマーク
- Radeonが使われているかテストするために以下のコマンドを実行する.

```
plaidbench keras mobilenet
```
※初回のみベンチマーク用のデータセットのダウンロードが行われる。ダウンロード後は以下のように表示される.

- ベンチマークの結果が表示される.

```
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "opencl_amd_radeon_pro_555x_compute_engine.0"
Compiling network... Warming up... Running...
Example finished, elapsed: 0.500s (compile), 14.828s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            14.48 ms                  8.76 ms / 114.19 fps
Correctness: FAIL, max_error: 80.5865478515625, max_abs_error: 0.48130014538764954, fail_ratio: 0.929

```

# あとがき
なぜかlossやerrorががやたら高いがRadeonはちゃんと使われているっぽい.アクセラレータを選択する場面で4ではない数字を選べばRadeon以外でもベンチマークを実行できます.

# 追記(12/2)
- アクセラレータを選択する際に6を押して使用するアクセラレータをmetal_amd_radeon_pro_555x.0にしてベンチマークを実行した結果


```
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "metal_amd_radeon_pro_555x.0"
Compiling network... Warming up... Running...
Example finished, elapsed: 1.922s (compile), 8.305s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            8.11 ms                   0.00 ms / 1000000000.00 fps
Correctness: PASS, max_error: 1.675534622336272e-05, max_abs_error: 7.674098014831543e-07, fail_ratio: 0.0
```

compile以外の時間とロス・エラーも下がってるのでmetal_amd_radeon_pro_555x.0を選択するのが吉ですね。