Ich habe eine CmdStanPy-Umgebung mit Docker vorbereitet, um "Bayes Statistical Modeling with Stan and R" zu lesen. Es schien nur wenige japanische Dokumente zum Erstellen der Umgebung für CmdStanPy zu geben, daher denke ich, dass dies für jemanden nützlich sein könnte, also schreibe ich es auf.
Wie Sie im [offiziellen Dokument] sehen können (https://cmdstanpy.readthedocs.io/en/latest/getting_started.html#install-package-cmdstanpy), seien Sie bitte vorsichtig, wenn Sie eine Umgebung verwenden, in der PyStan bereits installiert ist.
Note for PyStan users: PyStan and CmdStanPy should be installed in separate environments. If you already have PyStan installed, you should take care to install CmdStanPy in its own virtual environment.
Ich habe die Umgebung mit Docker vorbereitet, da sie aufgrund anderer Abhängigkeitsprobleme problematisch zu sein scheint [^ 1].
CmdStans leichter Wrapper von Python
Wenn Sie Stan aus Python verwenden möchten, verwenden Sie wahrscheinlich PyStan im Allgemeinen [^ 2]. Der Grund, warum ich mich für CmdStanPy entschieden habe, ist, dass es (derzeit) schneller läuft als PyStan.
Die Einzelheiten sind wie folgt:
Zuerst habe ich auch eine PyStan-Umgebung vorbereitet, aber mit einem einfachen Beispiel namens Acht Schulen (siehe diesen Teil des PyStan-Dokuments). Das Kompilieren meines Modells dauerte mehr als eine Minute.
Nachdem ich untersucht habe, ob meine Installationsmethode schlecht oder normal war, [dieser Austausch] in Stans Community (https://discourse.mc-stan.org/t/why-is-it) -so-slow-for-stan-to-compile-model / 6004) wurde gefunden. Gemäß
Stan compilation speedup was introduced in Stan 2.20, but Rstan is only up to Stan 2.19.2.
right now we have lightweight wrappers CmdStanPy 11 (still in beta) and CmdStanR 18 (almost to beta release) which use the latest CmdStan (now at 2.21, 2.22 coming soon) - or any version of CmdStan that you’d like.
Dieser Austausch selbst war vor zwei Jahren, aber als ich die Version von PyStan in meiner PyStan-Umgebung überprüfte, war es 2.19.1.1, die vor der Einführung von Speedup [^ 3] zu sein schien. Auch beim Schreiben von Stackoverflow hier hat CmdStanPy die Kompilierung mehr als dreimal schneller gemacht. Es gab eine Beschreibung.
Also habe ich beschlossen, CmdStanPy auszuprobieren.
Dockerfile
FROM ubuntu:20.04
RUN apt-get -y update
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN pip3 install --upgrade pip
RUN pip3 install cmdstanpy[all]
RUN python3 -c 'import cmdstanpy; cmdstanpy.install_cmdstan()'
WORKDIR /workdir
Erstellen Sie wie folgt in dem Verzeichnis, in dem sich diese Docker-Datei [^ 4] befindet (ändern Sie YOUR_TAG in einen geeigneten TAG-Namen).
docker image build -t YOUR_TAG .
Start (Ich mounte das aktuelle Verzeichnis auf / workdir
, weil ich den lokalen Quellcode verwenden möchte)
docker container run -it --rm --net=host \
--mount type=bind,src=`pwd`,dst=/workdir \
YOUR_TAG \
bash
In dem Verzeichnis, in dem Sie den Docker-Container gestartet haben
8schools.stan
[^5])8schools.data.json
)run-cmdstanpy.py
)Ich werde vorbereiten.
8schools.stan
data {
int<lower=0> J; // number of schools
vector[J] y; // estimated treatment effects
vector<lower=0>[J] sigma; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
vector[J] eta;
}
transformed parameters {
vector[J] theta;
theta = mu + tau * eta;
}
model {
eta ~ normal(0, 1);
y ~ normal(theta, sigma);
}
JSON:8schools.data.json
{
"J": 8,
"y": [28, 8, -3, 7, -1, 1, 18, 12],
"sigma": [15, 10, 16, 11, 9, 11, 10, 18]
}
run-cmdstanpy.py
from cmdstanpy import CmdStanModel
print("Compile started")
model = CmdStanModel(stan_file="8schools.stan")
print("Compile finished")
print(model)
print("========================================")
data = "8schools.data.json"
print("Sampling started")
fit = model.sample(data=data)
print("Sampling finished")
print(fit)
Wenn Sie "python3 run-cmdstanpy.py" in "/ workdir" in dem Container ausführen, der im Abschnitt "Umgebungskonstruktion mit Docker" gestartet wurde, und das folgende Ergebnis erhalten, ist dies vorerst erfolgreich.
Compile started
INFO:cmdstanpy:compiling stan program, exe file: /workdir/8schools
INFO:cmdstanpy:compiler options: stanc_options=None, cpp_options=None
INFO:cmdstanpy:compiled model file: /workdir/8schools
Compile finished
CmdStanModel: name=8schools
stan_file=/workdir/8schools.stan
exe_file=/workdir/8schools
compiler_optons=stanc_options=None, cpp_options=None
========================================
Sampling started
INFO:cmdstanpy:start chain 1
INFO:cmdstanpy:start chain 2
INFO:cmdstanpy:start chain 3
INFO:cmdstanpy:start chain 4
INFO:cmdstanpy:finish chain 3
INFO:cmdstanpy:finish chain 1
INFO:cmdstanpy:finish chain 4
INFO:cmdstanpy:finish chain 2
Sampling finished
CmdStanMCMC: model=8schools chains=4['method=sample', 'algorithm=hmc', 'adapt', 'engaged=1']
csv_files:
/tmp/tmpd0ii4fo_/8schools-202009110125-1-0qknvwdc.csv
/tmp/tmpd0ii4fo_/8schools-202009110125-2-qfoj4mom.csv
/tmp/tmpd0ii4fo_/8schools-202009110125-3-cbn8wxph.csv
/tmp/tmpd0ii4fo_/8schools-202009110125-4-h_5980t6.csv
output_files:
/tmp/tmpd0ii4fo_/8schools-202009110125-1-0qknvwdc-stdout.txt
/tmp/tmpd0ii4fo_/8schools-202009110125-2-qfoj4mom-stdout.txt
/tmp/tmpd0ii4fo_/8schools-202009110125-3-cbn8wxph-stdout.txt
/tmp/tmpd0ii4fo_/8schools-202009110125-4-h_5980t6-stdout.txt
deleting tmpfiles dir: /tmp/tmpd0ii4fo_
done
Einzelheiten zur Verwendung von CmdStanPy finden Sie unter Offizielles Dokument.
Ich werde auch kurz den Geschwindigkeitsvergleich mit PyStan aufzeichnen. Alle Stan-Dateien sind "8schools.stan" gemeinsam, die im Abschnitt "Ausführung" geschrieben wurden.
CmdStanPy
Die Docker-Umgebung ist wie unter "Erstellen einer Umgebung mit Docker" beschrieben. Ich habe die folgende Python-Datei verwendet:
test-cmdstanpy.py
from cmdstanpy import CmdStanModel
import time
print("Compile started")
t1 = time.time()
model = CmdStanModel(stan_file="8schools.stan")
t2 = time.time()
data = "8schools.data.json"
print("Sampling started")
t3 = time.time()
fit = model.sample(data=data)
t4 = time.time()
print("Compile time :", t2 - t1, "seconds")
print("Sampling time :", t4 - t3, "seconds")
PyStan
Die verwendete Docker-Datei lautet wie folgt:
Dockerfile
FROM ubuntu:20.04
RUN apt-get -y update
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN pip3 install --upgrade pip
RUN pip3 install pystan
WORKDIR /workdir
Erstellen und starten Sie auf die gleiche Weise wie "Erstellen einer Umgebung mit Docker". In der Python-Datei wurde außerdem Folgendes verwendet. :: ::
test-pystan.py
import pystan
import time
schools_dat = {'J': 8,
'y': [28, 8, -3, 7, -1, 1, 18, 12],
'sigma': [15, 10, 16, 11, 9, 11, 10, 18]}
print("Compile started")
t1 = time.time()
sm = pystan.StanModel(file='8schools.stan')
t2 = time.time()
print("Sampling started")
t3 = time.time()
fit = sm.sampling(data=schools_dat, iter=1000, chains=4)
t4 = time.time()
print("Compile time :", t2 - t1, "seconds")
print("Sampling time :", t4 - t3, "seconds")
CmdStanPy
Compile time : 12.916020393371582 seconds
Sampling time : 0.16101527214050293 seconds
PyStan
Compile time : 98.87509870529175 seconds
Sampling time : 0.45189523696899414 seconds
Ich habe es mehrmals gemessen, aber beim Kompilieren des Modells war das Ergebnis, dass CmdStanPy im Grunde etwa siebenmal schneller war als PyStan [^ 6] [^ 7].
[^ 1]: Da ich Docker jedoch in einer Atmosphäre verwende, ist die hier beschriebene Methode zum Erstellen der Docker-Umgebung möglicherweise nicht die beste. [^ 2]: PyStans Dokument und Github-Seite wurden als erste in einer Google-Suche nach "Python Stan" angezeigt. Es war (: //github.com/stan-dev/pystan). [^ 3]: Ist es die Erkenntnis, dass die PyStan-Versionsnummer der Stan-Versionsnummer entspricht ...? [^ 4]: Weitere Informationen zu dem Teil, der CmdStanPy installiert, finden Sie unter https://cmdstanpy.readthedocs.io/en/latest/getting_started.html#installation. [^ 5]: Von der Einstiegsseite von PyStan heruntergeladen. Https://pystan.readthedocs.io/en/latest/getting_started.html [^ 6]: Im Fall von CmdStanPy gibt es eine nette Funktion: "Vergleichen Sie die Änderungszeit von exe-Datei und stan-Datei, und wenn letztere neuer als die erstere ist, wird sie nicht kompiliert". Seien Sie also vorsichtig, wenn Sie wiederholt messen. .. [^ 7]: Als das Basis-Image von PyStan auf Ubuntu: 16.04 eingestellt wurde, dauerte PyStan ebenfalls etwa 50 Sekunden, die Ursache wurde jedoch nicht untersucht.