PlaidMLを使ってMacでDeep Learning:導入編

今回は,MacDeep Learningするための手段として最近注目の,PlaidMLの導入について説明する.

PlaidMLとは?

PlaidMLとは,機械学習用のフレームワークである.

github.com

現状,GPUを用いた深層学習を行うためには,NVIDIA製のGPUと,それに付随したCUDA等のプラットフォームを利用する必要がある. これは,TensorFlowなどの深層学習ライブラリが,NVIDIAGPUに対するハードウェアアクセラレーションしかサポートしていないためである.

しかしながら,近年のMacAMD製のGPUを搭載しており,なおかつMacOS MojaveからNVIDIAGPUのサポートを行なっていないため,Mac機械学習を行う上での制約が大きかった.

一方,PlaidMLはOSやGPUなどの環境に対してオープンな機械学習フレームワークを目指して開発されており,近年注目を集めている.

注目すべき点は,人気の深層学習ライブラリであるKerasのバックエンドとしてPlaidMLを指定できることである. これにより,既存のKerasで書いたプログラムをほぼそのまま実行可能である.

前準備

前準備として,Pythonが導入されている必要がある. Macなら標準でPython 2.X系が入っているので,それを利用しよう.

ちなみに,今回の実行環境は以下の通りである.

導入手順

Python環境の確認

環境を汚したくないので,仮想環境上で作業していこう.

まず,任意のディレクトリ(ユーザ直下とかでOK)でPythonの仮想環境を構築する.

virtualenvであれば,

virtualenv plaidml-test

でOK.

これで,plaidml-testというディレクトリが作成されたはずだ.

作成したディレクトリ内のbin/activateに対してsourceコマンドを実行すると,仮想環境を利用できるようになる.

source ~/plaidml-test/bin/activate

Ternimalのコマンドライン冒頭に(plaidml-test)と表示されているはずだ.

PlaidMLのインストール

早速PlaidMLをインストールしていく. デフォルトでpipというパッケージ管理用のコマンドが使えるので,それを利用する.

pip install plaidml-keras

しばらく待って,Successfully installed ...という表示が出ればインストール完了だ.

セットアップ

次に,PlaidMLを使う上での環境設定を行っていく.

引き続き仮想環境内で,以下のコマンドを入力する.

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:
   opencl_intel_intel(r)_iris(tm)_graphics_550.0 : Intel Inc. Intel(R) Iris(TM) Graphics 550 (OpenCL)
   opencl_cpu.0 : Intel CPU (OpenCL)
   llvm_cpu.0 : CPU (LLVM)
   metal_intel(r)_iris(tm)_graphics_550.0 : Intel(R) Iris(TM) Graphics 550 (Metal)

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

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

使えるデバイス一覧が表示され,検証されていないデバイスを使っても良いかと聞かれる. 問題ないのでyを入力.

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

   1 : opencl_intel_intel(r)_iris(tm)_graphics_550.0
   2 : opencl_cpu.0
   3 : llvm_cpu.0
   4 : metal_intel(r)_iris(tm)_graphics_550.0

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

Selected device:
    metal_intel(r)_iris(tm)_graphics_550.0

先ほどのデバイス一覧のうち,どれを使うかを選択する.

見ての通り,CPUもGPUも選べる. AMDGPUを積んでいるMacの場合はここに表示される.

今回は,内蔵GPUmetalを選んだ. ちなみに,MacではOpenCLよりMetalの方が高パフォーマンスらしい.

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

Enable telemetry reporting? (y,n)[y]: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/[ユーザ名]/.plaidml? (y,n)[y]:y
Success!

行列計算が行われ,成功したそうだ. これまでの設定情報を保存して良いか聞かれるので,yとした.

次からは,保存した設定情報が自動で読み出される.

以上で,PlaidMLの導入が完了した.

ベンチマークを動かしてみる

実際に,ベンチマークを動かして性能を確認してみよう.

pip経由でplaidml-kerasplaidbenchをインストールする.

pip install plaidml-keras plaidbench

ちなみにplaidml-kerasをインストールすることで,KerasのバックエンドとしてPlaidMLが使用できるようになる.

早速ベンチマークを回してみよう.

plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1
INFO:plaidml:Opening device "metal_intel(r)_iris(tm)_graphics_550.0"
Model loaded.
Compiling network...
(中略)
Warming up ...
Main timing
Example finished, elapsed: 0.71901512146 (compile), 33.0695531368 (execution), 0.0322944854852 (execution per example)
Correctness: PASS, max_error: 2.15340751311e-05, max_abs_error: 1.28149986267e-06, fail_ratio: 0.0

無事動いた!! ちゃんとCorrectnessPASSとなっている.

せっかくなので,実行デバイスを変えて結果を比較してみた.

バイス Correctness コンパイル時間 実行時間
OpenCL (GPU: Inter Iris Graphics 550) PASS 2.9 17.8
OpenCL (CPU: 2.9GHz Core i5) FAIL 2.4 339.2
LLVM (CPU: 2.9GHz Core i5) PASS 5.1 135.7
Metal (GPU: Inter Iris Graphics 550) PASS 0.7 33.1

OpenCL (CPU)以外はちゃんと動くことが確認できた.

しかし,流石にGPUは速いなぁ…. 意外だったのは,実行時間に関してはMetalよりOpenCLの方が早くなった点である.

AMDの外部GPUであればさらに圧倒的なパフォーマンスになると思われるので,いつか試してみたいところである.

Kerasのバックエンドとして使う

実際にPythonのプログラムで使う際には,KerasのバックエンドとしてPlaidMLを指定する必要がある.

特に複雑な設定は不要で,単にimport kerasの前に以下のコードを入力すればよい.

import plaidml.keras
plaidml.keras.install_backend()

これで,KerasのバックエンドにPlaidMLがセットされ,MacでもGPUを使った機械学習が可能となる.

今後は,AMD製のグラフィックボードを載せたeGPUを接続してみて,どの程度のパフォーマンスが発揮されるのか是非とも試してみたいところである.

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

GIGABYTE ビデオカード RX580搭載 外付けVGA BOX GV-RX580IXEB-8GD

GIGABYTE ビデオカード RX580搭載 外付けVGA BOX GV-RX580IXEB-8GD

参考

以下の記事を参考にさせていただいた.

qiita.com

qiita.com