なんとなく日誌

覚え書きとか。twitter:https://twitter.com/noronoroxxxxxx

RX470で機械学習ことはじめ その7日 ~PlaidMLでOpenCL機械学習~

PlaidMLというものがあるらしい

PlaidMLはOpenCLを使った機械学習フレームワーク

PlaidMLはtensorflow等の従来の機械学習とは違い、CUDAではなくOpenCLを使うそうだ。
つまり、NVIDIAではなくAMDGPUでも大丈夫なので、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を選ぶことができる。

f:id:noroUE4:20190228035303p:plain
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

とコマンドするだけ。
ただし、なぜかタスクマネージャではGPU使用率は上がらず。OpenCLを使っているから?

f:id:noroUE4:20190228035759p:plain
PlaidMLではタスクマネージャ上でGPU使用率が上昇しない

Ubuntu18.04では動作しなかった

UbuntuでPlaidMLを使うには、GPUのドライバを入れてから

	sudo apt install python3-pip
	pip3 instal plaidml-keras
	plaidml-setup

で使えるはずだが、「plaidml.exceptions.Unknown: unable to resolve type:」エラーが出て動作しなかった。

f:id:noroUE4:20190228034437p:plain
Ubuntu18.04ではPlaidMLは動作しなかった


PlaidMLの性能は?

kerasのサンプルコードをWindows10上でPlaidMLをバックエンドとして実行した場合と、Rocm環境下のUbuntu18.04でtensorflowをバックエンドとして実行した場合の速度を比較した。

mnist_cnn.py

PlaidMLの結果

f:id:noroUE4:20190228035926p:plain
PlaidMLでmnist_cnnを実行(それぞれ内臓GPUとRX470)
f:id:noroUE4:20190228040718p:plain
ROCm環境下でmnist_cnnを実行
Win10上のPlaidMLで1Epochあたり12秒、ROCm環境下のtensorflowで1Epochあたり8秒と、ROCm環境の方が良い結果となった。

cifar10_resnet.py

version = 1、batch_size=128、depth=50、learning rate = 0.001で実行。

f:id:noroUE4:20190228040452p:plain
PlaidMLでcifar10_resnetを実行
f:id:noroUE4:20190228042740p:plain
ROCmでcifar10_resnetを実行
Win10上のPlaidMLで1Epochあたり200秒前後、ROCm環境下で55秒前後と、mnistの場合よりも大きな差でROCm環境が良い結果となった。
また、メモリ使用量もPlaidMLで5.6GB、ROCm環境で1286MBと、PlaidMLではビデオメモリをより多く消費するようだ。
f:id:noroUE4:20190228041716p:plain
PlaidMLでのVRAM消費量
f:id:noroUE4:20190228041735p:plain
ROCm環境でのVRAM消費量

ちなみに、RX470とGTX1060 3GBの比較は先日の記事参照。
noroue4.hatenablog.com

結論

kerasを使ったコードがそのまま動くし、CUDAやROCmの専用環境を用意するより導入が簡単で、OpenCLを利用するので汎用性があり、AMDGPUMac環境などでも使いやすいのが利点?
ただ、(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

とコマンドする。