2012年12月7日金曜日

複数のRやWinBUGSを同時に使用する(多重起動)

RやBUGSで計算時間の掛かる作業をしていると、Rが塞がってしまい、その間にRを用いた他の作業ができなくなります。とくにBUGSは数時間〜数日掛かりの計算が当たり前なので、時間的制約が大きな問題でした…。

ところが、じつはひとつのマシンで複数のRやWinBUGSを同時並行で使用(多重起動)が可能なんですね…今日はじめて知りました。私にとっては衝撃的な事実で、早く知っていれば、いったいどれだけの時間を節約できたのだろうかと愕然としています。パンドラの箱を開けた気分です…

ここで紹介するのはMacOSXでのやり方です。
(2013.07.16 追記:Windows版では単にRのアイコンを何度もクリックすれば多重起動できることを知って愕然…Winユーザにとってはこんなに簡単なことだったのですね)
cf. Mac上でWinBUGSを使用する方法はこちら


以下に手順を示します(原則、どんなアプリでも多重起動できるはずです)。

*常套手段ではないかもしれないので、使用の際には自己責任でお願いします。
*多重起動により"落ちやすくなる"というご指摘もいただいています。

1)アプリケーション → ユーティリティ→ ターミナル.app を選択し立ち上げる。

2)ターミナルの画面上で、$(ドルマーク)のすぐ後ろに下記のコードを打ち込み、リターンキー。

open -n /Applications/R64.app    # 64bit版の場合
open -n /Applications/R.app        # 32bit版の場合

*注:-n の後ろには半角スペースを入れるのをお忘れなく
*ちなみに、単にopen /Applications/R64.app とやると、Rが普通に起動する。

3)Rを立ち上げたい数だけ、同じコマンドを繰り返し打ちリターンキー。これで多重起動します。

* -n を付加すると、二回目以降が多重起動になるということです。

4)さらにWinBUGSを多重起動するには、多重起動させた各RからそれぞれR2WinBUGS経由でWinBUGSを呼び出すだけでOKです。MacOSX版なのでX11上のwine(WindowsアプリをUNIX上で動作させるのに使用しているアプリ)を通じて起動しますが、X11上のウィンドウもRの数だけ開かれます。

# なんだか変な感じです…(戦隊物のようだ!)。下に白のライトが当たっているのが起動中のアプリを示します。ちなみに、XマークはUNIXのGUI環境(?)、X11、こちらもRの数だけ立ち上がっていますが、アイコンは一つだけでした。複数立ち上がっているのは、X11でなくwineだからなのでしょう。

(2013.02.14 追記)ターミナルで単に r と打つとRを起動させることができますが、ターミナルを複数ウィンドウ(または複数タブ)開いて、それぞれでRを起動させれば同じように多重起動できました。


次に気になるのが、複数起動による計算速度の低下ですが、簡単な例で調べてみました。
こちらに挙げているサポート関数を用いて、全く同一のWinBUGSの計算を同時並行で実行した際の計算時間を system.time() 関数で調べたものです。WinBUGSとR2WinBUGS使用のサポート関数wbugsにsystem.time()を内蔵させているので、これを利用しました(cf. 作って放ったらかしていたら昨日プログラミングのミスを発見し慌てて修正、現在どんどん実用開始していますが今度こそノートラブルになったと思います^^;)。

# 使用マシン
iMac 2.93 GHz Core i7 (Quad Core) 、メモリ 8GB 1333 MHz DDR3

# 使用コード
source("WBUGS.R")

X <- c(1:100)
Y <- rnorm(100, mean=(3 + 2*X), sd=1)
data <- list(X=X, Y=Y)
parms <- list(a=0, b=0, tau=1, F, sigma=NA) 

model <- function() {
   a ~ dnorm(0, 1.0E-6)
   b ~ dnorm(0, 1.0E-6)
   tau ~ dgamma(1.0E-2, 1.0E-2)
      for (i in 1:100) {
         Y[i] ~ dnorm(mean[i], tau)
         mean[i] <- a + b*X[i] }
   sigma <- 1/sqrt(tau)
                                  }

wbugs(data, parms, model, n.iter=1100000)

# 同時並行で計算したRとWinBUGSの数をX軸に、system.timeの返り値(秒、userのところの値を使用)をY軸に取り、glm(Y ~ X, family=gausiaan("log")) による推定曲線を描いたものです。計算回数がえらく不揃いですがご容赦、生物データでないのでテキトーです。
# Quad Core なので、4と8で階段上に変化するかと思いきや、意外と直線的。


とはいえ、この程度のデータならメモリ使用量も少ないからなのでしょう。データや推定するパラメータ数によってこの速度は相応に変化すると思われます。


ちなみに、このテスト中のCPUとメモリの使用量はこんな感じでした。
(「ユーティリティ」→「アクティビティモニタ」)
まだまだ余裕がある感じです。ちなみに、うちの環境ではwineのCPU負荷は、計算内容に関わらずいつも約90%台です。Rの使用しているスレッドが8というのは、Core i7だからQuad x 2 = 8という意味でしょうかね。wineがなぜか7ですが(残りの1は??)。

なお、いくつかのマシンで試して気づいたのですが、X11はXQuartzにアップグレードした方がwineのCPU負荷が少し抑えられているように見えます。いや、気のせいか…

ちなみに、アクティビティモニタを見る限り、wineってまだ64bit化されていないようですね。(2013.01.31追記)wine wikiによると、大半のWindowsアプリが依然32bitなので、wineも32bitを標準としているとのこと。それに32bit版のWindows OSってメモリをたったの4GBまでしか認識できないのですね…

0 件のコメント:

コメントを投稿