LiteRunner
Overview
Runner for generative models with local and W&B tracking.
Write a small Python script per model that declares params, outputs, and metrics.
lite-runner handles the rest: CLI parsing, interactive prompts for missing values,
subprocess execution, stdout/stderr capture, metric extraction, file uploads to W&B,
and code snapshots for reproducibility.
Quick start
Create a run.py for your model:
#!/usr/bin/env -S uv run
# /// script
# dependencies = ["lite-runner"]
# ///
from lite_runner import Runner, Param, Metric
runner = Runner(
command="python generate.py",
params=[
Param("prompt", help="Text prompt"),
Param("seed", type="int", default=42),
Param("output-path", value="$output/video.mp4", type="path-video"),
],
metrics=[
Metric("loss", pattern=r"loss=([\d.]+)"),
],
)
if __name__ == "__main__":
runner.run()
Then run it (requires uv):
chmod +x run.py
./run.py --prompt "a cat walking" # interactive TUI fills missing params
./run.py --prompt "a cat" --no-interactive # non-interactive, fail if missing
./run.py --prompt "a cat" --dry-run # print command, don't run
./run.py --seed=- # unset a param (omit from command)
./run.py --image - - - # unset a multi-value param
What it does
Each runner.run() call:
- Parses CLI args (all params are optional in argparse; missing ones trigger TUI prompts)
- Creates an output directory at
~/lite_runs/<project>/<timestamp>_<run_name>/ - Inits a W&B run and logs all params, git info, and host metadata
- Saves a code snapshot (git archive + dirty diff) as a W&B artifact
- Builds and runs the subprocess, streaming stdout/stderr to terminal and log files
- Extracts metrics from stdout via regex
- Uploads output files (videos, images, artifacts) to W&B
- Logs duration, exit code, and status to W&B summary
Param
Param("name") # basic string param
Param("seed", type="int", default=42) # typed with default
Param("mode", choices=["fast", "quality"]) # select from choices
Param("image", type="path-image") # file input, uploaded to W&B before run
Param(
"output-path",
value="$output/video.mp4", # fixed value, $output interpolated
type="path-video",
) # uploaded to W&B after run
Param(
"input-image",
type=["path-image", "float", "float"], # multi-value flag
labels=["img", "start", "strength"],
) # each part prompted separately in TUI
value=makes a param fixed (never prompted, not in CLI)default=can be a callable (called at prompt time to compute the default)$outputin value is replaced with the run's output directorytype="path-*"encodes upload intent:"path-video"— upload as video to W&B"path-image"— upload as image"path-artifact"— upload as artifact"path-text"— upload as text"path"— file path, no auto-upload
log_when=auto-inferred:"before"for inputs,"after"for$outputpathstype=[...]gives per-element types for multi-value flags (nargs inferred from length)- Pass
-on CLI to unset a param (omit it from the subprocess command). For single-value:--seed=-. For multi-value:--image - - -(one-per element). This mirrors typing-at the interactive TUI prompt.
Output
For files the model writes to uncontrolled locations:
Output("model_metadata.json", log_as="artifact", copy_to="$output/model_metadata.json")
Supports glob patterns and directory zipping:
Output("debug/**/*.png", log_as="image") # upload each matched png
Output("debug/", log_as="image") # upload each file in directory
Output("debug/", log_as="zip") # zip entire directory, upload as artifact
Output("$output/frames/*.jpg", log_as="zip") # zip glob matches into archive
Metric
Extract values from stdout:
Metric("loss", pattern=r"loss=([\d.]+)")
Metric("status", pattern=r"status: (\w+)", type="str")
Last match wins. Stored in wandb.run.summary.
Sweeps
Loop with override(). Runs are grouped in W&B for easy comparison:
runner = Runner(
command="python gen.py",
params=[...],
run_group="lr-sweep", # groups all runs together in W&B UI
)
for lr in [1e-3, 1e-4, 1e-5]:
runner.override(learning_rate=lr).run(no_interactive=True)
Each call creates a separate W&B run, all grouped under the same group.
You can also update metadata per-run:
runner.override(seed=42).with_metadata(tags=["baseline"]).run()
Runner options
Runner(
command="python gen.py", # str or list[str] (list avoids shell splitting)
params=[...],
outputs=[...],
metrics=[...],
tags=["experiment-1"], # W&B run tags
env={"CUDA_VISIBLE_DEVICES": "0"}, # extra env vars for subprocess
project="my-project", # default: git repo name
run_group="my-sweep", # W&B run group for sweeps (None = no grouping)
)
Pipeline API
Each method returns a new Runner (immutable copies), so you can branch:
base = runner.parse_cli() # parse sys.argv
r1 = base.override(seed=42) # override params by name
r2 = base.override(seed=99)
r1.run() # auto-resolves defaults & prompts
r2.run()
Methods:
| Method | Description |
|---|---|
parse_cli(argv) |
Parse CLI args (default: sys.argv[1:]) |
override(**kwargs) |
Set param values by name |
with_metadata(project=, run_group=, tags=) |
Update W&B metadata |
resolve_defaults() |
Apply defaults and fixed values |
ask_user(no_interactive=) |
Prompt for missing values |
run(...) |
Auto-calls any unapplied steps, then executes |
run() accepts kwargs dry_run, min_free_space_gib, no_interactive, no_wandb, project, run_name as alternatives to CLI flags.
Built-in CLI flags
| Flag | Description |
|---|---|
--dry-run |
Print command and exit |
--min-free-space-gib N |
Minimum free disk space in GiB (default: 1.0) |
--no-interactive |
Fail if required params missing |
--no-wandb |
Skip W&B logging (still logs to JSON) |
--run-name NAME |
Override W&B run name |
--project NAME |
Override project name |
What gets logged to W&B
| Location | Content |
|---|---|
run.config["param/*"] |
All param values |
run.config["git/*"] |
commit, branch, repo, dirty |
run.config["meta/*"] |
hostname, datetime, command |
run.summary |
exit_code, duration_seconds, status, metrics |
| Artifacts | Log files, code snapshot, artifact-type outputs |
| Media | Videos and images from path-* type params/outputs |
Contributing
Interested in contributing? See CONTRIBUTING.md for development setup and guideline.
Metadata
Release files for lite-runner 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lite_runner-0.2.0.tar.gz | 149.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lite_runner-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 173.2 kB
Release files / lite_runner-0.2.0.tar.gz
| Download URL | lite_runner-0.2.0.tar.gz |
|---|---|
| Size | 149.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
beebf96e67e27af19792fb4acac6f1127960aca9168f41db71ed45aed8ba0e57
|
|
BLAKE2b-256 checksum How to use checksums |
9e2a0d6d23414dbabb6af7dfbcc2b3afe420bc08cc852978609ccfd85153d7bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 9, 2026.
Transparency logRelease files / lite_runner-0.2.0-py3-none-any.whl
| Download URL | lite_runner-0.2.0-py3-none-any.whl |
|---|---|
| Size | 24.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
74a4f4bbacb7a2ed63703cac9f92ecddbb963b65d79101c067ca00f3e65f52be
|
|
BLAKE2b-256 checksum How to use checksums |
a39ee1c724eeaf56f8e5042fc1c35738340d3de512161a1ace90a4d64c466ead
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 9, 2026.
Transparency log