PlaidMLを使ってMacでDeep Learning:R編

前回導入したPlaidMLだが,実はRからも使うことができる. PlaidMLがkerasのバックエンドとして動くことは前回説明した通りだが,R用のkerasを導入すれば実現できるというわけだ. これにより,GPUを使った深層学習のためのコードをRで書くことができる.

私のように,PythonよりRの使用頻度が多い人には良いかもしれない.

前準備

まず前準備として,R用のkerasパッケージをインストールする.

インストール方法は普通のRのパッケージと同様に

install.packages("keras")

でOK.

ターミナルからやってもよいし.RStudioからでもよい.

導入方法

Python 2.X系に導入するか,Python 3.X系に導入するかで手順が変わるらしい.

Python 3.X系の場合はかなり癖がありそうだったので,今回はMacでデフォルトのPython 2.X系を利用する.

ただし,anacondaは入っていない前提である.

デメリットとしては,2020年にPython 2.X系のサポート終了が確定しているため,将来性が薄いところか. とりあえずPlaidMLを試したい場合はこちらでよいだろう.

kerasをインストール

先ほどインストールしたパッケージを読み込み,install_keras()コマンドでkerasをインストールする.

library(keras)
install_keras()

すると,ユーザフォルダ直下に.virtualenvsという仮想環境が生成されている.

PlaidMLのインストール

仮想環境.virtualenvsにPlaidMLをインストールする.

まず,仮想環境をアクティベートする.

source ~/.virtualenvs/r-tensorflow/bin/activate

その後,pipでPlaidMLをインストールする.

pip install -U plaidml-keras

インストールが完了したら,以下のコマンドでPlaidMLの環境設定を行う.

plaidml-setup

環境設定については前回の記事を参考に↓

stella-log.hatenablog.com

動かしてみる

さっそく動かしてみよう.

なお,今回の実行環境では外部GPUが無いので, PlaidMLの環境はIntel CPU (OpenCL)を選択した.

library(keras)
library(reticulate)

use_virtualenv("~/.virtualenvs/r-tensorflow")

pml_keras <- import("plaidml.keras")
pml_keras$install_backend()

batch_size <- 128
num_classes <- 10
epochs <- 5
img_rows <- 28
img_cols <- 28
mnist <- dataset_mnist()
x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y
x_train <- array_reshape(x_train, c(nrow(x_train), img_rows, img_cols, 1))
x_test <- array_reshape(x_test, c(nrow(x_test), img_rows, img_cols, 1))
input_shape <- c(img_rows, img_cols, 1)

x_train <- x_train / 255
x_test <- x_test / 255

y_train <- to_categorical(y_train, 10)
y_test <- to_categorical(y_test, 10)

model <- keras_model_sequential() %>%
  layer_conv_2d(filters = 32, kernel_size = c(3,3), activation = 'relu',
                input_shape = input_shape) %>% 
  layer_conv_2d(filters = 64, kernel_size = c(3,3), activation = 'relu') %>% 
  layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
  layer_dropout(rate = 0.25) %>% 
  layer_flatten() %>% 
  layer_dense(units = 128, activation = 'relu') %>% 
  layer_dropout(rate = 0.5) %>% 
  layer_dense(units = num_classes, activation = 'softmax')

model %>% compile(
  loss = loss_categorical_crossentropy,
  optimizer = optimizer_adadelta()
)

model %>% fit(
  x_train, y_train,
  batch_size = batch_size,
  epochs = epochs,
  validation_split = 0.2
)

お,遅い… CPU版なので学習がかなり遅いが,ひとまずなんとか動くことを確認した.

ちなみに, Intel CPU (OpenCL)以外の選択肢であるLLVM_CPUやiGPUを選択するとlossがnanとなってしまい,まともに動かなかった(PlaidMLだとあるあるらしいが…)

RadeonGPUだとちゃんと動くという報告が多いらしいので,今後eGPUを導入したら是非とも試してみたいところである.

まとめ

正直,かなり試行錯誤したので環境がゴチャゴチャになってしまった…

ただ,RでGPUを用いた深層学習ができる,というのはなかなか魅力的ではないだろうか.

今後色々試していきたいので,進展があればまた報告したいと思う.

参考

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

rpubs.com

PlaidML Kerasでやっていく #TokyoR 73

追記(2019.02.02)

最近,PlaidMLの新しいバージョン0.5.0がリリースされた. が,現状私のMacではバックエンド指定時にエラーが出て使えなかった.

同じくエラーが出る人は,PlaidMLのインストールの際に

pip install -U plaidml-keras==0.3.5

として古いバージョンをインストールすると良いだろう.