
ExpMan
Experiment manager written in Rust
- Period
- Feb 2026 – present
- Affiliation
- Open source (MIT)
- Rust
- Open source
- Tooling
An experiment manager written in Rust, with a Python wrapper for non-blocking logging, a live web dashboard, and a CLI. The point is that tracking a run should cost the training loop nothing.
Features
- Non-blocking Python logging —
log_vector()is a ~100 ns channel send, so it never stalls your training loop. - Live dashboard — SSE-powered real-time metric streaming, run comparison charts, and an artifact browser.
- Single binary — CLI and web server ship as one
expbinary; the server needs no Python runtime. - Efficient storage — batched Arrow/Parquet writes rather than a read-concat-write per step.
- TensorBoard interoperability — a drop-in
SummaryWriter, plus import and export both ways. - Reproducible dev environment —
nix develop, with a Cachix cache.
Installing
cargo install expman # Rust
pip install expman-rs # Python
nix run github:lokeshmohanty/expman-rs
Logging a run
import expman as exp
exp.init("resnet_cifar10")
exp.log_params({"lr": 0.001})
exp.log_vector({"loss": 0.5}, step=0)
Or scoped, which is the recommended form:
from expman import Experiment
with Experiment("resnet_cifar10") as exp:
exp.log_vector({"loss": 0.5}, step=0)
The same engine is available directly in Rust:
use expman::{ExperimentConfig, LoggingEngine, RunStatus};
let config = ExperimentConfig::new("my_rust_exp", "./experiments");
let engine = LoggingEngine::new(config)?;
engine.log_vector([("loss".to_string(), 0.5.into())].into(), Some(0));
engine.close(RunStatus::Finished);
Dashboard and CLI
exp serve ./experiments # dashboard on :8000
exp list ./experiments # list experiments
exp inspect ./experiments/resnet/runs/20240101_120000
exp clean resnet --keep 5 --force
exp export ./experiments/resnet/runs/20240101_120000 --format csv
MIT licensed. Source on GitHub, packages on crates.io and PyPI, documentation at lokeshmohanty.github.io/expman-rs.