Stanをインストールするときのエトセトラ

 stanが走らなくなっちゃった

これはStan Advent Calendar 2019の12月1日の記事です。

みなさん,Stanを楽しんでいらっしゃいますでしょうか。色々なツールから利用できるStanですが,私は主にRと連携させたrstanを使っています。もちろんRStudioからです。

ところで,私はMacユーザなのですが,10月初旬にmacOSがアップグレードされました。Catalinaと呼ばれるこの新しいOSは,iPadをセカンドモニタとして使うことができるなど,とても魅力的な新機能が満載!

ということで,サービスが始まってからすぐにアップデートしました。
それが地獄の始まりでした。
rstanのコンパイルが走らなくなってしまったのです。ワォ。

ということで,今回はstanを走らせる環境構築のお話です。これまでいろんなケースでのトラブルを見て来ましたので,解決策のノウハウやTipsを網羅的にご紹介できればと思います。(確率モデルの話はまた今度!)

基本的な仕組みの説明(初心者向け)

WindowsでもMacでも同じなのですが,stanは計算する時に「コンパイル」をします。
コンパイルというのは,我々の言葉を機械にわかる言葉に翻訳するということです。
stanのコードはdataとかnormal(mu,sigma)とか,読んでわかる言葉(高級言語といいます)になっていますが,機械の脳みそは本来0/1のビット演算です。0と1の羅列で情報を処理しています。

我々が機械に計算してもらっているプロセスは,機械とスムーズに会話しているようですが,実はその後ろで機械は人間がわかる言葉を自分なりに翻訳して,計算を実行して,返すときも人間の言葉にして返してきてくれているのです。

Rは計算をお願いしたらすぐに返してくれます。本当に会話しているかのようです。
ところで,Rは一行ずつ実行していきますね。こういうスタイルの言語は,インタプリタ言語と言います。つまり毎回interpret,つまり翻訳しているのです。なので,実は計算に時間がかかります。皆さんも複雑な計算をRにおねがいしたら,お返事がしばらくかえってこないというのを経験したことがあるかもしれません。それは逐次翻訳に手間取っているからかもしれないのです。

これに対して,stanは先に事後分布発生器の設計図を機械ネイティブの言語に丸ごと翻訳してしまいます。この翻訳作業がコンパイルです。コンパイルには時間がかかりますが,先にまとめてやってしまっているので,データを使って乱数発生させるスピードがとても速くなるんですね。

インストールの時に困ること

rstanを始めよう!という時に,インストールしたのにうまく走らない・・・という問題が生じることがあります。rstanそのものはCRANからパッケージとしてインストールするだけで済むのですが,それが使うコンパイラ(翻訳機)の設定が色々必要で,そこの設定がうまくいかなかったりするからです。

この記事では,こうしたインストールする時にありがちな失敗,それをどう回避するかといった Tipsをご案内します。ついでに,MacでCatalinaにしちゃったけどstanが使いたい!という人のための現時点での答えもご案内します。

windowsの場合

私自身はMacユーザですが,仕事柄人に教えているとWindowsユーザに出会うことが多いです。そんなWindowsユーザにrstanを使ってもらうとき,インストール時にトラブルことがありますので,順に事例を挙げていきたいと思います。

ユーザ名が全角

パソコンを買って来て,「あなたの名前を教えてください」といわれると,日本人でしたら素直に「山田 太郎」のように入力しますよねえ,そりゃ。ところがそれがトラップだったりするのです。

機械は0/1のデジタルな情報処理をします。その際,半角英数文字は限られた文字数ですから歴史的にも対応が早かったのですが,日本や中国,その他いわゆるアルファベットでない言語圏だと文字情報も複雑なコーディングで対応することになります。早い話が,全角文字は苦手なのです。

高級言語をコンパイルして機械語にし,機械のよりコアな部分で処理をするときに,この全角文字への対応ができていない箇所が含まれていて「コンパイルできない」となる,ということがあります。

