🐍

WindowsマシンでPyStan3.2.0を使う

2021/06/27に公開

最近ベイズモデリングの勉強をしており、最初はNumpyroを使っていたのですがStanも使ってみたいなと思いStanを導入を試みました。

PythonからStanを触るにはPyStanが必要なのですが、最近3.Xに上がったPyStanの情報が少なく少し大変だったので備忘録を兼ねて。

はじめに

この記事で導入するのは pystan==3.2.0 です。

PyPl を見るとpystan==3.2.0には大きく2つの要求があります。

  1. 動作環境はLinux, MacOSのみ(Windowsは非対応!
  2. 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導入

  1. gccをインストール
    Dockerイメージによってはすでに入っているかもですが一応
sudo apt install build-essential

Ubuntu20.04であればgcc>=9.0が入ると思います。

  1. Cythonをインストール
    PyStanを入れる前にCythonを入れる必要があるようなので入れます。
    (Cythonを入れずにやってないので本当に必要かは分からないです..!)
poetry add cython
  1. PyStan 3.2.0 をインストール
poetry add pystan==3.2.0
  1. (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

https://pypi.org/project/pystan/
https://nigimitama.hatenablog.jp/entry/2021/03/31/214805
https://discourse.mc-stan.org/t/pystan-3-beta-4-released/18938

Discussion