PlaidMLを使ってMacでDeep Learning:導入編
今回は,MacでDeep Learningするための手段として最近注目の,PlaidMLの導入について説明する.
PlaidMLとは?
現状,GPUを用いた深層学習を行うためには,NVIDIA製のGPUと,それに付随したCUDA等のプラットフォームを利用する必要がある. これは,TensorFlowなどの深層学習ライブラリが,NVIDIA製GPUに対するハードウェアアクセラレーションしかサポートしていないためである.
しかしながら,近年のMacはAMD製のGPUを搭載しており,なおかつMacOS MojaveからNVIDIA製GPUのサポートを行なっていないため,Macで機械学習を行う上での制約が大きかった.
一方,PlaidMLはOSやGPUなどの環境に対してオープンな機械学習フレームワークを目指して開発されており,近年注目を集めている.
注目すべき点は,人気の深層学習ライブラリであるKerasのバックエンドとしてPlaidMLを指定できることである. これにより,既存のKerasで書いたプログラムをほぼそのまま実行可能である.
前準備
前準備として,Pythonが導入されている必要がある. Macなら標準でPython 2.X系が入っているので,それを利用しよう.
ちなみに,今回の実行環境は以下の通りである.
- Macbook Pro 13インチ(Late 2016)
- CPU: 2.9GHz Intel Core i5
- GPU: Inter Iris Graphics 550
- メモリ: 16GB
導入手順
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も選べる. AMDのGPUを積んでいるMacの場合はここに表示される.
今回は,内蔵GPUのmetal
を選んだ.
ちなみに,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-keras
とplaidbench
をインストールする.
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
無事動いた!!
ちゃんとCorrectness
もPASS
となっている.
せっかくなので,実行デバイスを変えて結果を比較してみた.
デバイス | 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を接続してみて,どの程度のパフォーマンスが発揮されるのか是非とも試してみたいところである.
- 作者: Francois Chollet,巣籠悠輔,株式会社クイープ
- 出版社/メーカー: マイナビ出版
- 発売日: 2018/05/28
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
AKiTiO Node Thunderbolt 3対応 グラフィックボード専用 外付け拡張ボックス(Windows 10専用/アミュレットオリジナルマニュアル付き)
- 出版社/メーカー: AKiTiO
- メディア: エレクトロニクス
- この商品を含むブログを見る
GIGABYTE ビデオカード RX580搭載 外付けVGA BOX GV-RX580IXEB-8GD
- 出版社/メーカー: 日本ギガバイト
- 発売日: 2018/04/28
- メディア: Personal Computers
- この商品を含むブログを見る
参考
以下の記事を参考にさせていただいた.