PlaidMLというものがあるらしい
PlaidMLはOpenCLを使った機械学習フレームワーク
PlaidMLはtensorflow等の従来の機械学習とは違い、CUDAではなくOpenCLを使うそうだ。
つまり、NVIDIAではなくAMDのGPUでも大丈夫なので、RX470でも使えるはず。
しかもkerasに対応しているので、kerasからtensorflowをバックエンドにして動かしていたコードがほぼそのまま動くそうな。
性能はどれくらい出るんだろうか?
インストールは簡単
GPUのドライバをインストールしたのち、
次の方法でpythonやkeras、git、vcredist2015などの関連ソフトも含めてすべてインストールできる。
Windows10でPlaidMLを使うには、Chocolatey(windows版パッケージマネージャ)を使うのが推奨となっている?
他の方法もいくつかあると思うけど、公式に従うなら
管理者権限のPowerShell(デスクトップ左下のWindowsボタンを右クリックで表示される、「Windows PowerShell(管理者)」を開く)で
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) をコピペして実行したのち、管理者権限のPowerShellをいったん閉じてからもう一度開いて choco install -y python git vcredist2015
のようにすると、PlaidMLの前提となる各種ソフトがインストールできる。
ここで、管理者権限でないPowerShellに切り替えてから
pip install -U plaidml-keras plaidml-setup
とすると、PlaidMLのインストールが完了し、初期設定として利用するGPUを選ぶことができる。ここで「opencl_amd_ellesmere.0」となっているのがRX470らしい。EllesmereはRX470のアーキテクチャであるPolaris10のコードネーム。
kerasがバックエンドとしてPlaidMLを使ってくれるように設定する
デフォルトでは、kerasはtensorflowを使うようになっている?ので
管理者権限ではないPowerShellを起動して、ホームフォルダで(起動直後はホームフォルダなので、そのままで大丈夫)
mkdir .keras
とコマンドすると、「.keras」という名前のフォルダができる。
エクスプローラでC:\Users\ユーザ名\.keras\を開いて、何もないところを右クリックして新規作成→テキストドキュメントを作成して、
{ "epsilon": 1e-07, "floatx": "float32", "image_data_format": "channels_last", "backend": "plaidml.keras.backend" }
と記述して保存し、ファイル名を
keras.json
に変更すると、kerasがバックエンドとしてPlaidMLを使ってくれるようになる。
サンプルコードを動かすのも簡単
kerasを使ったコードがそのまま動いた
kerasがgithubで公開しているサンプルコードをいくつか動かしてみたが、問題なく動いた。
例:mnist_cnn.pyのサンプルコードをコピーしてきてmnist_cnn.pyというファイルを作成したら、PowerShellでmnist_cnn.pyのあるフォルダに移動して
python mnist_cnn.py
PlaidMLの性能は?
kerasのサンプルコードをWindows10上でPlaidMLをバックエンドとして実行した場合と、Rocm環境下のUbuntu18.04でtensorflowをバックエンドとして実行した場合の速度を比較した。
mnist_cnn.py
PlaidMLの結果Win10上のPlaidMLで1Epochあたり12秒、ROCm環境下のtensorflowで1Epochあたり8秒と、ROCm環境の方が良い結果となった。
cifar10_resnet.py
version = 1、batch_size=128、depth=50、learning rate = 0.001で実行。Win10上のPlaidMLで1Epochあたり200秒前後、ROCm環境下で55秒前後と、mnistの場合よりも大きな差でROCm環境が良い結果となった。
また、メモリ使用量もPlaidMLで5.6GB、ROCm環境で1286MBと、PlaidMLではビデオメモリをより多く消費するようだ。
ちなみに、RX470とGTX1060 3GBの比較は先日の記事参照。
noroue4.hatenablog.com
結論
kerasを使ったコードがそのまま動くし、CUDAやROCmの専用環境を用意するより導入が簡単で、OpenCLを利用するので汎用性があり、AMDのGPUやMac環境などでも使いやすいのが利点?
ただ、(2つサンプル実行しただけなので、断言はできないけど)今のところ速度やメモリ使用量がCUDAやROCmなどの専用環境に劣るかも?
一時期はROCmを使うより速かったそうなので、PlaidMLが遅いというよりはCUDAやROCm、あるいはtensorflowの進歩が目覚ましいのかもしれない。
もしkerasがPlaidMLを使ってくれなかったら
PlaidMLを使ってくれたら、サンプルプログラム実行時に
Using plaidml.keras.backend backend.
という表示が出る。もしこれがうまくいかず、Using tensorflow backendなどの表示になってしまう場合、keras.jsonではなくサンプルプログラムを直接編集する。
from __future__ import print_function
と
import keras
の間に
import plaidml.keras plaidml.keras.install_backend()
の記述を追加して、pythonで実行するだけ。
例:サンプルプログラムmnist_cnn.pyに上記の記述を追加してから、PowerShellでmnist_cnn.pyのあるフォルダに移動して
python mnist_cnn.py
とコマンドする。