2012年12月7日金曜日

MacOSX(10.6, 10.7)上でWinBUGS(Wine、R2WinBUGS使用)


WinBUGSによるMCMC推定用に使っていたWindowsマシンがお亡くなりになり、急遽必要に迫られて(台数も確保したかったので)Mac上で動かすことに挑戦した(GeoBUGSを使っているのでJAGSではダメ。それに8/2現在R2.15.1ではJAGSが動作しない?エラーメッセージを読むとR2.14で使用してくれといっているようだ)。

ネット上でよく見る手順は省略があるのか、実際はもっと沢山のステップを要したし、かなり厄介な作業だった。OSX10.7、10.6の両方で計3台でのインストールに成功して手順も大体分かってきました(OSX10.8でのインストール手順はこちら)。

手順としては、まず、MacPortsを入れ、MacPortsを用いてWine(非Windows OS上でWin専用アプリケーションを実行する環境)をインストール、Wineのディレクトリ内にWinBUGSをインストールするという流れです。

インストール作業はターミナルからUNIXコマンドを打ちながらのもの。sudoなどのコマンドは注意深く扱う必要があるようなので、チャレンジする際には慎重に。またXcodeもソフトウェア開発に使うような類のツールなので取り扱い注意です。参考にする際は、この辺りを理解の上、自己責任でお願いします…。

(下記、Rコードは緑、ターミナルのコードは紫にしてみます)


****************************
0)準備。今回の使用環境(いずれか):
・2010年頃購入のiMac、MacOSX10.7.4、X11 または XQuartz、Xcode4.3(Apple)、Command Line Tool(Xcodeの追加機能? Xcodeの環境設定 → Downloadsパネルから入手可能)、RパッケージのR2WinBUGS
・2010年頃購入のiMacとMacBookAir、OSX10.6.8、X11 または XQuartz、Xcode3.2.6(Xcode3.2はOSX10.6のinstall DVDのオプションインストールの中にあるはず(アプリのDVDではなく)。さらにソフトウェアアップデートで最新にしています)、なお10.6用のCommand Line Toolは無い(10.7ではXcodeの機能をCommand Line Toolに分割している模様)。

1)まずはMacPortsをインストールする。OSXのバージョンによって細かくインストールファイルが分かれている。
自身のMacのOSに合わせてインストーラを選ぶ。
http://www.macports.org/install.php # ダウンロードサイト
MacPortsとは、紐付けの多いUNIXのアプリのインストールを補助してくれる便利なツール。

2)インストールしたら「アプリケーション」→「ユーティリティ」にある「ターミナル」を立ち上げる。
すると、冒頭にこのように出ている。

コンピュータ名:~ ユーザ名$

このドルマーク $ の後にコマンドを打っていく。
なお、インストールに関わるところでパスワードを求められるが、その都度、自分のアカウントのパスワードを入れる。
(以降、パスワードを入れる作業は説明を省略)

念のため、MacPortsを最新版にしておきましょう(さっそくターミナルで次のコマンドを打つ)。

sudo port -v selfupdate

(もしうまくいかないようならば、/opt/local/bin/port -v 、さらにターミナルを再起動させたらコマンドが通ったという情報をいただいています)

3)では、下記の1行を打つ(コピペでOK)。Web上では改行されて見えているだろうけれど、この長いコードは1行で打つべきもののようだ。

echo export PATH=/opt/local/bin:/opt/local/sbin:\$PATH$'\n'export MANPATH=/opt/local/man:\$MANPATH | sudo tee -a /etc/profile

これはMacPortsのパスを通す作業であるようだ。

このパスが無事に通ると、下記のメッセージが出る。
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/man:$MANPATH


4)その次は、このコードを通す。こちらも改行無しで。

if [ `sysctl -n hw.cpu64bit_capable` -eq 1 ] ; then echo "+universal" | sudo tee -a /opt/local/etc/macports/variants.conf; else echo "not 64bit capable"; fi

マシンが64ビットなのか、そうでないのかをMacPortsに伝える作業らしい。
たぶんダウンロードするインストーラの選択に必要なのだろう。
+universal または not 64bit capable というメッセージが帰ってくればOKのはず。

# ここまでの作業はこちらのサイト(http://www.davidbaumgold.com/tutorials/wine-mac/)が非常に参考になりました。


5)次、MacPorts経由でWineと依存パッケージのインストールを行う。

sudo port install wine 

実行すると、2時間くらい本体+依存パッケージをインストールしているので席を離れて待つべし。

たぶん、一回目はインストールが完全には成功しない(OSX10.7では一発で完了するかもです)。
こんなエラーメッセージが出た。
Error:The following dependencies were not installed:…..
(中略)
Error:Processing of port wine failed
wine本体のインストールまで到達せず。

6)インストール順による食い合わせの問題だと邪推して、再度…

sudo port install wine

…と打ってみたところ、さっきインストールできなかったファイルが一通りインストールできた模様。
今度は10分くらいでインストール終了した。
Installin wine @1.4.1_0
Activating wine @1.4.1_0
(中略)
No broken files found.
最後にWineがインストールされ、無事に成功したという意味なのだろう。


7)(取りこぼし?)下記のコマンドを通す。
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist


8)もうひとつ、取りこぼしを除去(よく見るとWineのインストール中に、これはデフォルトでは入らないから入れたければこのコマンドで入れてねみたいなメッセージが出ている)
sudo launchctl load -w /Library/LaunchDaemons/org.freedesktop.dbus-system.plist
launchctl load -w /Library/LaunchAgents/org.freedesktop.dbus-session.plist


9)次、以下のコマンドを打つ。

winecfg

