LoginSignup
28
33

More than 5 years have passed since last update.

PlaidMLを使ってMacのGPU(AMD)で画像分類を試してみた

Last updated at Posted at 2018-04-13

MacBookにAMDのGPUが搭載されていたのでPlaidMLを使って画像分類を試してみました。
plaidml-demo20.gif

PlaidMLのGitHub: https://github.com/plaidml/plaidml

【環境】
PC: MacBook Pro (15-inch, 2017)
OS: macOS High Sierra(10.13.3)
GPU: Radeon Pro 560 (4GB)
Python3(virtualenv)

まずは手持ちのMacでOpenCLが使えるか確認するためにbrewでclinfoをインストールします

$ brew install clinfo

確認

$ clinfo

大丈夫そうですね

Number of platforms                               1

AMDのGPUを発見

clGetPlatformInfo(NULL, CL_PLATFORM_NAME, ...)  Apple
  clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, ...)   Success [P0]
  clCreateContext(NULL, ...) [default]            Success [P0]
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_DEFAULT)  Success (2)
    Platform Name                                 Apple
    Device Name                                   Intel(R) HD Graphics 630
    Device Name                                   AMD Radeon Pro 560 Compute Engine
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU)  Success (1)
    Platform Name                                 Apple
    Device Name                                   Intel(R) Core(TM) i7-7920HQ CPU @ 3.10GHz
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU)  Success (2)
    Platform Name                                 Apple
    Device Name                                   Intel(R) HD Graphics 630
    Device Name                                   AMD Radeon Pro 560 Compute Engine
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_ACCELERATOR)  No devices found in platform
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_CUSTOM)  <checkNullCtxFromType:2437: create context from type CL_DEVICE_TYPE_CUSTOM : error -30>
  clCreateContextFromType(NULL, CL_DEVICE_TYPE_ALL)  Success (3)
    Platform Name                                 Apple
    Device Name                                   Intel(R) HD Graphics 630
    Device Name                                   AMD Radeon Pro 560 Compute Engine
    Device Name                                   Intel(R) Core(TM) i7-7920HQ CPU @ 3.10GHz

Pythonの環境を用意

$ mkvirtualenv plaidmlPy3 -p python3
Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/python3.6
Also creating executable in /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/ユーザー名/.virtualenvs/plaidmlPy3/bin/get_env_details

PlaidMLをインストール

$ pip install plaidml-keras
Collecting plaidml-keras
  Downloading plaidml_keras-0.3.1-py2.py3-none-any.whl
Collecting six (from plaidml-keras)
  Using cached six-1.11.0-py2.py3-none-any.whl
Collecting keras==2.0.8 (from plaidml-keras)
  Downloading Keras-2.0.8-py2.py3-none-any.whl (276kB)
    100% |████████████████████████████████| 276kB 615kB/s
Collecting plaidml (from plaidml-keras)
  Downloading plaidml-0.3.1-py2.py3-none-macosx_10_10_x86_64.whl (14.1MB)
    100% |████████████████████████████████| 14.1MB 113kB/s
Collecting pyyaml (from keras==2.0.8->plaidml-keras)
  Using cached PyYAML-3.12.tar.gz
Collecting scipy>=0.14 (from keras==2.0.8->plaidml-keras)
  Downloading scipy-1.0.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.4MB)
    100% |████████████████████████████████| 16.4MB 95kB/s
Requirement already satisfied: numpy>=1.9.1 in ./.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from keras==2.0.8->plaidml-keras)
Collecting enum34>=1.1.6 (from plaidml->plaidml-keras)
  Downloading enum34-1.1.6-py3-none-any.whl
Collecting requests (from plaidml->plaidml-keras)
  Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
    100% |████████████████████████████████| 92kB 1.2MB/s
Collecting idna<2.7,>=2.5 (from requests->plaidml->plaidml-keras)
  Downloading idna-2.6-py2.py3-none-any.whl (56kB)
    100% |████████████████████████████████| 61kB 2.0MB/s
