/wasm-stan-experiment

Compile Stan models to WebAssembly.

Primary LanguageJavaScriptMIT LicenseMIT

Experimental WebAssembly Stan

Stan in your web browser. Consists of two parts:

  • WebStan client. A minimal web frontend for httpstan. Built using d3.js.
  • NodeStan backend. A drop-in replacement for httpstan server. This uses express.js.

The frontend works as a static web page; simply start a static web server in this directory, e.g. python3 -mhttp.server and open http//localhost:8000/client/index.html in your browser. Also available as GitHub Pages demo. The static server is very limited however and cannot compile new models. Compiling (without WASM) is enabled when using plain old httpstan as the backend. Install httpstan and then start httpstan_client.py script and (again) open http://localhost:8000/client/index.html.

Of course the real reason you're reading this is compiling new WASM models. To do so you must first install Emscripten and CmdStan. You may set the environment variable CMDSTAN to the CmdStan directory so that $CMDSTAN/bin/stanc is the Stan compiler. If the variable is not set then the latest CmdStan installation found in ~/.cmdstan directory is used. Now you can compile and run a new model from the command line

node cmdstan.js model.stan data.json

The above runs NUTS with default arguments and produces file output.csv like CmdStan does. The command line interface does not accept any other arguments. For more control start a local NodeStan server with

node server/main.js

and open the WebStan client http://localhost:8000/client/index.html in your browser. From there it is possible to compile models to WASM and run them in either NodeJS on the server side or inside your web browser.

Finally, PyStan 3 interacts with Stan through httpstan backend and it is in theory possible to use NodeStan as that backend. Import pystan_test.py in your interactive Python session and call monkeypatch_pystan(). Alternatively clone the PyStan repo and simply run python3 ../wasm-stan/pystan_test.py in that repo. As a script, it monkeypatches the backend and then runs pytest as if you had invoked python3 -mpytest. A few tests are skipped, see the code. Also works in the httpstan repo. (The skipped tests are chosen based on the name of the current working directory.)