mushin
Boilerplate-free, reproducible machine-learning experiment sweeps:
a framework-agnostic sweep engine built on
hydra-zen,
with first-class PyTorch Lightning integration.
Decorate an experiment, sweep over parameters, and get the results back as a
labeled xarray.Dataset, not rows in a dashboard you have to export.
- Boilerplate-free: one decorator, no subclassing, no callbacks. Results come back as a labeled dataset you can slice and plot.
- Reproducible: every run captures its config + provenance, sweeps resume durably after a hard kill or cluster preemption, and auto-tuning pins a hardware-independent effective batch size.
- Scalable: the same task runs in-process, across cores, or on a multi-node SLURM cluster (validated on real GPU hardware); change only the launcher.
- Framework-agnostic: your task just returns a
dict, so scikit-learn, XGBoost, or any Python model works, not only PyTorch.
Quickstart
import mushin
@mushin.sweep
def experiment(lr, seed):
# ... train a model with this lr/seed, then evaluate it ...
acc = ... # your validation accuracy
return dict(accuracy=acc) # whatever you return becomes a data variable
ds = experiment.run(
lr=mushin.multirun([0.01, 0.1, 1.0]),
seed=mushin.multirun([0, 1, 2]),
) # 9 runs, returned as a labeled xarray.Dataset
# <xarray.Dataset> Dimensions: (lr: 3, seed: 3)
# Data variables: accuracy (lr, seed)
ds["accuracy"].mean("seed") # average over seeds, per learning rate
# Prefer pandas? One call gives a tidy table — no xarray required:
experiment.workflow.to_dataframe() # lr seed accuracy
# 0 0.01 0 ...
The decorator version above runs as
examples/parallel_sweep.py;
examples/sweep_to_dataset.py is the same flow
written with the class API. Need the full tool (.failures, provenance, custom
analysis)? Drop to experiment.workflow, or subclass
MultiRunMetricsWorkflow.
Prefer to start from a notebook? There are seven runnable ones, executed in CI so they cannot rot: sweeps → datasets, compare & batteries, studies, resilient sweeps, LLM eval, scikit-learn, and analyzing results.
What else it does
Each links to a guide with a runnable example:
- Compare methods with statistics:
benchmark.compareruns a metric battery (torchmetrics) across seeds and returns a labeled dataset plus significance (scipy);Studyruns the training sweep and feeds it straight in. - Compare LLM systems: the same significance spine for LLM evals, with Holm-corrected p-values and an optional output cache.
- Built-in batteries: classification, segmentation, detection, regression, retrieval, image-quality, audio.
- Resilient & resumable sweeps:
on_error="nan", durableresume=Trueacross hard kills/preemption, and per-run provenance. - Parallel & out-of-process launchers:
run(..., launcher="joblib")or submitit; stdlib-picklable dispatch. - Multi-node & sharded training:
HydraDDP/HydraFSDPandpin_gpu_round_robinGPU packing, validated on a real SLURM cluster. - Auto-tuning:
tune_batch_size/tune_learning_rate, pinned for reproducibility. - Analyze from Claude Code (MCP): an optional read-only MCP server to load and inspect completed runs.
Installation
pip install mushin-py # the sweep -> dataset core
pip install "mushin-py[eval]" # + compare, metric batteries, LLM eval, Study
With uv:
uv add mushin-py # the sweep -> dataset core
uv add "mushin-py[eval]" # + compare, metric batteries, LLM eval, Study
(uv pip install mushin-py also works outside a uv project.)
The PyPI distribution is mushin-py, but you import mushin: the same
pattern as scikit-learn → sklearn.
The core install is the sweep → dataset workflow. The eval extra adds the
evaluation layer (compare, the metric batteries, LLM evaluation, Study) and
its heavier dependencies (torchmetrics, scipy), keeping the core lean; using
those features without it raises a clear install hint. The other extras are
viz, netcdf, detection, image, audio, and mcp; the three battery
extras pull in eval for you. Combine them with commas, e.g.
"mushin-py[eval,viz]", which works verbatim with pip install, uv add, or
uv pip install.
Supported Python: 3.11 – 3.14 (3.15 is waiting on two upstream fixes). See the install guide for the full extras table and the platform/torch/NumPy support matrix.
Versioning & scope
mushin follows SemVer with pre-1.0 semantics: a minor bump (0.8 → 0.9) may
contain breaking changes, always listed with migration notes in the
changelog; patch releases never break. The public API is the
top-level mushin namespace plus the documented mushin.benchmark /
mushin.llm symbols. Underscore modules are internal. The project's scope is
deliberately narrow: boilerplate-free, reproducible sweep → dataset, with
an optional evaluation layer behind the eval extra. It complements, and
does not replace, experiment trackers like W&B or TensorBoard (see the
workflows guide for
using both together).
Citation
If you use mushin in your research, please cite it (the concept DOI always resolves to the latest release):
@software{martinez_mushin,
author = {Martínez-Martínez, Josué},
title = {mushin: boilerplate-free, reproducible machine-learning experiment sweeps},
year = {2026},
version = {0.15.1},
doi = {10.5281/zenodo.21436444},
url = {https://github.com/martinez-hub/mushin}
}
GitHub's "Cite this repository" button (from CITATION.cff)
generates this for you.
Contributing
Issues and pull requests are welcome. Local development uses uv:
uv sync
uv run pytest tests/ --hypothesis-profile fast # tests (DDP test needs >=2 GPUs)
uv run ruff check . && uv run ruff format --check .
Or make check (lint + format + spell + tests, as CI runs). See
CONTRIBUTING.md.
Disclaimer
mushin is a maintained, standalone carve-out of the rai_toolbox.mushin
subpackage from MIT Lincoln Laboratory's
responsible-ai-toolbox
(no longer maintained). This is a fork/extraction, not a replacement endorsed by
MIT-LL; the original MIT copyright is retained (see LICENSE.txt).
The configuration engine it builds on, hydra-zen, is actively maintained by the
same group.
Metadata
Release files for mushin-py 0.15.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mushin_py-0.15.1.tar.gz | 207.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mushin_py-0.15.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 346.1 kB
Release files / mushin_py-0.15.1.tar.gz
| Download URL | mushin_py-0.15.1.tar.gz |
|---|---|
| Size | 207.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e11b9c3cff451cefa9b33322c92501eff11c89ef850597b77b440e4ed50ffec9
|
|
BLAKE2b-256 checksum How to use checksums |
429d3fa602740bab7caea0ab8068095dbdcbb89dbbf407e2433719564f88cca1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / mushin_py-0.15.1-py3-none-any.whl
| Download URL | mushin_py-0.15.1-py3-none-any.whl |
|---|---|
| Size | 138.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d7c19b1ed37e92bd755d26184c0d4b154a9717436b760774bce4b417cb4f170a
|
|
BLAKE2b-256 checksum How to use checksums |
c240702da177ff6589aa4f14d064c06173918bcc8c0e4a5bab1ab8fa95faf1c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log