RstanにDockerはいいゾ

この記事は,Stan Advent Calendar 20192日目の記事です。

昨年もDockerで記事を書いたのですが,実は思ったよりDockerは活用されてないぞと思うことが何度かありました。そこで,今年もDockerについて書きます。

今年は,MacOSのCatalinaがリリースされました。Catalinaでは色々と新機能が追加されたので,ワクワクとした気持ちで試したMacユーザーも多かったのではないでしょうか?しかし,CatalinaにアップグレードするとStanが動作しないという問題があり,軽い気持ちでアップグレードしたStanユーザーを絶望の淵に追い込みました(Stan Advent Calendar 2019の1日目のkosugittiさんの記事でその辺の経緯がまとめられています)。こういう時こそ,以下のStan公式のツイートにあるように,Dockerなどの仮想コンテナを使っていると安心です。

ただ,Dockerがどのように便利か説明しても,Dockerの仕組みを説明しても,あんまり活用されない気がします。おそらく,新しい技術の導入かかる時間的・認知的コストを考えると,現状で困ってないので,Docker使わなくてもいいかなという判断になるのではないかなと思います。今,少しギクッとした方は,ぜひとももう少し読んでください。

以下に紹介するようにやれば,MacユーザーがDockerのデスクトップアプリをインストールするところから,StanでEight Schoolsを実施するまでに10分もかかりません*1。試して失敗したところで,MacOSのアップデートのような他のソフトへに影響もありません。Twitterで無駄に浪費する10分を私にいただいて,試してみませんか?

さあスタートです(ストップウォッチスタート)。docker hubにアクセスしてください! f:id:cpp-laboratory:20191126150041p:plain

Sing up for Docker Hubをクリックします!そして,必要事項を入力します(IDとかメールとかパスワードとかです)。

f:id:cpp-laboratory:20191126150149p:plain

登録したらメールとか届くので確認します。Docker hubにログインします。

f:id:cpp-laboratory:20191126150425p:plain

ログインしたら,どこかに「Download Docker Desktop」があるので探してクリック,以下のようなページに移動して,「Download Docker Desktop for Mac」が出てくるのでクリックします。Docker Desktopのダウンロードが始まります。

f:id:cpp-laboratory:20191126150513p:plain

ダウンロードしたものをダブルクリックしたりして,以下のような状態までもっていって,アプリケーションフォルダにコピーします。

f:id:cpp-laboratory:20191126150532p:plain

アプリケーションフォルダのDocker Desktopアプリをダブルクリックします。

f:id:cpp-laboratory:20191126150602p:plain

Macの右上のメニューバーでDockerがもぞもぞ動いています(開始しています)。落ち着いたら,クリックしてみると,Sing inってのがあるので,そこをクリックして,先程作ったDocker hubのアカウントを追加します。

f:id:cpp-laboratory:20191126150626p:plain

ここまでDocker Desktopの準備で5分ほどかかりました。とはいえ,普通のアプリのインストールと変わらないかと思います。

続いて,ターミナルを起動します。なんか黒い画面が出てきて「怖いな,怖いなあ」と思うかもしれませんが,1行コードを打つだけなので我慢してください。

f:id:cpp-laboratory:20191126150648p:plain

今回は,Rstanやその他色々とパッケージの入ったykunisato/paper-r-jpを使います(私が準備したDocker コンテナです)。これ1つあれば,大体のことはできます。その他にもコンテナは用意しているので,適宜好きなものを使用ください。一応解説は,ykunisato/paper-r-jpにも書いてありますが,以下をターミナルに打ち込むだけです(パスワードとコンテナ名は好きなものを使ってください)。

docker run -e PASSWORD=パスワード -p 8787:8787 -v $PWD:/home/rstudio -d --name コンテナ名 ykunisato/paper-r-jp

例えば,以下のようにパスワードとコンテナ名を変更します(パスワードをpass,コンテナ名をpaper)。なお,パスワードはちゃんとしたのを設定ください。

docker run -e PASSWORD=pass -p 8787:8787 -v $PWD:/home/rstudio -d --name paper ykunisato/paper-r-jp

f:id:cpp-laboratory:20191126150706p:plain

しばらく待ちます。まあまあ重いファイルをダウンロードするので,すごい遅い回線だと時間かかります(それで10分超えちゃうかも・・・)。以下のような感じになったら終了です。これですでにRstanの入ったRstudio serverのDockerコンテナが走っています。

f:id:cpp-laboratory:20191126150723p:plain

ご自身のインターネットブラウザ(Chromeとか)を開いて,http://localhost:8787/ と打ち込んでください。以下のようなRstudioのログイン画面が出てくるので,Usernameに"rstudio",Passwordに上記で設定したパスワードを入れてください。

f:id:cpp-laboratory:20191126150741p:plain

さあ,ちゃんとRstanが動くか調べてみましょう!RStan Getting Startedで使われるEight Schoolsが動作するか以下をConsoleにコピペしてみましょう。

library(rstan)
# check compiler
fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , '
  return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
' )
fx( 2L, 5 ) # should be 10

# model
smodel <- 'data {
  int<lower=0> J; // number of schools 
real y[J]; // estimated treatment effects
real<lower=0> sigma[J]; // s.e. of effect estimates 
}
parameters {
real mu; 
real<lower=0> tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] = mu + tau * eta[j];
}
model {
target += normal_lpdf(eta | 0, 1);
target += normal_lpdf(y | theta, sigma);
}'
schools_dat <- list(J = 8, 
                    y = c(28,  8, -3,  7, -1,  1, 18, 12),
                    sigma = c(15, 10, 16, 11,  9, 11, 10, 18))
fit <- stan( model_code= smodel, data = schools_dat, 
            iter = 1000, chains = 4)
plot(fit)
print(fit)

終わりました!10分もかからず,9分程度で,Dockerの準備からRstanの実行までいけました!簡単でしょう?

f:id:cpp-laboratory:20191126150824p:plain

継続的にDockerを使う場合は,あと何個かDockerのコードを覚える必要がありますが(コンテナの開始・中止・削除など),それはまた今度にします。

10分以内でのRstan環境の構築,お試しいただいてはいかがでしょうか?

Enjoy!

*1:なお,ユーザーの多いWindows版も準備しようかと思いましたが,私がWindowsのPCを持っておらず,仮想環境でやってみたらすごく作業にイライラしたのでやめました。