Collecting urllib3<1.23,>=1.21.1 (from requests->plaidml->plaidml-keras)
  Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
    100% |████████████████████████████████| 133kB 150kB/s
Collecting certifi>=2017.4.17 (from requests->plaidml->plaidml-keras)
  Downloading certifi-2018.1.18-py2.py3-none-any.whl (151kB)
    100% |████████████████████████████████| 153kB 1.1MB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests->plaidml->plaidml-keras)
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 1.2MB/s
Building wheels for collected packages: pyyaml
  Running setup.py bdist_wheel for pyyaml ... done
  Stored in directory: /Users/ユーザー名/Library/Caches/pip/wheels/2c/f7/79/13f3a12cd723892437c0cfbde1230ab4d82947ff7b3839a4fc
Successfully built pyyaml
Installing collected packages: six, pyyaml, scipy, keras, enum34, idna, urllib3, certifi, chardet, requests, plaidml, plaidml-keras
Successfully installed certifi-2018.1.18 chardet-3.0.4 enum34-1.1.6 idna-2.6 keras-2.0.8 plaidml-0.3.1 plaidml-keras-0.3.1 pyyaml-3.12 requests-2.18.4 scipy-1.0.1 six-1.11.0 urllib3-1.22

PlaidMLの環境をセットアップしていきます

$ plaidml-setup

「y」をタイプ

PlaidML Setup (0.3.1)

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:
   llvm_preview_cpu.0 : LLVM_preview_CPU
   amd_radeon_pro_560_compute_engine.0 : AMD AMD Radeon Pro 560 Compute Engine
   intel(r)_hd_graphics_630.0 : Intel Inc. Intel(R) HD Graphics 630
   opencl_cpu.0 : Intel OpenCL CPU

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

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

PlaidMLで使用できるデバイスIDが表示されます。
AMDのRADEON PRO 560を使用したいので、そのインデックス番号の「2」をタイプ

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

   1 : llvm_preview_cpu.0
   2 : amd_radeon_pro_560_compute_engine.0
   3 : intel(r)_hd_graphics_630.0
   4 : opencl_cpu.0

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

PlaidMLを応援したいので「y」をタイプ! (別にレポートしたくない方は「n」を選択)

Selected device:
    amd_radeon_pro_560_compute_engine.0

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

Enable telemetry reporting? (y,n)[y]:y

/Users/ユーザー名/.plaidmlに設定を保存したいので「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!

サンプルを動かしたいのでクローンします

$ git clone https://github.com/plaidml/plaidbench.git
Cloning into 'plaidbench'...
remote: Counting objects: 296, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 296 (delta 2), reused 5 (delta 1), pack-reused 287
Receiving objects: 100% (296/296), 9.68 MiB | 757.00 KiB/s, done.
Resolving deltas: 100% (141/141), done.

移動

$ cd plaidbench

必要なモジュールをインストールする前に一応内容を確認

$ cat requirements.txt

fmfm

h5py>=2.7.0
plaidml-keras>=0.3.0
onnx-plaidml>=0.3.0

インストール開始

$ pip install -r requirements.txt
Collecting h5py>=2.7.0 (from -r requirements.txt (line 1))
  Downloading h5py-2.7.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.7MB)
    100% |████████████████████████████████| 4.8MB 288kB/s
Requirement already satisfied: plaidml-keras>=0.3.0 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from -r requirements.txt (line 2))
Collecting onnx-plaidml>=0.3.0 (from -r requirements.txt (line 3))
  Downloading onnx_plaidml-0.3.1-py2.py3-none-any.whl
Requirement already satisfied: six in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from h5py>=2.7.0->-r requirements.txt (line 1))
Requirement already satisfied: numpy>=1.7 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from h5py>=2.7.0->-r requirements.txt (line 1))
Requirement already satisfied: keras==2.0.8 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: plaidml in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Collecting onnx>=1.1.0 (from onnx-plaidml>=0.3.0->-r requirements.txt (line 3))
  Downloading onnx-1.1.1.tar.gz (940kB)
    100% |████████████████████████████████| 942kB 1.1MB/s
