Skip to main content

Local experiment orchestration. Queue jobs, track metrics, wake up to results.

Project description

whirr

License: MIT Python 3.9+ Tests

Local experiment orchestration. Queue jobs, track metrics, wake up to results.

whirr is a lightweight, self-hosted alternative to experiment tracking tools. No cloud, no accounts, no external dependencies - just SQLite and your filesystem.

Features

  • Job Queue - Submit experiments, run them on workers
  • Metric Tracking - Log metrics from Python, store as append-only JSONL
  • Multi-GPU Support - One worker per GPU, automatic device assignment
  • Process Safety - Orphan prevention with PDEATHSIG, graceful shutdown
  • Concurrent Access - SQLite WAL mode for safe multi-process access
  • Web Dashboard - Interactive UI for viewing runs and comparing metrics
  • Reproducibility - Automatic capture of git commit and pip freeze
  • Server Mode - Multi-machine orchestration with PostgreSQL backend

Installation

pip install whirr

Optional dependencies:

# For dashboard
pip install whirr[dashboard]

# For server mode (PostgreSQL, HTTP API)
pip install whirr[server]

# For all features
pip install whirr[all]

Or install from source:

git clone https://github.com/syntropy-systems-oss/whirr.git
cd whirr
pip install -e ".[all]"

Quick Start

Initialize a Project

cd your-ml-project
whirr init

This creates a .whirr/ directory with the database and configuration.

Submit Jobs

# Submit a training job
whirr submit --name baseline -- python train.py --lr 0.01

# With tags for organization
whirr submit --name sweep-lr-001 --tags sweep,lr -- python train.py --lr 0.001

Start Workers

# Start a worker (claims and runs jobs from the queue)
whirr worker

# For multi-GPU, start one worker per GPU
CUDA_VISIBLE_DEVICES=0 whirr worker --device 0 &
CUDA_VISIBLE_DEVICES=1 whirr worker --device 1 &

Monitor Progress

# View active jobs
whirr status

# View specific job details
whirr status 1

# Follow job logs
whirr logs 1 --follow

# List completed runs
whirr runs

Cancel Jobs

# Cancel a specific job
whirr cancel 1

# Cancel all queued jobs
whirr cancel --all-queued

Python Library

Track metrics directly from your training scripts:

import whirr

# Initialize a run
run = whirr.init(
    name="my-experiment",
    config={"lr": 0.01, "batch_size": 32},
    tags=["baseline"]
)

# Log metrics during training
for epoch in range(100):
    loss = train_epoch()
    run.log({"loss": loss, "epoch": epoch}, step=epoch)

# Save summary metrics
run.summary({"best_loss": 0.1, "best_epoch": 42})

# Save artifacts
run.save_artifact("model.pt", "best_model.pt")

run.finish()

Or use as a context manager:

with whirr.init(name="my-run") as run:
    run.log({"loss": 0.5})
    # Automatically marked complete or failed

Direct Runs (No Queue)

You can use whirr for tracking without the job queue:

python train.py  # Uses whirr.init() directly
whirr runs       # Shows the run

Server Mode (Multi-Machine)

For distributed setups with multiple GPU machines:

Start the Server

# Using Docker Compose (recommended)
docker-compose up -d

# Or manually with PostgreSQL
whirr server --database-url postgresql://user:pass@localhost:5432/whirr

Start Workers on GPU Machines

# On each GPU machine, connect to the server
whirr worker --server http://head-node:8080 --data-dir /mnt/shared/whirr

# With GPU assignment
whirr worker --server http://head-node:8080 --data-dir /mnt/shared/whirr --gpu 0

Submit Jobs Remotely

whirr submit --server http://head-node:8080 -- python train.py --lr 0.01

Project Structure

your-project/
├── .whirr/
│   ├── config.yaml      # Project configuration
│   ├── whirr.db         # SQLite database (WAL mode)
│   └── runs/
│       └── run-id/
│           ├── meta.json       # Run metadata
│           ├── config.json     # Run configuration
│           ├── metrics.jsonl   # Logged metrics
│           ├── output.log      # stdout/stderr
│           └── artifacts/      # Saved files

CLI Reference

Command Description
whirr init Initialize whirr in current directory
whirr submit -- CMD Submit a job to the queue
whirr status [ID] Show job status
whirr worker Start a worker process
whirr logs ID View job output
whirr cancel ID Cancel a job
whirr runs List all runs
whirr dashboard Launch web dashboard
whirr compare ID1 ID2 Compare runs side-by-side
whirr export ID Export run data
whirr server Start multi-machine server
whirr doctor Diagnose configuration issues

Documentation

Full documentation is available in the docs/ directory:

Development

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run specific test file
pytest tests/test_db.py -v

License

MIT License - see LICENSE for details.

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

whirr-0.3.0.tar.gz (125.6 kB view details)

Uploaded Source

Built Distribution

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

whirr-0.3.0-py3-none-any.whl (67.0 kB view details)

Uploaded Python 3

File details

Details for the file whirr-0.3.0.tar.gz.

File metadata

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

File hashes

Hashes for whirr-0.3.0.tar.gz
Algorithm Hash digest
SHA256 2b7a79b2ee38daa920d9f0e0ab5cf2a8aa00b0ce1ac99794ce8d759c3d1ee3cc
MD5 7a451cdbded7af677f4344bac72d8855
BLAKE2b-256 a81c782ff95b5b42ccd4043a03cb4c068e44c246e8557b56c8d5c5af01d837d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for whirr-0.3.0.tar.gz:

Publisher: publish.yml on syntropy-systems-oss/whirr

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

File details

Details for the file whirr-0.3.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for whirr-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f25772cb066fefd9356c5f64a84641f00e95611b028b9f06b48773e74a98ea87
MD5 32ad71a0b59a9c7b63a1f70f86bf0d90
BLAKE2b-256 e085b3d09ea72c4957ef6bbfe27c543c38b78e77aefd1a1b9a5692119cfca4b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for whirr-0.3.0-py3-none-any.whl:

Publisher: publish.yml on syntropy-systems-oss/whirr

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