RstanにDockerはいいゾ
この記事は,Stan Advent Calendar 20192日目の記事です。
昨年もDockerで記事を書いたのですが,実は思ったよりDockerは活用されてないぞと思うことが何度かありました。そこで,今年もDockerについて書きます。
今年は,MacOSのCatalinaがリリースされました。Catalinaでは色々と新機能が追加されたので,ワクワクとした気持ちで試したMacユーザーも多かったのではないでしょうか?しかし,CatalinaにアップグレードするとStanが動作しないという問題があり,軽い気持ちでアップグレードしたStanユーザーを絶望の淵に追い込みました(Stan Advent Calendar 2019の1日目のkosugittiさんの記事でその辺の経緯がまとめられています)。こういう時こそ,以下のStan公式のツイートにあるように,Dockerなどの仮想コンテナを使っていると安心です。
Mac users: upgrading to Catalina can break Stan 😟🔥 We strongly advise against updating. If you already updated, follow the thread at https://t.co/ST6OAD40r6 for possible workarounds 🧯(so far only working through Docker seems to consistently help). Sorry for the inconvenience.
— Stan (@mcmc_stan) 2019年10月23日
ただ,Dockerがどのように便利か説明しても,Dockerの仕組みを説明しても,あんまり活用されない気がします。おそらく,新しい技術の導入かかる時間的・認知的コストを考えると,現状で困ってないので,Docker使わなくてもいいかなという判断になるのではないかなと思います。今,少しギクッとした方は,ぜひとももう少し読んでください。
以下に紹介するようにやれば,MacユーザーがDockerのデスクトップアプリをインストールするところから,StanでEight Schoolsを実施するまでに10分もかかりません*1。試して失敗したところで,MacOSのアップデートのような他のソフトへに影響もありません。Twitterで無駄に浪費する10分を私にいただいて,試してみませんか?
さあスタートです(ストップウォッチスタート)。docker hubにアクセスしてください!
Sing up for Docker Hubをクリックします!そして,必要事項を入力します(IDとかメールとかパスワードとかです)。
登録したらメールとか届くので確認します。Docker hubにログインします。
ログインしたら,どこかに「Download Docker Desktop」があるので探してクリック,以下のようなページに移動して,「Download Docker Desktop for Mac」が出てくるのでクリックします。Docker Desktopのダウンロードが始まります。
ダウンロードしたものをダブルクリックしたりして,以下のような状態までもっていって,アプリケーションフォルダにコピーします。
アプリケーションフォルダのDocker Desktopアプリをダブルクリックします。
Macの右上のメニューバーでDockerがもぞもぞ動いています(開始しています)。落ち着いたら,クリックしてみると,Sing inってのがあるので,そこをクリックして,先程作ったDocker hubのアカウントを追加します。
ここまでDocker Desktopの準備で5分ほどかかりました。とはいえ,普通のアプリのインストールと変わらないかと思います。
続いて,ターミナルを起動します。なんか黒い画面が出てきて「怖いな,怖いなあ」と思うかもしれませんが,1行コードを打つだけなので我慢してください。
今回は,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
しばらく待ちます。まあまあ重いファイルをダウンロードするので,すごい遅い回線だと時間かかります(それで10分超えちゃうかも・・・)。以下のような感じになったら終了です。これですでにRstanの入ったRstudio serverのDockerコンテナが走っています。
ご自身のインターネットブラウザ(Chromeとか)を開いて,http://localhost:8787/ と打ち込んでください。以下のようなRstudioのログイン画面が出てくるので,Usernameに"rstudio",Passwordに上記で設定したパスワードを入れてください。
さあ,ちゃんと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の実行までいけました!簡単でしょう?
継続的にDockerを使う場合は,あと何個かDockerのコードを覚える必要がありますが(コンテナの開始・中止・削除など),それはまた今度にします。
10分以内でのRstan環境の構築,お試しいただいてはいかがでしょうか?
Enjoy!