はじめに
これはJapanese Community for Open and Reproducible Science (JCORS https://osf.io/z4cgu/ )企画のアドベントカレンダー,およびStan Advent Calendarの12月7日の記事です。
JCORSは「オープンサイエンスと科学の再現性」のコミュニティ,Stanは確率プログラミング言語ですが,その二つのアドカレの両方に同じ記事をエントリーしているのは,もちろんこの二つがつながっているからです。
オープンサイエンスと科学の再現性,これは要するに「誰がいつやっても同じ結果が出るのが科学じゃろ」という話です。魔術や占いが,特殊な訓練を受けた(あるいは特別に神様に愛された)人だけが理由もなくすごいことを成し遂げるののに対し,科学は誰でもアクセスできる知識の積み重ねのはずです。もちろん社会環境など個別のケースでは必ず実現できていないこともありましょうが,それは改善すべき問題点であって,科学の目指すところは「オープンで再現できる知識」であるというのは大原則です。
ところで私たちはパソコンを使って分析をしますが,Stan2019のアドカレ初日に私がぼやいたように,その環境がある日突然使えなくなっちゃった,ということがあります。stanはフリーソフトウェアで誰でも使える=オープンですが,OSをアップデートしたら実行できなくなった,パッケージを変えたら計算できなくなった,マシンを変えたら結果が違っちゃった,ということになったら大変です。再現性の方で大問題発生,というわけです。
どうすればいいでしょう?科学者は全員同じPCを使うと言うことにしますか?非現実的ですねえ。同じOSだって使えてないのに!(みんなMacOSにすればいいのに)
同じアプリならいい,という話でもありません。rstanは多くの依存パッケージを使いますから,そこが変わると同じ乱数列が出るとは限りません。OSも,アプリも,依存パッケージも,世界中の人が全員同じものを揃えるなんてできませんよね。
そこでDockerの登場です。Dockerは一言で言えば「環境をワンパックにまとめて共有する」ためのものです。これを使うとさっきの「同じ環境を揃える」ができるようになるのです。なんて素敵!
というところで,「それってなによ,どうしたらいいのよ」について解説してみたいと思います。その前に,RStudioの話を挟みます・・・
RStudioのサーバ版
RStudioって便利ですよね。ただのRだったら使う気にならない人でも,RStudioなら使ってみようかな,と言う気になるのではないでしょうか。Rを飯盒炊爨(キャンプ飯)に例えるなら,RStudioはシステムキッチン,というぐらい環境が整っています。
多くの人は,RStudio Desktop版を使っていらっしゃると思いますが,もうひとつ,Server版というのがあるのをご存知でしょうか。
サーバというのは,平たく言うと「常に電源が入ってるでっけえパソコン」です。皆さんがインターネットを介してウェブサイトにアクセスするとき,そのサイトのページはどこかのでっけえパソコンのなかにファイルがあって,そこに通信回路を経由してアクセスし,ファイル情報をもらったり送ったりしているのです。いつでもどこからでもアクセスできるように,計算能力が高くて電源入れっぱなし。それがサーバ。
で,そのサーバでRStudioが動いている,と考えてください。ユーザはブラウザ(SafariやChormeなど)をつかってそこにアクセスします。ブラウザの画面が開いて,IDとPassを入れるとRStudioの画面が出てくるわけです。
百聞は一見に如かずですね。画面を見ていただきましょう。これがRStudio Desktop版です。
で,こちらがRStudio Server版の画面です。アプリが開いているのではなく,ブラウザの上にアドレスを入れて,ログインして使うものです。
さて,そのほかの使い方はほとんど変わりません。コードを書いて,走らせる。パッケージをインストールするのもRstudio共通のやり方です。ファイルの読み書きは,ファイルがサーバの側にあるので「アップロード」「エクスポート」に変わりますが,それ以外は使っていても別に違和感を覚えるほどではありません。サーバ版はウェブサイトを見るのと同じですから,スマホやタブレットからでも統計計算ができますよ!
このサーバ版,例えば大学や研究機関に用意しておいて,関係者が誰でも計算環境を使えるようにする,というのが一般的な用途でしょう。サーバを使う人は管理人と一般ユーザという役割に分けられますから,管理人のほうがパッケージなど環境を一括管理しておけば,誰にでも同じ分析環境が提供できるというわけです。
そう,そこが今回のポイント。つまり,RStudio Serverを使えば,「誰でも同じ分析環境」になるわけです。サーバの側でrstanを入れておけば,ユーザは全員同じrstan環境。同じrstanのバージョンで分析することになりますね。大学の研究室単位ぐらいであれば,サーバで一括管理した方が安定した運営ができるかもしれません。管理者の負担はあるかもしれませんが,一人一人スペックもOSも違う人にインストールから教えていくことを考えると,圧倒的に楽な使い方です。
とはいえ,世界中の科学者が同じサーバで計算するというのは,これまた話がデカすぎて無理ですね。
そこで間に入ってくれるのが,Dockerちゃんなわけです。
Dockerを使いましょう
Dockerは仮想環境を提供してくれるアプリです。MacであれWindowsであれ,Dockerアプリをダウンロードして,ローカルマシンで実行させておきます。この中に仮想的なPCをつくるのです。Stan2019のアドカレ初日に,仮想環境を作ってそこにOSを入れるのも手,というお話をしましたが,DockerはOSまでいかない,アプリに必要な環境だけをコンパクトに作る,というイメージです。
DockerはなにもRStudioのために生まれたわけではありません。いろんなアプリを開発するときの環境は,様々なパターンが考えられるので,仮想的な環境を作ってそこで試験しましょう,というところから出てきたものだと思います。が,私にとっては,DockerはほとんどRStudioを使うためにしか利用していません。
Dockerの使い方は,Docker用パックにまとめられた環境(コンテナと言います)を読み込んで,その仮想環境内で実行するというものです。もちろん自分でこの環境パックをつくって置いておく,必要な時に順次利用する(例えば論文Aの分析をしたコンテナ,論文Bの分析用コンテナ,というふうに),という方法でも良いですし,誰かが作ってくれた環境をもらってくることもできます。このコンテナの共有を許してくれるのがDocker Hubというもので,インターネット経由で様々なコンテナがオープンに提供されています。Docker IDをつくって,様々なコンテナをためしてみるのもいいでしょう。あ,もちろんフリーソフトウェアなので,DockerのダウンロードやIDの作成に費用は一切かかりません。
Docker経由でRstudio/rstanを使うには,すでにrstanを含んだ環境が提供されていますから,それをもらってくるのが一番楽です。Stanアドカレの二日目の記事をご覧になった方は,Dockerによるrstanの導入に10分とかからないことに驚かれたかもしれません。ここでは,ykunisato/paper-r-jpというコンテナを使っていますね。コンテナを自作するのもそれほど難しくありません。一から作ると面倒ですが,例えば上のコンテナに自分の好きなパッケージを追加したいな,と思った場合,「ykunisato/paper-r-jpを持ってきて,それに***を追加」というコンテナ設計書(Dockerfileといいます)を書くだけでOKです。これはDocker Hubのレポジトリの中に置いてありますから,このコンテナはどんなものを付け加えているんだろう,ということを誰でも確認することができます。
Dockerfileは一行目にFROMというキーワードから始まっています。これが元になるファイル,継承元の情報です。この参照先のものに次々付け加えていくだけで,自分だけのDockerファイル持つくれます。ちなみに「ykunisato/paper-r-jp」は「ykunisato/paper-r」から作られており,「ykunisato/paper-r」は「rocker/verse」というRStudio環境のDockerイメージから作られています。このRStudio環境は,その背後にUbuntuのコンテナがあって,そこでRstudioServerを起動する,という親子関係になっています。つまり,OSごと作り始めるのではなく,Ubuntuの必要最低限のパッケージでRstudioServerを動かす必要最小限の要素をもったコンテナを実行する,ということになります。
自作のコンテナの作り方は,DockerHubにレポジトリ(作業場)を作り,Dockerfileをアップロード,これだけです。あとはCloud上でコンパイルがすすみ,Dockerコンテナを自動的に作ってくれます。このコンパイルに多少時間がかかることと,Dockerファイルにエラーがあればコンパイル失敗となって書き直し&やり直しになりますから,先人たちの書き方をよくみて加筆修正するような形で進めるといいでしょう。
Docker/Rstudio/rstan
DockerにRstudio Serverのコンテナを持ってきて実行すると,ローカルマシンの中に仮想環境ができて,そこでRstudioサーバ版が動くことになります。
この辺りの作業はターミナル(黒い画面!)を使ってやることになりますが,それが終わればサーバが自分のPCの中にいるような形になります。サーバといってもでっけえパソコンですから,自分の(ちっせぇ)パソコンでもソフトが動く原理は同じです。
そこで,自分の環境,これをlocalhostと言いますが,このローカル環境(http://localhost:8787/)にブラウザからアクセスしてやると,RStudioサーバが使えるようになります!
DockerもローカルPC上に走るアプリですから,パソコンのスペックが弱いと計算が遅いんじゃないの?と思う方もいるかもしれません。自分のやってみた感想としては,そこまで遅いと感じない,というところです。もちろん,DockerにどれぐらいもとのPCのスペックを使わせてやるか,設定してやることでその辺は調節可能です(仮想環境にどれほどのスペックを割り当てるかの設定画面,MacOS版が下の図)
何よりも「同じ環境」が再現できることはとてもありがたいことです。科学の基本であるオープン&再現性をしっかり確保できることは大変ありがたく,今後論文などで分析結果を報告する際に「このコンテナを使えば,小数点以下何桁まででもきっちり再現できるよ」というのはありがたいですね。
また,OSのアップデートでstanが走らなくなったー!といった問題に対しても,すでに整えられた環境があれば怖いものなしです。rstanを含むコンテナにはOS環境(の一部)ごと保管されているわけですから,Dockerアプリが走る限りはどんな時でもいつもMCMC(;´Д`)ハアハアできるのです。
OSを一かインストールして環境を作っていく,と言うのは大変ですから,Dockerから初めて,巨人の方に乗せてもらいながら,遥か遠くまで見させてもらおうじゃないですか。
Enjoy!