snowパッケージを使ってrandomForestを並列化

通常と並列化の比較

通常のランダムフォレスト

library(randomForest)
library(kernlab)

data(spam)
set.seed(777)
system.time(fit.rf<-randomForest(type~.,data=spam,ntree=1000))
ユーザ システム 経過
21.584 0.213 21.919

並列化のランダムフォレスト

library(snow)
cl <- makeCluster(4,type="SOCK")
invisible(clusterEvalQ(cl,{
        library(randomForest)
        library(kernlab)
        data(spam)
    }))
set.seed(777)

print(system.time(fit.rf <- clusterApply(cl,rep(250,4),function(ntree) randomForest(type~.,spam,ntree=ntree))))
fit.rf.all<-do.call("combine",fit.rf)
stopCluster(cl)
ユーザ システム 経過
0.053 0.036 11.525

並列化方法解説

他のプロセスでもライブラリや変数を利用するために通常の読み込みとは別に事前準備が必要となる。また、関数内で並列化を行う場合引数を利用することはできない(引数はclusterExportすることができない)。

cl <- makeCluster(4,type="SOCK")

アクティビティモニタを利用するとプロセスが4つになっていることが確認できる。 use_snow.png

  • ライブラリなどの読み込み
invisible(clusterEvalQ(cl,{
    library(randomForest)
    library(kernlab)
    data(spam)
})))
  • 変数の利用方法
clusterExport(cl,"value1")
stopCluster(cl)

エラーなどによって正常に終了することができなくて放置すると memory_snow.png

一度Rを終了させればリセットされる。

参考資料