Skip to main content

Histogramming as a Service

Project description

Histogramming as a Service (HistServ)

PyPI version Conda-Forge PyPI platforms

Install from PyPI

pip install histserv

Install from conda-forge

conda install -c conda-forge histserv

Quickstart

Start the async gRPC server (or just ./example/start_server.sh):

histserv --port 50051
# 2026-03-26 11:58:00.643 INFO:histserv:server (listening at [::]:50051) started with port=50051, prune_after=24.00 h, prune_interval=5.00 min, stats_interval=5.00 s

Then run:

from hist import Hist
from histserv import Client
import numpy as np


# initialize hist locally
H_local = Hist.new.Reg(30, -3, 3, name="x", label="x-axis").Double()

with Client(address="[::]:50051") as client:
    # initialize it on the server and receive a remote hist to interact with it
    H_remote = client.init(H_local)
    # fill the remote hist; the client pre-bins locally and sends dense storage
    H_remote.fill(x=np.random.normal(size=1000))
    # retrieve it back as a ChunkedHist, drop it from the server, and materialize it locally
    H_snapshot = H_remote.snapshot(delete_from_server=True)
    print(H_snapshot.to_hist())


# local hist hasn't been filled
assert np.all(H_local.view(True) == 0)

Output in ipython:

┌────────────────────────────────────────────────────────────────────────────┐
[-inf,   -3) 1  │▋                                                           [  -3, -2.8) 0                                                              [-2.8, -2.6) 1  │▋                                                           [-2.6, -2.4) 1  │▋                                                           [-2.4, -2.2) 6  │████                                                        [-2.2,   -2) 11 │███████▍                                                    [  -2, -1.8) 12 │████████                                                    [-1.8, -1.6) 20 │█████████████▍                                              [-1.6, -1.4) 19 │████████████▊                                               [-1.4, -1.2) 33 │██████████████████████▏                                     [-1.2,   -1) 50 │█████████████████████████████████▌                          [  -1, -0.8) 70 │██████████████████████████████████████████████▉             [-0.8, -0.6) 49 │████████████████████████████████▉                           [-0.6, -0.4) 88 │███████████████████████████████████████████████████████████ [-0.4, -0.2) 63 │██████████████████████████████████████████▎                 [-0.2,    0) 65 │███████████████████████████████████████████▋                [   0,  0.2) 85 │█████████████████████████████████████████████████████████   [ 0.2,  0.4) 77 │███████████████████████████████████████████████████▋        [ 0.4,  0.6) 65 │███████████████████████████████████████████▋                [ 0.6,  0.8) 61 │████████████████████████████████████████▉                   [ 0.8,    1) 63 │██████████████████████████████████████████▎                 [   1,  1.2) 45 │██████████████████████████████▏                             [ 1.2,  1.4) 36 │████████████████████████▏                                   [ 1.4,  1.6) 32 │█████████████████████▌                                      [ 1.6,  1.8) 15 │██████████                                                  [ 1.8,    2) 11 │███████▍                                                    [   2,  2.2) 10 │██████▊                                                     [ 2.2,  2.4) 3  │██                                                          [ 2.4,  2.6) 5  │███▍                                                        [ 2.6,  2.8) 2  │█▍                                                          [ 2.8,    3) 1  │▋                                                           [   3,  inf) 0                                                              │
└────────────────────────────────────────────────────────────────────────────┘

Dashboard

See more information about setting up the histserv dashboard in the corresponding dashboard README.

Examples

See example/ for more examples.

Run example client:

python example/client.py
# Remote hist initialized: RemoteHist(hist_id='52c77c93da8146f2a72c53af269d1ab5', address='[::]:50051', token=None)
# Remote hist fill succeeded.
# Snapshotting current hist: ChunkedHist(...)
# Remote hist fill succeeded.
# Remote hist fill succeeded.
# Remote hist flushed successfully to hist.h5.

Or check out how to use remote histogram filling with an example coffea Processor in example/coffea_processor.py.

Useful client methods on RemoteHist:

  • fill(...)
  • fill_many([...])
  • snapshot(delete_from_server=False)
  • reset()
  • exists()
  • get_connection_info()
  • RemoteHist.from_connection_info(...)
  • flush(destination="hist.h5")
  • delete()

Current supported types

Axis support:

  • hist.axis.Regular without transforms
  • hist.axis.Boolean
  • hist.axis.Variable
  • hist.axis.Integer
  • hist.axis.IntCategory
  • hist.axis.StrCategory

Storage support:

  • hist.storage.Double
  • hist.storage.Int64
  • boost_histogram.storage.AtomicInt64
  • hist.storage.Weight
  • boost_histogram.storage.Unlimited

Unsupported today:

  • transformed hist.axis.Regular
  • boost_histogram.storage.Mean
  • boost_histogram.storage.WeightedMean
  • overflow bins on IntCategory/StrCategory chunk axes are not preserved across from_hist()/to_hist() (categorical overflow is silently dropped)

Notes:

  • Growable categorical axes (IntCategory, StrCategory) are treated as chunk keys rather than dense axes.
  • Histograms with one or more growable categorical axes are supported; the categorical values must be provided as scalars when filling.
  • On the wire, fills are sent as dense per-chunk payloads rather than as generic Python objects.
  • RemoteHist.snapshot() returns a ChunkedHist; call .to_hist() to materialize a local hist.Hist.
  • fill_many(...) is useful for bundling several fills into one gRPC request.
  • Dense ndarray transport is generic over NumPy dtypes, but object arrays are not supported on the wire.

Developer Info

Install

uv sync --dev

Test

python -m pytest -q
uvx ty check src

Protobuf Codegen

python -m grpc_tools.protoc -Isrc/histserv/protos --python_out=src/histserv/protos --pyi_out=src/histserv/protos --grpc_python_out=src/histserv/protos src/histserv/protos/hist.proto

After regeneration, ensure src/histserv/protos/hist_pb2_grpc.py keeps the package-relative import:

from . import hist_pb2 as hist__pb2

Project details


Download files

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

Source Distribution

histserv-0.2.1.tar.gz (222.1 kB view details)

Uploaded Source

Built Distribution

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

histserv-0.2.1-py3-none-any.whl (101.3 kB view details)

Uploaded Python 3

File details

Details for the file histserv-0.2.1.tar.gz.

File metadata

  • Download URL: histserv-0.2.1.tar.gz
  • Upload date:
  • Size: 222.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for histserv-0.2.1.tar.gz
Algorithm Hash digest
SHA256 a00c59a36ab68cf2f32d299b56d0df0ca8a8d1cbeb6cd859464d98f8ecb48651
MD5 fef3da5ee9426015b48a33cbb41af3a2
BLAKE2b-256 195a986f21084226be9be3e4b83ca1c1f7e802b7e8e52c55ba3681b27e87a54b

See more details on using hashes here.

Provenance

The following attestation bundles were made for histserv-0.2.1.tar.gz:

Publisher: cd.yml on scikit-hep/histserv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file histserv-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: histserv-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 101.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for histserv-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f971c8c3f84db8809a91231fc5ff4dddd605613102cdf94fb5cf97fb8b4205d5
MD5 d1c57044bb8113fd79e17824960c6d1f
BLAKE2b-256 001df681722f2a358b74ab29ddaca04eca925db3af049696bb49b1600146f894

See more details on using hashes here.

Provenance

The following attestation bundles were made for histserv-0.2.1-py3-none-any.whl:

Publisher: cd.yml on scikit-hep/histserv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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