Kerasの作者の@fcholletさんがTwitterで紹介していた、PlaidMLという新しい機械学習用のライブラリを試してみた。Early Alpha Quality
とのことであるが、試してみたらとても速いしKerasで書いてたコードが(ほぼ)そのまま使えて感激した。これは機械学習が捗る…かも?
短くまとめると
- PlaidMLという新しいフレームワークを使うと、nVidia積んでないMacでもGPU使って高速に機械学習できるかも
- Kerasのバックエンドとして使えるので、今まで書いてきたKerasのコードを(ほぼ)そのまま使える
- 動かしてみたら、確かに速い。
- しかし、自前のコード(CNNの転移学習)だとなぜか学習の途中で失敗してしまった。
PlaidML
https://github.com/plaidml/plaidml
TensorFlowと違って、OpenCLサポートがあるためAMDのGPUでもハードウェアアクセラレーションが効くらしい。そして、このPlaidMLはKerasのバックエンドとして使える。つまり、今まで書いてきたKerasのコードを、そのままバックエンドをPlaidMLに切り替えるだけで高速に実行できる可能性があるということ。
これはMacで機械学習を楽しむ上ではとても意味のあることなので、早速試してみた。
ソースコードからビルドする
2017年10月22日現在、PlaidMLはまだMacを公式にサポートしていない。しかし、試してみたところビルドして動かすことができた。以下、公式に案内されている内容ではないため、自己責任で。
ちなみに問い合わせてみたところ、In a few weeks we should be releasing official Mac support
という返答があり、数週間以内にはMacでもpip経由でインストールできるようになりそうなので、急がない人はそれを待ったほうが無難かも。
OpenCLが使えるか調べる
clinfo
を使って、使用中のMacのGPUでOpenCLが使えるか調べておこう。
brew install clinfo
clinfo
Number of platforms
が1以上になっていたらOK。
必要なライブラリを入れる
brewで必要なライブラリを入れておく。古い場合は適宜アップデートすること。(特にbazelは0.6.0以降が必要)
brew install bazel
brew install bison
brew install flex
virtualenvで環境を作る
必須ではないが、試行錯誤するにあたって環境を汚したくないのでvirtualenvで新しい環境を作る。
virtualenv --system-site-packages ~/plaidml
source ~/plaidml/bin/activate
pip install setuptools --upgrade
setuptools
が古いとビルド/インストールに失敗するため、念のためアップデートしておく。36.6.0
ではうまくいった。
ソースコードをクローンする
git clone https://github.com/plaidml/plaidml.git
ビルド+インストール
bazel
を使ってビルド、作成されたwheelをインストールする。
bazel build -c opt plaidml:wheel plaidml/keras:wheel
pip install -U bazel-bin/plaidml/*whl bazel-bin/plaidml/keras/*whl
PlaidMLの設定
インストールが完了したら、plaidml-setup
を実行して環境の設定を行う。ここで計算に使用するGPUを指定する。
plaidml-setup
基本的には質問に答えていくだけ。
PlaidML Setup (0.0.0.dev0)
...
Default Config Devices:
No devices.
Experimental Config Devices:
amd_radeon_pro_570_compute_engine.0 : AMD AMD Radeon Pro 570 Compute Engine
intel(r)_core(tm)_i5-7500_cpu_@_3.40ghz.0 : Intel Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
Using experimental devices can cause poor performance, crashes, and other nastiness.
Enable experimental device support? (y,n)[n]:y
検証されていないハードウェアだとExperimental
にリストされるようだが、とりあえず試してみる。
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:
1 : amd_radeon_pro_570_compute_engine.0
2 : intel(r)_core(tm)_i5-7500_cpu_@_3.40ghz.0
Default device? (1,2)[1]:1
Selected device:
amd_radeon_pro_570_compute_engine.0
AMDを選んでみた。
PlaidML sends anonymous usage statistics to help guide improvements.
We'd love your help making it better.
Enable telemetry reporting? (y,n)[y]:y
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 /Users/foo/.plaidml? (y,n)[y]:
Success!
マトリクスの計算が行われ、どうやらうまく動いたようだ。この設定を.plaidml
に保存すると、次回以降PlaidML
を実行する際に、このハードウェア設定が使われるようだ。
Kerasのバックエンドとして使ってみる
Kerasのバックエンドとして使う場合は、import keras
より前に下記のコードを呼んであげれば良い。
import plaidml.keras
plaidml.keras.install_backend()
VGG-LIKEなサンプルで比較してみる
試しに、KerasのホームページにあるVGG-LIKEのサンプルをそれぞれのバックエンドで実行してパフォーマンスを計測してみた。fitの処理にかかった時間のみを計測。参考までに、FloydHub(GPU使用)の結果も。
なお、処理が早く終わりすぎてしまうのでEPOCHは50に増やした。
環境 | 時間(四捨五入) |
---|---|
TensorFlow(CPU拡張命令セットあり) | 117秒 |
PlaidML(AMD Radeon Pro 570) | 55秒 |
FloydHub(GPUインスタンス) | 14秒 |
iMac 2017 CPU 3.4 GHz Intel Core i5 + AMD Radeon Pro 570
なるほど。
本題から外れるけど、FloydHub圧倒的にはええ。
自分のコードだと学習に失敗してしまう
TensorFlow + Kerasでフレンズ識別する - その1: 学習データの準備編
上のVGG-LIKEなサンプルはうまくいったのだが、上の記事で使った自分のコードで試してみたところ、学習の途中でTrain Loss / Train Accuracy / Val Loss / Val Accuracy全てがゼロに収束してしまうという謎の現象が起きてしまい、うまくいかなかった。
こちらはFloydHub(TensorFlow + GPU)だと問題なく動いているので、どうやらPlaidMLの問題の可能性が高そうなのだが、今のところまだ原因は突き止められていない。引き続き調査中…。
Macは公式には未対応、Early Alpha Quality
の段階ということもあり、不具合があったりまだ実戦で使うには早すぎるのは当然かもしれないが、OpenCL対応で、かつKerasのコードをそのまま使えるというのは本当にありがたい。数週間以内にMacにも公式に対応予定とのことで、今後に期待したい。