しばらく処理音が聞こえた後、X11からWineの環境設定のようなウインドウが表示される。
単に一番下のOKをクリックすればよい。
ターミナルにはエラーメッセージがいくつか出ているが気にしなくてよい。


10)次、ホームディレクトリ(OSXでいわゆる各ユーザのホーム階層)にWinBUGS14.exeを置いた上で…

wine WinBUGS14.exe

と打つと、ブルースクリーン上に通常のWinBUGSのインストール画面が表れるので、順を追ってインストール作業を進める。
普通に、はい、はい、と次々に進めていけばよい(Windowsでのインストール手順と同様ということ)。
インストールが終了すると画面が閉じる。
(cf. 私は最初、まちがえて.zipバージョンを展開しようとして、中途半端に展開され、patchやkeyを当てることができずに困惑した。皆さまはお間違いなく)


11)次、WinBUGSをアップデートするためにWineから起動する。

wine ~/.wine/drive_c/Program\ Files/WinBUGS14/WinBUGS14.exe


12)WinBUGSのアップデート手順は、Windowsの場合と同じ。
Fileからパッチやkeyのファイルを開き(ホームディレクトリに置くのが一番わかりやすいだろう。ファイルの種類をTextにすると出現する)、Tool → Decode → Decode all。Decode allしても黙って通されたりする(なんかのディレクトリがないので作ってもいいか?と聞かれる場合もある)。
Key適用後、WinBUGSを終了させる。

cf.
open ~/.wine # WinBUGSのインストールされたディレクトリは不可視フォルダになっているが、このコマンドで開くことができる


13)RからWinBUGSを実行する。下記のような単純なサンプルコードで試してみる。Wineを経由するので、bugs()内にそのためのコードがたくさん必要。

# R2WinBUGSのインストールをお忘れなく
library(R2WinBUGS)
# 真の値は、a=3, b=2, sd=1
X <- c(1:100)
Y <- rnorm(100, mean=(3 + 2*X), sd=1)
data <- list(X=X, Y=Y)
inits <- function() list(a=0, b=0, tau=1) 
parameters <- c("a", "b", "sigma")

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)
}
modelpath <- file.path(tempdir(), "model.bug")
write.model(model, modelpath)

mcmc <- bugs(
data=data, inits=inits, parameters=parameters, model.file=modelpath, 
n.chains=3, n.iter=5000, debug=T,
working.directory=NULL, clearWD=T, useWINE=T, newWINE=T,
WINE="/opt/local/bin/wine", WINEPATH="/opt/local/bin/winepath")

print(mcmc) # ちゃんと真の値(a=3, b=2, sigma=1)が推定できたかチェックしよう

# bugsの中身、いろいろと設定が必要。
# 下記の伊藤さまの記事が非常に参考になりました、感謝!
http://www001.upp.so-net.ne.jp/ito-hi/stat/winbugs.html

# WINE、WINEPATHを設定しないと下記のようなエラーが出た。
以下にエラー findUnixBinary(x = "wine") : couldn't find wine binary file
追加情報: 警告メッセージ:
1: 命令 'which wine' の実行は状態 1 を持ちました
2: 命令 'locate wine | grep bin/wine$' の実行は状態 1 を持ちました


14)まだR上で下記のエラーコードが出るが、これはこちら(http://ggorjan.blogspot.jp/2008/10/runnning-r2winbugs-on-mac.html)によると害のないエラーコードらしい。要は推定計算さえ無事に行われていればよいだろう。今度こそ成功!
err:ole:CoGetClassObject class {0003000a-0000-0000-c000-000000000046} not registered
err:ole:CoGetClassObject class {0003000a-0000-0000-c000-000000000046} not registered
err:ole:CoGetClassObject no class object {0003000a-0000-0000-c000-000000000046} could be created for context 0x3


cf. 数時間〜数日かかるような重い計算をさせるときに、X11上で動作中のWinBUGSの上にカーソールをかざすとカーソールが消えたりする。一見落ちているのかと疑ったが、放って置いたらちゃんと動作していて無事に計算終了した。私のところの環境での一例に過ぎないですが、悲観的にならないよう参考情報として残しておきます。


cf. 初回の立ち上げ時(初めて、RからR2WinBUGSを用いてWinBUGSを立ち上げようとする時)などに、X11からのメッセージで"Wine Monoをインストールさせろ"とか、メッセージが出るかもしれません。基本的にそういうのには素直に従っておけばOKと思います。

cf. なお、.dmgで配布しているバイナリ版のWine最新版(Wine1.4.1)を用いたインストールは私は断念しました。R2WinBUGSから立ち上げようとするものの、以下のようなエラーが出て、解決方法も見つけられず仕舞いです。
wine ports cannot install for the arch(s) 'i386' because dependency apple-gcc42 does not build for the required arch(s) by default and does not have a universal variant


cf. 最初、試行錯誤していた時に、OSX10.6.8のマシンにソース版Wine1.4.1をインストールした場合で生じたケース(たぶん、上の手順通りやれば、この問題は生じない):
err:x11drv:process_attach failed to load libX11.6.dylib: dlopen(libX11….というようなエラーが出た。

Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/usr/x11/lib")

という、コードを推定実行の前に通すとよい(こちらはRのコードです)。
これは、伊藤さまのこちらのページを参考にさせてもらいました
(該当の説明自体はバイナリ版の箇所です)
http://www001.upp.so-net.ne.jp/ito-hi/stat/winbugs.html
Sys.setenv() という関数など思いつくのは私には不可能でした…


cf. Wineのアンインストール(バージョンを上げるときなどに必要かと)
sudo port uninstall Wine

その際には、いったんWineでインストールしたWindowアプリもディレクトリごと全部消して、再度入れ直した方がよいでしょう。
rm -rf .wine

0 件のコメント:

コメントを投稿