Skip to main content

HTTP-based interface to Stan, a package for Bayesian inference.

Project description

Stan logo

pypi version travis-ci build status test coverage report

HTTP-based interface to Stan, a package for Bayesian inference.

An HTTP 1.1 interface to the Stan C++ package, httpstan is a shim that allows users to interact with the Stan C++ library using an HTTP API. The package is intended for use as a universal backend for frontends which know how to make HTTP requests. The primary audience for this package is developers.

In addition to providing all the functionality of the command-line interface to Stan (CmdStan) over HTTP 1.1, httpstan provides:

  • Automatic caching of compiled Stan models

  • Automatic caching of samples from Stan models

  • Parallel sampling

Documentation lives at https://httpstan.readthedocs.org.

Experimental software!

httpstan is experimental software. This software is not yet intended for general use.

httpstan currently requires Python version 3.6 or higher.

httpstan only works on Linux and macOS. Windows support is planned.

Background

httpstan is a shim allowing clients speaking HTTP to call functions in the Stan C++ package’s stan::services namespace. httpstan was originally developed as a “backend” for a Python interface to Stan, PyStan.

Install

$ python3 -m pip install httpstan

Install from Source

A working copy of protoc is needed to build from source. One way to get this is to install grpcio-tools from PyPI with python3 -m pip install grpcio-tools.

$ make cython  # generate C++ code from Cython .pyx files
$ make protos  # generate Python modules for protocol buffer schemas
$ python3 setup.py install

Usage

After installing httpstan, running the module will begin listening on localhost, port 8080:

python3 -m httpstan

In a different terminal, make a POST request to http://localhost:8080/v1/models with Stan program code to compile the program:

curl -X POST -H "Content-Type: application/json" \
    -d '{"program_code":"parameters {real y;} model {y ~ normal(0,1);}"}' \
    http://localhost:8080/v1/models

This request will return a model name along with all the compiler output:

{"name": "models/89c4e75a2c", "compiler_output": "..."}

(The model name depends on the platform and the version of Stan.)

To draw samples from this model using default settings, we first make the following request:

curl -X POST -H "Content-Type: application/json" \
    -d '{"function":"stan::services::sample::hmc_nuts_diag_e_adapt"}' \
    http://localhost:8080/v1/models/e1ca9f7ac7/fits

This request instructs httpstan to draw samples from the normal distribution. The function name picks out a specific function in the Stan C++ library (see the Stan C++ documentation for details). This request will return immediately with a reference to the long-running fit operation:

{"done": false, "name": "operations/9f9d701294", "metadata": {"fit": {"name": "models/e1ca9f7ac7/fits/9f9d701294"}}}

Once the operation is completed, the “fit” can be retrieved. The name of the fit, models/e1ca9f7ac7/fits/9f9d701294, is included in the metadata field above. The fit is saved as sequence of Protocol Buffer messages. These messages are strung together using length-prefix encoding. To retrieve these messages, saving them in the file myfit.bin, make the following request:

curl http://localhost:8080/v1/models/e1ca9f7ac7/fits/9f9d701294 > myfit.bin

To read the messages you will need a library for reading the encoding that Protocol Buffer messages use. In this example we will read the first message in the stream using the Protocol Buffer compiler tool protoc. (On Debian-based Linux you can find this tool in the protobuf-compiler package.) The following command skips the message length (one byte) and then decodes the message (which is 48 bytes in length):

dd bs=1 skip=1 if=myfit.bin 2>/dev/null | head -c 48 | \
  protoc --decode stan.WriterMessage protos/callbacks_writer.proto

Running the command above decodes the first message in the stream. The decoded message should resemble the following:

topic: LOGGER
feature {
  string_list {
    value: "Gradient evaluation took 1.3e-05 seconds"
  }
}

Contribute

Contribution guidelines are described in CONTRIBUTE.rst.

License

ISC License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

httpstan-0.7.6-cp37-cp37m-manylinux1_x86_64.whl (29.5 MB view details)

Uploaded CPython 3.7m

httpstan-0.7.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.7mmacOS 10.10+ Intel (x86-64, i386)macOS 10.10+ x86-64macOS 10.6+ Intel (x86-64, i386)macOS 10.9+ Intel (x86-64, i386)macOS 10.9+ x86-64

httpstan-0.7.6-cp36-cp36m-manylinux1_x86_64.whl (29.5 MB view details)

Uploaded CPython 3.6m

httpstan-0.7.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (31.4 MB view details)

Uploaded CPython 3.6mmacOS 10.10+ Intel (x86-64, i386)macOS 10.10+ x86-64macOS 10.6+ Intel (x86-64, i386)macOS 10.9+ Intel (x86-64, i386)macOS 10.9+ x86-64

File details

Details for the file httpstan-0.7.6-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: httpstan-0.7.6-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 29.5 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.18.4 setuptools/39.2.0 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.5

File hashes

Hashes for httpstan-0.7.6-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5a13f53fcfc6ffe05d64d341cf5456caa60956f30863c07a20a303a00c1b95c9
MD5 2cdd88480711ec9660c4f8943c07b429
BLAKE2b-256 eabf9ef435bcfa0f71d9f747de0639a822cc9a0b3bbeb2a3c9e82a2fedaf5075

See more details on using hashes here.

File details

Details for the file httpstan-0.7.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl.

File metadata

File hashes

Hashes for httpstan-0.7.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Algorithm Hash digest
SHA256 5378e43cb57e13056883c91b3159ba8e7bf9c87b4125d8ad55a64e36657b84e8
MD5 19c9f654baa3034190025aa11cd58fd6
BLAKE2b-256 ea977e0a5d23bee9aa9f6f27ea34bd50efc4e7df4316f4f62056e70e2f017e8d

See more details on using hashes here.

File details

Details for the file httpstan-0.7.6-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: httpstan-0.7.6-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 29.5 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.18.4 setuptools/39.2.0 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.5

File hashes

Hashes for httpstan-0.7.6-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6a29d9d123f9fc4fae9a2d3b32403a5d46315b3051d9cc811033e207cbddf66b
MD5 f77a3f3a5e0a6fb17bfe5ef58fc713fe
BLAKE2b-256 b52065ee69dfda8c7adcad4160420c7b92f00c344a3d0540940be09cbd41f696

See more details on using hashes here.

File details

Details for the file httpstan-0.7.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl.

File metadata

File hashes

Hashes for httpstan-0.7.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Algorithm Hash digest
SHA256 dd0cd3df791b48039a85c0bfd75e22423a19baeb27180d73faf55be0ff27e37b
MD5 f3fa74131557909dcccd29464a5f2e02
BLAKE2b-256 3abf8e8820bd165aa9e47dd46b2156055063e0b3bd2e38bd995223aef48f644b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page