Collecting click (from onnx-plaidml>=0.3.0->-r requirements.txt (line 3))
  Downloading click-6.7-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 20kB/s
Requirement already satisfied: pyyaml in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from keras==2.0.8->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: scipy>=0.14 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from keras==2.0.8->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: enum34>=1.1.6 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: requests in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Collecting protobuf (from onnx>=1.1.0->onnx-plaidml>=0.3.0->-r requirements.txt (line 3))
  Using cached protobuf-3.5.2.post1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from requests->plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: urllib3<1.23,>=1.21.1 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from requests->plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: idna<2.7,>=2.5 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from requests->plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: certifi>=2017.4.17 in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from requests->plaidml->plaidml-keras>=0.3.0->-r requirements.txt (line 2))
Requirement already satisfied: setuptools in /Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages (from protobuf->onnx>=1.1.0->onnx-plaidml>=0.3.0->-r requirements.txt (line 3))
Building wheels for collected packages: onnx
  Running setup.py bdist_wheel for onnx ... done
  Stored in directory: /Users/ユーザー名/Library/Caches/pip/wheels/40/c3/23/6190428e9a6f136bc0b3f8181b0eda5fcb56124c40b6d38878
Successfully built onnx
Installing collected packages: h5py, protobuf, onnx, click, onnx-plaidml
Successfully installed click-6.7 h5py-2.7.1 onnx-1.1.1 onnx-plaidml-0.3.1 protobuf-3.5.2.post1

ちゃんとインストールされている確認するためにMobileNetを起動してみましょう

$ python plaidbench.py mobilenet

大丈夫そう!

/Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Running 1024 examples with mobilenet, batch size 1
INFO:plaidml:Opening device "amd_radeon_pro_560_compute_engine.0"
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.6/mobilenet_1_0_224_tf.h5
16752640/17225924 [============================>.] - ETA: 0sModel loaded.
Example finished, elapsed: 1.9480268955230713 (compile), 9.947688102722168 (execution), 0.009714539162814617 (execution per example)
Correctness: PASS, max_error: 1.9290237105451524e-05, max_abs_error: 1.0132789611816406e-06, fail_ratio: 0.0

ではでは本題の画像分類に取り掛かりましょう

plaidvisionをクローン

git clone https://github.com/plaidml/plaidvision.git

移動

cd plaidvision/

インストールする内容を確認

$ cat requirements.txt
h5py>=2.7.0
imageio>=2.2.0
Pillow>=4.2.1
pygame>=1.9.3
plaidml-keras>=0.1.0a5
opencv-python>=3.3.0.10

実行

$ python plaidvision.py mobilenet

別ウィンドウが起動します!

Using PlaidML backend.
/Users/ユーザー名/.virtualenvs/plaidmlPy3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
INFO:plaidml:Opening device "amd_radeon_pro_560_compute_engine.0"

その画面をスクショしてみました!

スクリーンショット 2018-04-13 21.06.15.png

ちゃんとwater_bottleと認識されていますね。
スクリーンショット 2018-04-13 21.06.34.png

先ほどmobilenetを指定しましたが他にinception_v3, resnet50, vgg16, vgg19, xceptionのモデルもあるようです。

$ python plaidvision.py xception

CUDAのセットアップを経験した人なら分かると思いますが、非常に簡単にセットアップできた思います。
あと、kerasのバックエンドの置き換えはこれだけみたいです。

import plaidml.keras
plaidml.keras.install_backend()

NVIDIAのGPUじゃなくても機械学習捗りそうですね!
プライベードで画像を集めてkerasを使って作成したデモがあるのでPlaidMLで動いたら別の機会に紹介します。

【ネタ編】

オワカリイタダケタダロウカ?
スクリーンショット 2018-04-13 19.24.41.png

モウイチド...

スクリーンショット 2018-04-13 19.28.26.png

スクリーンショット 2018-04-13 19.29.08.png

だれがトイプードルじゃ!

28
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
33