[PYTHON] Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor

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.

Einführung

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].

Was ist CmdStanPy?

CmdStans leichter Wrapper von Python

Warum CmdStanPy?

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.

Umgebung

Umgebungskonstruktion mit Docker

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

Lauf

In dem Verzeichnis, in dem Sie den Docker-Container gestartet haben

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.

Anhang: Geschwindigkeitsvergleich mit PyStan

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")

Ergebnis

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.

Recommended Posts

Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Bereiten Sie die Python3-Umgebung mit Docker vor
Vorbereiten der Ausführungsumgebung von PyTorch mit Docker November 2019
Der Tag des Dockerlaufs (Hinweis)
Bereiten Sie die Entwicklungsumgebung mit anyenv vor
[Hinweis] Exportieren Sie das HTML der Site mit Python.
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
Die Geschichte des Teilens der Pyenv-Umgebung mit mehreren Benutzern
Beispiel einer Pytest-Umgebung zum Reparieren der Datenbank mit Docker
Installieren Sie Ubuntu 20.04 mit GUI und bereiten Sie die Entwicklungsumgebung vor
Geben Sie den Projektnamen von Docker-Compose mit Docker-Integration von Pycharm an
Vereinheitlichen Sie die Umgebung des Python-Entwicklungsteams, beginnend mit Poetry
Rufen Sie den Hostnamen des Host-PCs mit Docker unter Linux ab
Bereiten Sie die Pipenv-Umgebung mit Amazon Linux 2 vor
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Richten Sie mit Atom eine Python-Entwicklungsumgebung ein
Erstellen Sie die Entwicklungsumgebung von Django mit Docker neu! !! !! !!
Bereiten Sie die Umgebung für Atom für Pythonista vor
(Hinweis) Hinweise zum Erstellen einer TensorFlow + Flask + Nginx-Umgebung mit Docker Compose
Postgres-Umgebungskonstruktion mit Docker Ich hatte ein wenig Probleme, also beachten Sie
Bereiten Sie eine verteilte Lasttestumgebung mit dem Python-Lasttest-Tool Locust vor
Protokollieren Sie die Omron-Umgebungssensorwerte regelmäßig mit Raspberry Pi
Greifen Sie mit Requests auf die Docker Remote API zu
Ich habe den Inhalt des Docker-Volumes überprüft
Führen Sie IDCF Cloud CLI auf Docker aus
Erstellen Sie mit Docker eine Jupyter Lab (Python) -Umgebung
Richten Sie die Größe der Farbleiste an der Matplotlib aus
(Hinweis) Hinweise zum Erstellen einer Tensor Flow-Umgebung mit Docker Compose (nur ein Container)
Hinter dem Flyer: Docker mit Python verwenden
Hinweise beim Erstellen einer Umgebung mit Python
Überprüfen Sie die Existenz der Datei mit Python
Informationen zur virtuellen Umgebung von Python Version 3.7
Holen Sie sich mit Docker eine lokale Umgebung für DynamoDB
Erstellen Sie eine Ausführungsumgebung für Jupyter Lab
Erstellen Sie mit Docker eine Python + uWSGI + Nginx-Umgebung
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Bereiten Sie eine Umgebung zum Berühren von Dateien im Grib2-Format mit Python vor (Docker Edition).
Versuchen Sie, jede Umgebung von Kivy vorzubereiten
Die dritte Nacht der Runde mit für
[Linux] Erstellen einer Jenkins-Umgebung mit Docker
Bereiten Sie die Entwicklungsumgebung für keyhac für Mac vor
Starten Sie die Umgebung mit LineBot + Heroku + Docker + Python
Die zweite Nacht der Runde mit für
Protokollierung der Omron-Umgebungssensorwerte mit Raspberry Pi (USB-Typ)
Python Hinweis: Die geheime Rolle von Kamma
Zählen Sie die Anzahl der Zeichen mit Echo
Erstellen Sie mit Docker eine Umgebung aus NGINX + NGINX Unit + MySQL
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
Bereiten Sie die Umgebung für das O'Reilly-Buch "Deep Learning from Grund neu" mit apt-get vor (Debian 8).
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
Beachten Sie, dass die Berechnung der durchschnittlichen paarweisen Korrelation mit Pandas sehr einfach war
Die Geschichte des tiefen Lernens mit TPU
Hallo Welt mit gRPC / go in Docker-Umgebung
Einführung in Python Bereiten wir die Entwicklungsumgebung vor
Erstellen einer Analyseumgebung mit Docker (Jupyter Notebook + PostgreSQL)