はじめに
公式のgithubのドキュメントを参考にAnaconda3の仮想環境にPlaidMLを構築していたら、一部はまった部分があるので共有しておく。
構築環境
- Macbook pro 15インチ
- macOS Catalina 10.15.1
- Radeon pro 555x
- Anacond3 2019.10
手順
公式ドキュメントを参考に進める.
- 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を選択するのが吉ですね。