対応策としては,管理人権限を使って半角英数文字からなるユーザを作り直すしかありません。
rstanを使うためだけに別ユーザを作るというのは面倒なことかもしれませんが,今のところこの対応しか私は知りません。
本来OSがこの辺の面倒に対応して,ユーザに気付かないようにしてくれるはずなのですが・・・

もしちゃんとインストールしたのにエラーだった,という場合は,まずユーザ名を確認してみてください。
またこの手のエラーは検索しても出てこないことが多いです(日本ローカルな話で,本家がわざわざ対応してくれない)。
今後,この手の問題は少なくなってくるかもしれませんが,もしかして・・・と可能性の一つとして頭の片隅に置いておくといいかもしれません。

ウイルスソフト

パソコンを使うとウィルス対策ソフトを入れておかないと,怖いですよねえ。
最近はWindows DefenderというOS準拠の対応策がそこそこ優秀で,別にソフトを入れなくても,という話を聞くこともあるのですが,「初心者向けにウィルス対策ソフトを先に入れておきました!」というのが売り文句になっている商品も少なくないので,初心者の方は特に気にしなくても使っている,ということがあるかも。

さて,コンパイルして実行する,というのは上でも触れたように「機械のコアに近いところを触る」作業でもあります。平たくいうと,ちょっと上級者向けの使い方をすることになるのです。ということで,ウィルス対策ソフトが「コンパイルを許さない」という対応をとることがあります。厳しいチェックをするウィルス対策ソフトであれば,Rやrstanのインストールすら許さないこともあるかもしれませんが・・・。

とにかく,ちゃんとインストールしたのに動かない,という場合はウィルスソフトを一旦停止する,ということを考えてもいいかもしれません。また,RやRStudioを実行するときに「管理人として実行」という少し権限の強いユーザとして実行する方が良いかもしれません。

Windowsのメーカ,Microsoftは,良かれと思って権限を付与したり厳しくしたりします。ウィルス対策ソフトもユーザに良かれとおもって検閲してくれるのですが,私たちは自由であることを恐れてはいけません。

Rtools

