WindowsマシンでPyStan3.2.0を使う
最近ベイズモデリングの勉強をしており、最初はNumpyroを使っていたのですがStanも使ってみたいなと思いStanを導入を試みました。
PythonからStanを触るにはPyStanが必要なのですが、最近3.Xに上がったPyStanの情報が少なく少し大変だったので備忘録を兼ねて。
はじめに
この記事で導入するのは pystan==3.2.0
です。
PyPl を見るとpystan==3.2.0
には大きく2つの要求があります。
- 動作環境はLinux, MacOSのみ(Windowsは非対応!)
- C++のコンパイラが必要(gccなら9.0以上)
はい。WindowsマシンにPyStanを導入するには何か工夫が必要そうです。
考えられる手段は下記のような感じでしょうか。
-
WSL(Windows Subsystem for Linux)上にPyStanを導入する
これがシンプルでよさそうなのですが、上記2つ目の要求「gcc>=9.0
が必要」の点で面倒そうだったのでやめました。(私のWSLのgccは7.5でした。) -
WSL上のDockerコンテナにPyStanを導入する
Ubuntu20.04でgccを入れるとデフォルトで9.Xが入るので、今回はこの方法でPyStanを導入しました。(WSLはUbuntu18.04なのでDockerを使います。) -
PyStanをあきらめてRStanを使う
Rの方がStan周りのライブラリ、情報ともに充実してそうなので、これもありかと思います。(私は宗教上の理由でやめました)
という訳で、この記事では2つ目の 「WSL上のDockerコンテナにPyStanを導入する」方法で説明します。
WSLへのDocker導入含め、Docker周りのことはこの記事には書いていません。
WSL上のUbuntu20.04コンテナでの導入手順となります。
PyStanを導入した環境について
- OS:
Ubuntu20.04
- PyStanバージョン:
3.2.0
- Pythonバージョン:
3.8.6
- gccバージョン:
9.3.0
- Pythonのパッケージ管理には
Pyenv + Poetry
を使用
パッケージインストールの際、poetry add XXX
としていますが、お使いの環境に応じて
pip install XXX
や
conda install XXX
としてください。
PyStan導入
- gccをインストール
Dockerイメージによってはすでに入っているかもですが一応
sudo apt install build-essential
Ubuntu20.04であればgcc>=9.0
が入ると思います。
- Cythonをインストール
PyStanを入れる前にCythonを入れる必要があるようなので入れます。
(Cythonを入れずにやってないので本当に必要かは分からないです..!)
poetry add cython
- PyStan 3.2.0 をインストール
poetry add pystan==3.2.0
- (JupyterでPyStanを使うなら) nest-asyncio をインストール
詳細は後述しますが、JupyterLab等を使うのであればインストールが必要です。
poetry add nest-asyncio
Jupyter上でPyStanを使う際の注意
PyStan3.2.0をJupyter上で使う際は次のように、pystanのインポートの前に呪文が必要です。
でないとモデルをビルドできません。
import nest_asyncio
nest_asyncio.apply()
import stan
簡単ですが、PyStan導入については以上です。
PyStan3.2を使ってみての感想ですが、モデルの記述は分かりやすいと思いますが、MCMCサンプリング後のオブジェクトの扱いがやや不便かなと思いました。(Numpyroに慣れているからかもしれません)
それとPyStan3.Xは最近リリースされたこともあって、可視化ツールのArvizの対応が追いついておらず一部の関数でエラーになります。
参考URL
Discussion