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, drop it from the server & print it
    print(H_remote.snapshot(delete_from_server=True))


# 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                                                              │
└────────────────────────────────────────────────────────────────────────────┘

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: Hist(
#   Regular(10, -2, 2, name='x', label='X Axis'),
#   Regular(10, -2, 2, name='y', label='Y Axis'),
#   StrCategory(['data', 'drell-yan'], growth=True, name='dataset', label='Dataset'),
#   storage=Weight()) # Sum: WeightedSum(value=911503, variance=911503) (WeightedSum(value=1e+06, variance=1e+06) with flow)
# 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(...)
  • snapshot(delete_from_server=False)
  • reset()
  • exists()
  • flush(destination="hist.h5")
  • delete()

Current supported types

Axis support:

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

np.dtype support for hist.axis.{Regular,Variable,Integer}:

  • np.float64
  • np.float32
  • np.int64
  • np.int32

Notes:

  • Categorical axes (IntCategory, StrCategory) are treated as chunk keys and must be filled with scalar values.
  • Non-categorical axes are pre-binned on the client before transmission.

Developer Info

Install

uv sync --dev

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.1.6.tar.gz (29.8 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.1.6-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: histserv-0.1.6.tar.gz
  • Upload date:
  • Size: 29.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for histserv-0.1.6.tar.gz
Algorithm Hash digest
SHA256 12f66dc482767ef1cab1143b9244733353c231c1bccaa232fbaf26d3dfef4eef
MD5 fb19ceebf041ab9e1298bfda4a26f0a6
BLAKE2b-256 9e6cf6904ca5e66503ae56fb2857f138b467765a4fe257a763907cffb4101b8e

See more details on using hashes here.

Provenance

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

Publisher: cd.yml on pfackeldey/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.1.6-py3-none-any.whl.

File metadata

  • Download URL: histserv-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for histserv-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 19c8b206b30c17301f946c2fea9fda5b893a579efae14e7a5fcfcdc79facc3c5
MD5 e61dacca62654a54e571ed633b4945fb
BLAKE2b-256 aa471f9e892d05d178bf8ba06e9deef7df96cc223b4a39b1734f7336b52f33d3

See more details on using hashes here.

Provenance

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

Publisher: cd.yml on pfackeldey/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