Local-first ML experiment tracker with a real-time dashboard, convergence forecasting, and zero cloud dependencies
Project description
Caliper
Local-first ML experiment tracker. Log metrics, visualize training runs, compare experiments — all on your machine, zero cloud required.
What is Caliper?
Caliper is a lightweight experiment tracker that stores everything locally as plain JSONL files and serves a rich dashboard from a single CLI command. No accounts, no API keys, no telemetry.
- Convergence forecasting — predicts final val loss and steps to convergence in real-time
- Step-level annotations — pin notes directly onto chart steps
- Multi-run comparison — overlay up to 8 runs with hyperparameter diffs
- Project + tag filtering — organize and filter runs from the sidebar
- GPU monitoring — log utilization, VRAM, temperature, and CPU alongside metrics
- 100% offline — all data lives in
.caliper/runs/in your working directory
Installation
pip install caliper-py
Requires Python 3.8+. No heavy dependencies.
Quickstart
1. Initialize a run in your training script
import caliper
run = caliper.init(
project="CIFAR-10",
name="resnet50-baseline",
tags=["ResNet-50", "baseline"],
hyperparams={
"model": "ResNet-50",
"optimizer": "Adam",
"learning_rate": 0.001,
"batch_size": 64,
"epochs": 50,
}
)
2. Log metrics each step
for step, batch in enumerate(dataloader):
loss = train_step(batch)
val_loss, val_acc = evaluate()
run.log({
"step": step,
"trainLoss": loss,
"valLoss": val_loss,
"valAcc": val_acc,
"lr": scheduler.get_last_lr()[0],
# optional hardware metrics
"gpuUtil": get_gpu_util(),
"vramUsage": get_vram_gb(),
})
run.finish()
3. Launch the dashboard
caliper ui
Opens http://localhost:5173 automatically. All runs in .caliper/runs/ load instantly.
CLI Reference
caliper ui Launch the dashboard (default port 5173)
caliper ui --port 8080 Use a custom port
caliper ui --no-browser Start server without opening a browser
Data Format
Caliper writes two files per run inside .caliper/runs/:
| File | Description |
|---|---|
{run_id}_meta.json |
Run metadata: name, project, tags, hyperparams, status, annotations |
{run_id}_logs.jsonl |
One JSON object per logged step |
Both are plain text — you can read, edit, or version-control them however you like.
Example _meta.json
{
"id": "run-001",
"name": "resnet50-baseline",
"project": "CIFAR-10",
"status": "completed",
"tags": ["ResNet-50", "baseline"],
"hyperparams": { "model": "ResNet-50", "learning_rate": 0.001 },
"annotations": [],
"meta": { "startTime": "2026-06-01T10:00:00Z", "duration": 7260 }
}
Example _logs.jsonl (one line per step)
{"step": 0, "trainLoss": 2.31, "valLoss": 2.45, "valAcc": 0.12, "lr": 0.001}
{"step": 1, "trainLoss": 2.18, "valLoss": 2.30, "valAcc": 0.15, "lr": 0.001}
Generating Sample Data
A sample data generator is included for testing the dashboard:
python -c "
import subprocess, sys
subprocess.run([sys.executable, '-m', 'pip', 'show', '-f', 'caliper-py'])
"
Or clone the repo and run:
git clone https://github.com/verz0/Caliper
cd Caliper/caliper-py
python generate_sample_runs.py
caliper ui
Links
- Homepage & demo: verz0.github.io/Caliper
- Source code: github.com/verz0/Caliper
- Issues: github.com/verz0/Caliper/issues
Made by Pirajesh M R · MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file caliper_py-0.1.1.tar.gz.
File metadata
- Download URL: caliper_py-0.1.1.tar.gz
- Upload date:
- Size: 275.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5713df18e6d104a999f383e35f1a3bcaff7085213dc0ffe1226668c3fa9b8524
|
|
| MD5 |
f3f3ad887f8da214141136d57e1c0b97
|
|
| BLAKE2b-256 |
82cec5495825796a74e0dcd0c4395dff1d9c02a7c081a18e8e4bf18ace9e3d63
|
File details
Details for the file caliper_py-0.1.1-py3-none-any.whl.
File metadata
- Download URL: caliper_py-0.1.1-py3-none-any.whl
- Upload date:
- Size: 273.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
414b29639161ff34cac9813ae6f5fa2a37c8e9bb855c07432e98560e2d3a7905
|
|
| MD5 |
53c6bdb9d110c2b69bf8c53c37b7cd19
|
|
| BLAKE2b-256 |
3b94315e0da6e23416d9b2f38d6ba43d3df79a30d54284b252dc4aec9e95a714
|