Macでも高速に機械学習できるかもしれないPlaidMLを試してみた

  • 14
    Like
  • 0
    Comment

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にも公式に対応予定とのことで、今後に期待したい。

リンク