Skip to main content

Experiment Tracker

PyPI Python License Docs

A local-first experiment tracker. Metrics land in a JSONL file you own, stay queryable while the run is live, and can trigger alerts from an expression language. wandb and trackio are optional mirrors, not requirements.

📖 Documentation: https://hspk.github.io/expr_tracker/

import expr_tracker as et

et.init(project="demo", name="run-1", alert_rules=["zscore(loss[50]) > 3 => error: spike"])
for step in range(1000):
    et.log({"loss": loss, "lr": lr})
et.finish()

et.history(50)                    # the last 50 steps, as dicts
et.history(-1, output_type="pd")  # everything, as a DataFrame

Why

  • The file is the source of truth. One JSON object per step, appended to metrics.jsonl. No server, no database, no vendor.
  • History is queryable during the run. et.history(n) answers from an in-memory cache and touches the file only for what it evicted — 227 µs for history(50) whether the run has 1,000 steps or 100,000.
  • Alerts are expressions, not callbacks. zscore(loss[50]) > 3 or isnan(loss) is parsed, validated, and evaluated against a rolling window. Rules can be replayed over a finished run to tune thresholds before you trust them.
  • It stays out of the way. log() costs ~26 µs. A failed disk, a dead webhook or an unserialisable value degrades with a warning; none can stop training.

Install

uv add expr_tracker                 # local-first: click, loguru, pydantic only
uv add "expr_tracker[wandb]"        # mirror to Weights & Biases
uv add "expr_tracker[trackio]"      # mirror to trackio
uv add "expr_tracker[lark]"         # Feishu/Lark alert channel
uv add "expr_tracker[pandas]"       # history(output_type="pandas")
uv add "expr_tracker[all]"          # everything

Only the JSONL history is built in. A missing extra is reported with the exact install command; it never crashes a run.

Features

Logging One line per step. Several log() calls for one step merge into one row, wandb-compatible step/commit semantics, numpy and pydantic values handled.
History et.history(n) during or after the run, offline reads of any run directory, dict/pandas/polars output, bounded in-memory cache with observable hit rate.
Alerts An expression DSL with rolling windows, three-valued logic (no false alarms during warm-up), a rule state machine, and a watchdog that catches a hung run.
Channels Lark, Slack, DingTalk, WeCom, generic webhook, email — with rate limiting, dedup, retries and per-channel routing.
Artifacts Versioned file sets, deduplicated by content, shared across a project's runs, with lineage.
Spans Time the parts of a step, and their parts. Each duration becomes a metric, so alerts and queries work on it unchanged; et trace exports the timeline for Perfetto. print_fn prints the tree live, and plugins attach CPU and GPU cost to each region.
Streams Independent producers — a data worker and a training loop — each with their own step cursor and file inside one run.
Distributed Per-rank shards so concurrent appends cannot corrupt step order; only rank 0 alerts by default.
CLI et history, et rules explain, et rules test, et alert.

wandb compatibility

Migrating an existing script is usually one line:

# import wandb as et
import expr_tracker as et

init, log, finish, alert, log_artifact, use_artifact, Artifact, define_metric, run.summary, run.step, run.dir and run.url keep their wandb names and signatures. See the compatibility table.

Development

uv sync --all-extras
uv run pytest                                   # everything
uv run pytest -m "not slow and not benchmark"   # the fast suite
uv run pytest -m benchmark -s                   # timing and memory report
uv run pytest --cov=expr_tracker                # coverage
uv run ruff check src tests
uv run ruff format src tests

Test layout

File Covers
test_history, test_expr_*, test_alert_*, test_writer_durability, … per-module unit tests
test_correctness.py value and type round trips, randomised commit sequences, ordering invariants
test_cache.py that the cache really serves reads: zero-IO assertions, eviction boundaries, warm/cold parity
test_failure_modes.py degradation: write failures, read-only dirs, encoder blow-ups, dead alert backends
test_e2e.py full runs, resume, crash recovery, offline reads, CLI
test_scenarios.py live cross-process reads, alerts during eviction, out-of-order resume
test_hot_paths.py contracts and defaults of et.log / et.history / summary / alerts
test_value_encoding.py numpy, pydantic, datetime, Path, Enum round trips; output types; query bounds
test_expr_properties.py DSL properties: render round-trip stability, precedence, the whole M builder
test_trace.py Chrome Trace export: lane layout, stream and step selection, the CLI
test_spans.py nesting, aggregation, decorator and async forms, errors, thread and task isolation
test_span_plugins.py print_fn output and indentation, the plugin protocol, failure isolation, CPU/GPU built-ins
test_streams.py stream naming and validation, isolation, resolution order, backend grouping, two-process runs
test_distributed.py rank shards, alert_on_rank, real multi-process runs
test_wandb.py real wandb in offline mode: parameter mapping, step alignment, artifacts
test_trackio.py trackio contract, resume mapping, real end-to-end
test_lark_live.py Lark channel; real delivery when ET_LARK_TEST_WEBHOOK is set
test_stress.py (slow) 100k-row writes, concurrency, cache thrash, write-failure recovery
test_benchmark.py (benchmark) throughput, tail latency, query cost, memory stability

Docs

uv run --group docs mkdocs serve    # preview at localhost:8000
uv run --group docs mkdocs build    # build into site/

Published to GitHub Pages by .github/workflows/docs.yaml on every push to main. Internals: docs/design.md (data model and key invariants) and docs/architecture.md (module map, read/write paths, concurrency model).

License

MIT

Download files

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

Source Distribution

expr_tracker-0.2.4.tar.gz (380.5 kB view details)

Uploaded Source

Built Distribution

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

expr_tracker-0.2.4-py3-none-any.whl (93.3 kB view details)

Uploaded Python 3

File details

Details for the file expr_tracker-0.2.4.tar.gz.

File metadata

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

File hashes

Hashes for expr_tracker-0.2.4.tar.gz
Algorithm Hash digest
SHA256 c266757160e5456b839fa86652d8cdd045273c8aa37b11eb18ed31c949b68da8
MD5 8d6f33a2621c20e18c8bcdcb8c3b51ef
BLAKE2b-256 64843be580c95b09f4eef12fa8b330a85acf64a9834695a50bfd11c2598d063b

See more details on using hashes here.

Provenance

The following attestation bundles were made for expr_tracker-0.2.4.tar.gz:

Publisher: release.yaml on HSPK/expr_tracker

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

File details

Details for the file expr_tracker-0.2.4-py3-none-any.whl.

File metadata

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

File hashes

Hashes for expr_tracker-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a442c38b25400d04da136f01af4de56a5277d0ae94af85f45736ce38eba7e17b
MD5 3291aa5c7a99b5a87d1caa381109af0a
BLAKE2b-256 d1b579f05290d5f37e572a9837b5e5d7763c93dea77df661c555548806365047

See more details on using hashes here.

Provenance

The following attestation bundles were made for expr_tracker-0.2.4-py3-none-any.whl:

Publisher: release.yaml on HSPK/expr_tracker

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

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

This release

0.2.4 This release

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page