« Rで株価データを取得 | Home | MicroArray Challenge ヒント3が出てます »
Rで並列処理 (snowライブラリ)
By kmgs | 11 月 28, 2008
snowライブラリ(開発者webサイト、RjpWiki)を用いることでRで並列処理を行うことができるのですが、以前から仕事(Linuxクラスター上でのマイクロアレイデータの統計処理等)ではガンガン使っています。
半年ほど前に確認したときには、snowライブラリはWindowsに対応していなかったのですが、いつのまにか対応したようです。最近ではマルチコアCPUが普及しているため、やや重めの繰り返し処理を手元のPCでサクッと行いたい場合には便利だと思います。
インストールは
> install.packages("snow")で素直に行えるはずです。今回はMPIやPVMまで深入りせず、R単品で動作するSOCKモードをWindows環境で試してみます。
> library(snow)
> cl <- makeSOCKcluster(c("localhost", "localhost"))これで、localhostに2個のノードを割り当てられます。試しにgetwd()でそれぞれの環境のカレントディレクトリを取得してみます。
> clusterCall(cl, getwd) [[1]] [1] "C:/hogehoge" [[2]] [1] "C:/hogehoge"
ちょっとしたベンチマーク。1000行100列 (マイクロアレイデータを想定、行が遺伝子、列がサンプル)のデータを作り、各行に対してWelchのt検定を行ってみます。
> mat <- matrix(rnorm(100000), 1000, 100)
> f <- factor(rep(0:1, each=50))
# 各ノードに変数をエクスポートするには、仕様上グローバル変数にする必要がある。
> g <<- f
> clusterExport(cl, "g")
# 単独ノード
> system.time(apply(mat, 1, function(x) t.test(x ~ g)$p.value) -> c1)
ユーザ システム 経過
3.40 0.01 3.47
# 2ノード
> system.time(parRapply(cl, mat, function(x) t.test(x ~ g)$p.value) -> c2)
ユーザ システム 経過
0.05 0.01 2.00
# もちろん、結果は一致しないと困る
> sum(abs(c1-c2))
[1] 0実行時間は半分とは行かないまでも、それなりに短縮できるようです。実際のマイクロアレイには2-5万くらいのプローブセットが載っているので、単純に見積もって上記の20-50倍程度の時間が掛かります。また、普段はt検定より格段に処理が遅いWilcoxonの順位和検定(coinライブラリのwilcox_test)を使っているので、途方もなく時間が掛かります。
余談ですが、マイクロアレイデータは行が遺伝子、列がサンプルとなっている場合が非常に多いです(一般的には行がサンプル、列が変数)。まあ、慣れてしまえばなんてことはないのですが。
