CmdStanPy試用記
StanをWindowsで利用するためにCmdStanPyをインストールしたが、動作しなかった。WindowsにインストールしたUbuntu上でCmdStanPyをインストールすると、Ubuntu上では利用できた。以下は、その備忘録である。
なお、WSLでは他のOS、例えばFedoraを試してみることもできる。FedoraをWSLでインストールする方法は、後半で説明している。
1つのOSの下でCmdStanPyによりコンパイルしたとき、コンパイルの結果がファイルに残されている。この状態で、同じスクリプトを別のOSの下でCmdStanPyによる実行を行おうとするとエラーが出る。先のOSの下でコンパイルした結果を削除すれば、エラーは出なくなる。削除するファイル名は、Stanスクリプトファイル名から拡張子を除いたものである。bin_model.stanであれば、bin_modelである。
あるいは、削除せずに、強制的にコンパイルすることもできる。強制的にコンパイルするときは、「force_compile=True」パラメータを付ければよい。例えば、
model =
CmdStanModel(stan_file="bin_model.stan", force_compile=True)
である。強制的にコンパイルすれば、そのとき使用している環境に合わせてコンパイルされ、実行できる。
WindowsへのUbuntuのインストール
WindowsへのUbuntuのインストールについては、このウェブサイトでも説明している。
インストールしたUbuntuにMiniCondaをインストールする。このウェブサイトではAnacondaが説明されているが、MiniCondaも同様である。
UbuntuでのCmdStanPyのインストール
CmdStanPyのインストールの前に、g++が使えることを確認しておく。
Ubuntuの端末において、コマンドg++を入力したときに、入力ファイル名が指定されていませんというようなメッセージが返ってきたらOKである。コマンドg++はありませんというようなメッセージが返ってきたときは、メッセージとともにインストールコマンドも示されているので、それを実行する。簡単なコマンドでg++のインストールができる。
CmdStanPyを、MiniCondaの仮想環境としてmystanという名前の仮想環境を用意して、mystanにCmdStanPyをインストールするときは、次のコマンドを実行すればよい。
(base) yasuh@pcyo:/$
conda create -n mystan -c conda-forge cmdstanpy
仮想環境mystanが作成されたら、次のコマンドでmystanをアクティブにした後、アップデートを行う。
(base) yasuh@pcyo:/$ conda activate
mystan
(mystan) yasuh@pcyo:/$ conda update
--all
アップデートが終了したら、ライブラリarvizを追加インストールしておく。
(mystan)
yasuh@pcyo:/$ conda install arviz
以上の準備で、次のサンプルスクリプトが実行できる。
Stanスクリプトのファイルbin_model.stanと、それを用いてMCMCサンプリングを行うPythonスクリプトのファイルbin_model.pyを同じフォルダ内に作成する。
リスト1 Stanスクリプトファイル(bin_model.stan)
data {
int k;
int n;
}
parameters {
real<lower=0, upper=1>
p;
}
model {
p ~ beta(1,1);
k ~ binomial(n, p);
}
リスト1のStanスクリプトのファイルbin_model.stanを用いるPythonスクリプトをリスト2のように用意した。
リスト2 Stanスクリプトファイルを実行するPythonスクリプト(bin_model.py)
from cmdstanpy import CmdStanModel
import arviz as az
import matplotlib.pyplot as plt
model =
CmdStanModel(stan_file="bin_model.stan") # コンパイル
fit = model.sample(data={'n':10,
'k':7})
# サンプリング
print(fit.summary())
dframe = fit.draws_pd()
# Pandas DataFrameへ変換
print('\nPandas DataFrame
format\n',dframe)
inf_data = az.from_cmdstanpy(fit)
# Arviz(az)用のデータに変換
az.plot_trace(inf_data,
figsize=(10,3))
# トレースプロット
plt.tight_layout()
plt.show()
リスト1とリスト2のスクリプトbin_model.pyの格納されているフォルダにカレントディレクトリを移して、次のコマンドで実行する。
(mystan)
*****/samplefiles$ python bin_model.py
リスト1のStanスクリプトがコンパイルされ(多少時間が掛かる)、実行されると、図1のようにトレース図が表示される。
図1
トレース図の右上のX印アイコンをクリックして閉じると、スクリプトの実行終了となる(図2)。
図2
WSLではいろいろなOSが用意されている。コマンドwsl --list --onlineを実行すると以下のリストが表示される。
PS C:\Users\yasuh> wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe
--install <Distro>' を使用してインストールします。
NAME
FRIENDLY NAME
AlmaLinux-8
AlmaLinux OS 8
AlmaLinux-9
AlmaLinux OS 9
AlmaLinux-Kitten-10
AlmaLinux OS Kitten 10
AlmaLinux-10
AlmaLinux OS 10
Debian
Debian GNU/Linux
FedoraLinux-42
Fedora Linux 42
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
SUSE-Linux-Enterprise-15-SP7 SUSE Linux Enterprise 15 SP7
Ubuntu
Ubuntu
Ubuntu-24.04
Ubuntu 24.04 LTS
archlinux
Arch Linux
kali-linux
Kali Linux Rolling
openSUSE-Tumbleweed
openSUSE Tumbleweed
openSUSE-Leap-16.0
openSUSE Leap 16.0
Ubuntu-20.04
Ubuntu 20.04 LTS
Ubuntu-22.04
Ubuntu 22.04 LTS
OracleLinux_7_9
Oracle Linux 7.9
OracleLinux_8_10
Oracle Linux 8.10
OracleLinux_9_5
Oracle Linux 9.5
openSUSE-Leap-15.6
openSUSE Leap 15.6
PS C:\Users\yasuh>
Fedoraをインストールするときは、次のコマンドを実行すればよい。
wsl.exe --install FedoraLinux-42
インストールの途中で、画面に何の変化も無く長時間待たされたときは、Enterキーを押すと次に進むようである。
インストール後、再起動してアップデートするときは、コマンド
sudo dnf
update
である。再起動は、コマンドexitで一旦端末を閉じてから、WindowsのスタートメニューでFedoraLinux-42を選べばよい。
他は、Ubuntuのときと同じ要領である。