Skip to main content

mainboard

Run batch jobs anywhere without caring about system setup.

One file, mainboard.toml, declares your dependencies, your environments, your container base images, and every machine you run on, from your laptop to a PBS supercomputer to a cloud GPU provider. One interface runs, submits, tracks, probes, and profiles across all of them.

from mainboard import Board

board = Board()                            # finds mainboard.toml like git finds a repo
board.run("python train.py")               # here, in the activated environment
board.on("gold").run("nvidia-smi")         # any ssh box, same call
job = board.on("miyabi-g").submit(         # a PBS cluster, inside an NGC container,
    "python -m experiments.run",           # with queue policy checked before any ssh
    walltime="06:00:00",
)
job.wait(); print(job.logs()); job.pull()

The same surface as a CLI:

$ mainboard run --on gold -- nvidia-smi -L
GPU 0: NVIDIA GB10 (UUID: GPU-6a5c...)
$ mainboard facts --on gold | head -4
{
  "schema_version": 1,
  "hostname": "gold",
  "cpu_name": "10x Arm Cortex-A725 + 10x Arm Cortex-X925",
$ mainboard submit --on miyabi-g --attempt 2 -- python -m experiments.run
2231259
$ mainboard monitor --json          # one durable pass, what a cron runs
{"running": 1, "finished": [], "failed": [], "unreachable_hosts": [], "changed": false}
$ mainboard compute --agent         # every path this workspace can run on
name      kind      access       detail                 usd_hr  credit_usd
local     local     here         1x RTX 4090, 135 GB RAM
gold      ssh       ready        1x GB10, 129 GB RAM
miyabi-g  pbs       unreachable  ssh connect timed out
vast      provider  keyed        1x RTX 4090 Sweden, SE  0.2978  99.9968

compute answers what there is to run on before anything is dispatched: this machine, every declared host with whether it answers and whether it was set up, and every provider with whether its credentials are here and what the account has left. No credential is ever printed, only whether one was found.

monitor is the sweep that makes a dispatched job's outcome survive the process that dispatched it. Each pass probes every job still owed an outcome, pulls back the results of the ones that just finished, records their verdicts in the study ledgers that own them, and reports only what changed, so a schedule of passes never announces the same job twice and a host that is down is one line in the report rather than a failed sweep.

One file

[deps]
python = ">=3.14"

[python.deps]
torch = ">=2.9"

[containers.ngc]
image = "nvcr.io/nvidia/pytorch:25.06-py3"   # fixed off-the-shelf image, never rebuilt
                                             # your env lives on a bound host path inside it

[hosts.gold]
kind = "ssh"
root = "/home/pedro/projects"

[hosts.miyabi-g]
kind = "pbs"
container = "ngc"
account = "xg25g007"
modules = { singularity = "4.2.1" }

[hosts.miyabi-g.queues.short-g]
max-walltime = "07:59:59"       # the scheduler's real rejection boundary, enforced
mem-ceiling-gb = 100            # before your job ever leaves the laptop

[hosts.miyabi-g.defaults]
queue = "debug-g"
mem-gb = "min(100, attempt * 50)"   # retries escalate instead of dying twice

Profiles inherit [hosts.defaults], values interpolate ({{ env('LOCALDIR') }}, {{ num_cpus() }}), and queue policies are data the tool enforces at submit time with the error you wish the scheduler gave you.

What it replaces

  • environment managers that cannot name a host
  • dispatch scripts that cannot solve an environment
  • container workflows that rebuild an image per dependency change
  • profilers that stop at one process on one machine
  • the prose wiki page about your cluster's queue limits

Under the facade: pixi-powered multi-ecosystem environments (conda plus PyPI and friends) that provision inside off-the-shelf containers via bind-mounted prefixes, an ssh/PBS/SLURM/pueue dispatch core with durable job records and verdict lifecycles, hardware probing (GPUs, cgroup memory caps, scratch, InfiniBand fabric) as a versioned wire format, and a profiling stack (spans, CUPTI, Perfetto merge manifests) that lands multiple machines on one queryable timeline. Experiment studies group many simultaneous jobs under one identity with content-addressed run ids and declared data needs.

Status

0.1.0. Validated live on x86 and Grace hosts over ssh and pueue; PBS and container paths covered by the test suite (1332 tests, 100 percent branch coverage). The provider router, board.on("auto"), scoring hosts by fit, price, and time to result across private clusters and commercial GPU clouds, is under active development.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mainboard-0.1.0.tar.gz (365.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mainboard-0.1.0-py3-none-any.whl (304.9 kB view details)

Uploaded Python 3

File details

Details for the file mainboard-0.1.0.tar.gz.

File metadata

  • Download URL: mainboard-0.1.0.tar.gz
  • Upload date:
  • Size: 365.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for mainboard-0.1.0.tar.gz
Algorithm Hash digest
SHA256 895dbc9d12de6ab35cd45ddba71b8e8dd8568900a650ac2c361b49c9395b39b3
MD5 26e90256dcd2c7bfc85d04dbae666912
BLAKE2b-256 7047ee5c8672177b59f2f161718a6ac1da93315fb7401f1037edd597e84602fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for mainboard-0.1.0.tar.gz:

Publisher: publish.yml on phvv-me/mainboard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mainboard-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mainboard-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 304.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for mainboard-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 73d9618f0837ada5d1eecb5f23f10a716161e02ab4e4b7b89b371a5405c2258f
MD5 fd95ed5e55d5615d56970620101c7427
BLAKE2b-256 0190d320e8fe764be1285cd08e5afd0643002fec8022db51f9c640f682271f7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for mainboard-0.1.0-py3-none-any.whl:

Publisher: publish.yml on phvv-me/mainboard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.4.8

2 files

0.4.7

2 files

0.4.6

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.2

2 files

0.1.1

2 files

This release

0.1.0 This release

2 files

0.0.9

2 files

0.0.8

2 files

0.0.6

2 files

0.0.5

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page