微忘録

好奇心に記憶力がついていかない人のブログ

R言語の並列処理パッケージ{parallel}について調べて使った

先日2017年度のJapan.Rに参加しました。 運営と参加者の皆様方に感謝しております。
当日の発表内容のなかで印象深かったのが、先日刊行された下記書籍の主筆Kun Renさんの『Boosting R Code Performance』です。

Rプログラミング本格入門: 達人データサイエンティストへの道

Rプログラミング本格入門: 達人データサイエンティストへの道

R言語での高速化」をお題とする発表で、QR法を用いたlm.fit関数、data.table型、そして{Rcpp}パッケージの利用など非常に勉強になりました。

その中で特に興味をもったのが『並列処理』について。今回は高速化の基本であるにも関わらず、無学のままだった『並列処理』について復習したので備忘録。

R言語の並列処理について

基本的にR言語はシングルコア処理にて実行されます。これをマルチコア処理にし、作業分担での高速化を行います。生産管理論における『セル生産方式』のようなものです。

またR言語には様々な高速化パッケージが存在しており、『CRAN Task View: High-Performance and Parallel Computing with R』に代表的なパッケージ類が記載されています。その中から今回は{parallel}パッケージについて備忘録。

{parallel}パッケージを使う

ソケット通信等の環境設定をして、並列処理用の関数を実行するのが一連の流れ。 関数についてはこちらのブログを参考にさせていただきました。

sites.google.com{paralle}lと統合中の{snow}パッケージの関数がほぼ同じなので。

シングル/マルチの処理速度を比較してみる

spamデータを用いたランダムフォレストによる分類」を試します。なお{parallel}パッケージによる並列計算をしない場合とする場合の時間差を、system.time関数で確認・比較します。

並列処理しない場合

library(randomForest) #ランダムフォレスト実行
library(kernlab) #サンプルデータ利用

data(spam) #kernlabからspamデータをロード
set.seed(111) #シード値を固定
ntree = 1000 #木の数を指定

system.time(randomForest(type~., data=spam, ntree=ntree))

   ユーザ   システム       経過  
    16.426      0.121     16.751

並列処理する場合

library(parallel)

#コア数を確認し、ストリーム化ソケット通信を指定
cores <- detectCores()
cl<-makeCluster(cores,type="PSOCK")

#各ノードの評価。ライブラリを各ノードにブート
clusterEvalQ(cl,{
  library(randomForest)
  library(kernlab)
  data(spam)
  })

#クラスターごとの乱数を固定
clusterSetRNGStream(cl,111)

#並列版lapply関数で、各クラスターで計1000本のランダムフォレストを実行
system.time(parLapply(cl,rep(ntree/cores,cores),
                      function(ntree) randomForest(type~.,data=spam,ntree=ntree)))

   ユーザ   システム       経過  
     0.049      0.033      7.178 

約2倍弱の高速化になりました。 約9秒も余裕があるということは、ウサインボルト選手が100m走でゴールするほどの時間を稼げたことになります。

最後に

これで卒論研究がサクサクできる…。Japan.Rに参加して良かった!
Kun Renさん主筆の書籍に加え、こちらの書籍も高速化に非常にお役立ちな書籍でした。

Rによるハイパフォーマンスコンピューティング

Rによるハイパフォーマンスコンピューティング

参照元

parallelパッケージを使ってRandomForestを並列化 - Programming Memo

foreach/parallel: 並行処理 in R - Heavy Watal

snowパッケージで並列化(R) - script of bioinformatics

R: Apply Operations using Clusters

R: Create a Parallel Socket Cluster