High-performance experiment manager with Rust backend
Project description
Experiment Manager built using Rust
High-performance experiment manager written in Rust, with a Python wrapper for non-blocking logging, a live web dashboard, and a friendly CLI.
Features
- Non-blocking Python logging:
log_metrics()is a ~100ns channel send — never blocks your training loop - Live dashboard: SSE-powered real-time metric streaming, run comparison charts, artifact browser
- Scalar metric filtering: Toggle which metric columns appear in the runs table with one click
- Single binary: CLI + web server in one
expbinary — no Python runtime needed for the server - Efficient storage: Batched Arrow/Parquet writes, not per-step read-concat-write
- Nix dev environment: Reproducible with
nix develop
Screenshots
Installation
From Cargo
cargo install expman-cli
From PYPI
pip install expman-rs
Alternatively: Download or Install from GitHub
-
Direct Download: Download the pre-built
expbinary or Python wheels from GitHub Releases. -
Python (pip):
pip install git+https://github.com/lokeshmohanty/expman-rs.git
-
Rust (cargo):
cargo install --git https://github.com/lokeshmohanty/expman-rs.git expman-cli
Quick Start
Python
Option A: Global Singleton (Easiest)
import expman as exp
exp.init("resnet_cifar10")
exp.log_params({"lr": 0.001})
exp.log_metrics({"loss": 0.5}, step=0)
# Auto-closes on script exit
Option B: Context Manager (Recommended for scope control)
from expman import Experiment
with Experiment("resnet_cifar10") as exp:
exp.log_metrics({"loss": 0.5}, step=0)
For Rust
Basic usage:
use expman::{ExperimentConfig, LoggingEngine, RunStatus};
fn main() -> anyhow::Result<()> {
let config = ExperimentConfig::new("my_rust_exp", "./experiments");
let engine = LoggingEngine::new(config)?;
engine.log_metrics([("loss".to_string(), 0.5.into())].into(), Some(0));
engine.close(RunStatus::Finished);
Ok(())
}
Dashboard
exp serve ./experiments
# Open http://localhost:8000
CLI
exp list ./experiments # list all experiments
exp list ./experiments -e resnet # list runs for an experiment
exp inspect ./experiments/resnet/runs/20240101_120000
exp clean resnet --keep 5 --force # delete old runs
exp export ./experiments/resnet/runs/20240101_120000 --format csv
Development (Nix)
nix develop # enter dev shell
just test # run all tests
just dev-py # build Python extension (uv pip install -e .)
just serve ./experiments # start dashboard
just watch # watch mode for tests
just build-docs # build and open documentation
Documentation
For detailed usage, refer to the standalone documentation files for each component:
expman-cli- Command-line interface definitions and references.expman- Core high-performance async Rust logging engine.expman-py- Python extension for non-blocking logging.expman-server- Axum web server and SSE live streaming API.
Dashboard Features
- Live Metrics: Real-time SSE streaming of experiment metrics and logs.
- Live Jupyter Notebooks: Instantly spawn a live Jupyter instance natively bound to any run's execution environment directly from the UI, with auto-generated analytics boilerplate (Polars).
- Scalar Filter: Toggle individual metric columns in the Runs table via chip buttons — no page reload.
- Deep Inspection: View detailed run configurations, metadata, and artifacts.
- Artifact Browser: Preview
parquet,csv, and other files directly in the browser. - Comparison View: Overlay multiple runs on a shared timeline for analysis.
- Server-side filtering: Pass
?metrics=loss,accto/api/experiments/:exp/runsto limit which scalars are returned.
Examples
Practical code samples are provided in the examples/ directory:
- Python: examples/python/basic_training.py
- Rust: examples/rust/logging.rs
To run the Python examples, ensure you have built the extension first with just dev-py.
To run the Rust example, use:
cargo run --example logging -p expman
Experiments Layout
experiments/
my_experiment/
experiment.yaml # display name, description
20240101_120000/ # run directory
metrics.parquet # all logged metrics (Arrow/Parquet)
config.yaml # logged params/hyperparameters
run.yaml # run metadata (status, duration, timestamps)
run.log # text log
artifacts/ # user-saved files
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 Distributions
Built Distributions
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 expman_rs-0.2.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: expman_rs-0.2.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.0 MB
- Tags: PyPy, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a937d9b7d7131c1d58712d51a0c57034466e7a37033114eb6f6e46968a7bbf0
|
|
| MD5 |
fde5bd362dfccfeadec112a3d68354ae
|
|
| BLAKE2b-256 |
6c00abeedb3ea7426056856b0737a61250c7ff7c7379e71bd2aa2edd7cf51cad
|
File details
Details for the file expman_rs-0.2.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: expman_rs-0.2.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.0 MB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b180c5358cd7c1b1b0971915e208c2f63d9554bd50e6961a672147fcc9842133
|
|
| MD5 |
5361341d3ea2389947689c2ed5e97459
|
|
| BLAKE2b-256 |
21f8aca1c1d4209eb2a130e1744f73cdc4d4e5f193b6e1a0995ebbb692fd5861
|
File details
Details for the file expman_rs-0.2.8-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: expman_rs-0.2.8-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.5 MB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdafe078e44cdfbade1b69b3bb304b15371690ab78ae6fb900ab61e83eba4733
|
|
| MD5 |
98b205488abd493bb1518b201fde8165
|
|
| BLAKE2b-256 |
27289456d37fc937b63d98e192fc2188a7dad6fd3bc4c34733b06f58316ffb78
|