rstanを実行するためには,コンパイルというステップを経るのですが,これを実行してくれるのがCコンパイラです。Cという用語で書かれた翻訳プログラムという意味です。翻訳プログラムは,CだけでなくC++や,これをフリーソフトウェアにしたg++など,いろいろなものがあります。Windowsユーザは,このコンパイラを入れなければ,rstanだけ入れてもMCMC(;´Д`)ハアハアを実行できないので,このコンパイラを含んだツールボックス,Rtoolsをインストールすることになります。

RtoolsはCRANにありますので,自分のRバージョンにあったRtoolsをインストールするようにしましょう。Rとのバージョンがあっていない場合,問題なくインストールできても実行できないということもあります。

初めてrstanを始める場合は,R,Rtools,RStudioの順にインストールすることをお勧めします。また,必ずしも「常に最新版」である必要はありません。最新版はテスト版であることもあるので,安定したバージョンを使った方が良いことも少なくないからです。

また,Rtoolsをインストールする際に,「パスを通す」という作業があります。 Rtoolsはここにあるよ,という経路を機械に教えてあげるという意味ですが,インストールの時に「パスを通すにチェックを入れてね」という画面が出たら,必ずチェックをするようにしてください。インストールの時はよくわからないので,恐々「Next」を押し続ける,という人もいるかと思いますが,ここをミスるとインストールはできているんだけど,そこにたどり着く経路を機械が知らない,という間抜けなことになってしまいますので,英語でも怖がらずにゆっくりインストールしていきましょう。

バージョンの問題

今年の6月ごろの話ですが,rstanがR3.6では動かない、という現象を目の当たりにしました。こういうこともたまに起こります。
rstanのバージョンとRのバージョンの違いですが,それだけでなくrstanが必要とする依存パッケージのバージョンとの関係などでうまくいかなくなることがあるのです。
この手の問題は時間が解決してくれる,つまりバージョンが上がると修正される問題ですから,一旦バージョンダウンをして安定して動いているものを使うと良いでしょう。バージョンを指定してインストールするには、次のように書くか、


require(devtools)
install_version("rstan", version = "2.18.1", repos = "http://cran.us.r-project.org")

CRANのパッケージサイトからold versionをアーカイブしている場所(https://cran.r-project.org/src/contrib/Archive/rstan/)にいき,圧縮されたパッケージファイルをダウンロードして,ローカルからファイル指定をしてインストールすると良いでしょう。

謎の呪文

rstanはコンパイルする時に「コンパイルの設定はこうしてね」という設定を支持したMakevarsというファイルを経由します。
インストールしてうまくいかなかった場合,次のコードを実行すると,Makevarsファイルがなければ作り,あるんだけど必要なオプション(CXX関係のオプション)設定が書いてなければ追記してくれます。なんだかうまくいかないなぁ,と思ったら一度試してみれば良いかも。


dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR))
dir.create(dotR)
M <- file.path(dotR, "Makevars.win")
if (!file.exists(M))
file.create(M)
cat("\nCXX14FLAGS=-O3 -Wno-unused-variable -Wno-unused-function",
"CXX14 = $(BINPREF)g++ -m$(WIN) -std=c++1y",
"CXX11FLAGS=-O3 -Wno-unused-variable -Wno-unused-function",
file = M, sep = "\n", append = TRUE)

macの場合

さて,今度はMacの場合です。
Macの場合もコンパイラ経由でstanが回るという本質は変わりませんが,コンパイラはRtoolsではなくApple謹製のXcodeという開発者向けツールに入っています。XcodeはApp storeからダウンロードしてください。

Xcodeをインストールしたら,一旦起動してくださいね。そのときにアプリをアクティベートするためのメッセージがでるので,それをクリアしてないと「インストールはしたけどまだ使えません」という状態になります。
ちなみにXcodeは結構サイズがでかいです。これ全体を入れなくても,command line toolsだけあれば行けるんですが,それだけを入れるためにはターミナルで


xcode-select --install

と書けばOKです(ターミナルって何?怖い!と言う人は素直にXcodeを入れましょう)。

ただ今回は,Catalinaにアップグレードした際,このXcodeもアップグレードされました。そのことが関係あるのか,あるいはCatalinaになってファイル操作権限まわりが厳しくなったり,システムファイルの配置換えがあったみたいですからそのせいなのか,とにかくCatalinaにするとコンパイルが通りません!stanができません!なんてこったい。

これ,色々調べたんですが,今日現在でまだ有効な解決策が出てないみたいです。

議論されてるスレッドがこちら>>https://discourse.mc-stan.org/t/dealing-with-catalina/11285/41

これのせいで私も二週間ぐらい色々ウロウロしたり振り回されたりしたのですが,先ほどのスレッドの中で見つけたルートで,なんとか解決できました。

こちらのサイトhttps://github.com/rmacoslib/r-macos-rtoolsにMacOS向けのrtoolsを作っている人がいるのですが,このツールでコンパイラ環境を作り直し,これ
https://discourse.mc-stan.org/t/dealing-with-catalina/11285/198
の最後にあるコード,


cat("CXX14 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1",
"SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/",
file = "~/.R/Makevars", append = TRUE, sep = "\n")

でMakevarsを作り直したら,うまく行きました。このツールの詳細については承知していないのですが,とにかくこれで動くので,苦しんでいる人がいたらとりあえず試してみてください。

Ubuntuの場合

さて,もしかしたら皆さんの中にはUbuntuほかLinux系のOSを使っている人がいるかもしれません。そもそもMacでもWindowsでもないOSに行き着いている時点でそこそこPC玄人だと思います。が,ライトユーザも知ってて損しない話があります。
というのも,Linux系OSにはコンパイラが最初から提供されていることがほとんどで,MacやWindowsのようなコンパイラの相性問題みたいなのがほぼ生じません! 



何それすごい,でもどうやって使ったらいいの,と興味を持ってくれた人には,一旦お試ししてみるのをお勧めします。 自分のPCがいきなり新しい種類のOSになって,使い方も何もわからない状態になったら不安かもしれませんが,なんとPCの中に仮想PCを作って,そこにOSをインストールする方法ってのがあるんですね。 


例えばフリーソフトウェアでVirtual Boxと言うのがあります。これが仮想環境を作るソフトですので,これをインストールしてその仮想PCの中にUbuntuをインストールして使い勝手を試してみると言うのはどうでしょう。 Macユーザの人は,Parallelsという仮想環境アプリが便利です(有償ですが)。このアプリは起動するとそのままUbuntu入れる?と聞いてくれるほど(自分でisoイメージをDLしておかなくて良いぐらい)楽なので,もしWindowsと併用するためにすでにParallelsを入れてるよ,というひとはついでにUbuntuも入れてみてはどうでしょうか。 


これ以上のお話は,この記事の目的から大きく逸れますので,詳しくは「キーワードをヒントに調べてみてね!」というところでご容赦願いたいとおもいますが,Mac/Winでどうにもうまくいかない場合,仮想環境に逃げる,という手もあるよと言うことをお伝えしたかったのです。

別の逃げ道も

ここまで色々な注意点や回避策をお伝えしてきましたが,最後に「もっと別の逃げ道」もお話ししておきましょう。
ひとつは先ほどの仮想PCの応用です。OSごと仮想空間の中に入れるのは大変じゃないか,と思う人もいるかもしれません。この「OS環境ごと変える」まではいかないんですが,そのちょっと手前に「実行環境を丸ごと管理する」という方法があります。そう,それがdockerです。

dockerは手元のOS上で動くアプリですし,そこに最低限必要な実行環境を作る方法ですから,安定して動く環境を用意しておけば,dockerさえ動けばどんなバージョンの環境でも再現することができるのです。この「いろんなバージョンの環境再現」という技術は,開発者の実践的有用性はもちろん,科学者にとって再現可能性を担保するためにも注目されている方法です。 

 特にstan周りでいうと,安定して動くrstanバージョン環境を含んだRStudioServerを手元で再現させることができます。この辺の詳しい話は,Docker Advent Calendarとか再現性Advent Calendarなどに情報が出てくると思います。あるいは明日のStan Advent Calendarもこの話かなと!

もう一つ別の逃げ道。これはOSや実行環境ではなく,もっと目先の問題から逃げる方法。つまり,rstanを使わない方法です!

えー,stanを使うのが目的でしょうが!と思うかもしれませんが,stanはRだけでなく,PythonやJulia,そのほかいろんな言語から使うことができます。 さらにcmdstanを使えば,ターミナル(コマンドライン)からstanを使うことができます。そしてこのcmdstanをrから使うパッケージ,cmdstanrというのがあるのですね。

cmdstanrはrstanのようにコンパイルに関して依存パッケージを経由したりせず,また便利な関数とかもあんまり用意せずに直接的にstanに手を出す方法で,ぶっきらぼうな感じはしますが,使い方はほとんどrstanと変わらずに(stanファイルは同じものが使えます),実行スピードはなんならrstanより速かったりします。

cmdstanについては公式サイトこの記事なんかが参考になります。

windowsにインストールするのは面倒なようですが,MacOSには素直に入りますし,rstanが走らなくてもcmdstanrは走ったりするので,逃げ道の一つとして確保しておいても良いかもしれません。 (ちなみにcmdstanは並列化がまだ実装されてないので,そこまで爆速ってわけじゃないよ)

アドカレ初日から,本質的ではない周辺事情について長々と語ってしまいました。 ほんと,MacOSをアップグレードしてからというもの,仮想環境に逃げたり,cmdstanに逃げたり,別PCに逃げたりと,色々な手法を試しまくりました。その苦労が全くの無駄ではなく,世界のどこかで苦しんでいるstanユーザのためになることを願って・・・

Enjoy!

R
ベイズ塾合宿2019参戦

今年も塾合宿の季節がやってまいりました。会場は浜松!   史上最大規模の,33人が参加。二 …

stan
メソ研初参戦

メソドロジー研究会@別府に参加。 ツイッターでゆるくつながってる、英語系研究者の研究会で、方法論が主 …