Skip to main content

vlakit

vlakit is a config-driven command-line tool for launching VLA fine-tunes across ephemeral GPU boxes, keeping them alive through crashes, and shipping verified weights to durable storage. You describe a run in YAML and drive everything with a single vla command from your laptop; the actual work runs on a GPU box over ssh, and the durable artifacts land on Weights & Biases and a storage box — never on the GPU box, which you throw away.

It packages a set of battle-tested shell and Python scripts (the ones that encode the hard-won operational lessons) behind a friendly CLI. The scripts ship with the install as read-only package data, while your environment — the boxes, datasets, baselines, and runs — lives in a configs/ directory you own and edit.

Install

vlakit is best installed as an isolated CLI with pipx:

pipx install vlakit

Or with pip. The core install is dependency-light because the laptop-side commands need almost nothing; the heavier pieces are opt-in extras:

pip install vlakit                 # laptop-side: config / remote / launch
pip install "vlakit[stats]"        # adds numpy + pyarrow for `vla stats`
pip install "vlakit[wandb]"        # adds wandb for publish / pull / eval logging
pip install "vlakit[all]"          # everything

Quickstart

vla init                           # scaffold an editable ./configs from templates
# edit configs/boxes.yaml, datasets.yaml, baselines.yaml, and a runs/<name>.yaml
# then copy configs/secrets.example.env -> configs/secrets.local.env and fill it

vla config <run>                   # resolve + print the run config (local, no box)
vla remote <box> deploy            # rsync the toolkit + your configs onto the box
vla remote <box> push-secrets      # install ~/.secrets.env on the box (mode 600)
vla remote <box> ensure-swap       # provision swap (absorbs the checkpoint-save spike)
vla launch <run>                   # launch detached + auto-resume (box read from the run cfg)
vla remote <box> monitor           # step / rate / ETA + liveness

Where each command runs

vlakit keeps a clean split between your laptop and the GPU box. Commands that resolve or inspect configuration — init, config, stats, split, eval, doctor — run entirely on your laptop and need no box. Commands that operate on a machine — everything under vla remote ..., and vla launch — open an ssh connection from your laptop and run the work on the box defined in your boxes.yaml.

Run vla doctor to see exactly which scripts directory and config directory were resolved, and which optional dependencies are installed.

Commands

Command Runs What it does
vla init [dir] laptop Scaffolds an editable configs/ directory from the bundled templates.
vla config <run> laptop Resolves a run (defaults merged under the run) and prints the config plus the exact command, running nothing.
vla remote <box> <subcmd> [args] box Runs an operational subcommand on the box: deploy, push-secrets, ensure-swap, launch, autoresume, monitor, kill, rescale, pull, gpus, exec, shell.
vla launch <run> box Launches the run detached and auto-resuming; the box is read from the run's box: field.
vla stats [args] laptop/box Computes the full dataset statistics (quantiles + image stats) that lerobot and molmo need. Requires the [stats] extra.
vla split [args] laptop Produces a deterministic held-out episode split for validation/eval.
vla eval [args] laptop/box Ranks a checkpoint by held-out error or rollout, not loss. Try vla eval --self-test to verify the harness with no box.
vla doctor laptop Prints the resolved scripts/config directories and optional-dependency status.

Configuration

Your configs/ directory holds everything dynamic, and no secrets ever live in it: keys resolve on the box via ~/.secrets.env. The directory is resolved from --config-dir, then the VLA_CONFIG_DIR environment variable, then ./configs. A run file under runs/ is a thin recipe that names a box, a dataset, and a baseline — each a pointer into the corresponding registry — plus a few hyperparameters; everything else is inherited from _defaults.yaml.

Status

The local commands (init, config, stats, split, eval, doctor) are implemented and tested. The remote commands shell out to the bundled, proven ops scripts; vla remote <box> deploy now ships both the toolkit and your configs/ to the box. The eval offline comparator is implemented and self-tested (vla eval --self-test); its sim and robot rollout modes are still stubs.

Publishing (maintainers)

Releases publish to PyPI automatically through Trusted Publishing (OIDC), so no API token is stored anywhere. The workflow is .github/workflows/release.yml.

One-time setup:

  1. On PyPI, add a pending Trusted Publisher (Account → Publishing) with these exact values:
    • PyPI Project Name: vlakit
    • Owner: kkipngenokoech
    • Repository name: vlakit
    • Workflow name: release.yml
    • Environment name: pypi
  2. In the GitHub repo, create an Environment named pypi (Settings → Environments).

To cut a release, tag a version that matches pyproject.toml and push it:

git tag v0.1.0
git push origin v0.1.0

The workflow builds the sdist + wheel, verifies the bundled scripts/templates are inside the wheel, checks the tag matches the package version, and publishes. After the first successful run the pending publisher becomes a normal one, and pipx install vlakit works for everyone.

License

MIT — see LICENSE.

Metadata

Release files for vlakit 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vlakit 0.1.0
File Size Uploaded
vlakit-0.1.0.tar.gz 60.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vlakit 0.1.0
File Interpreter ABI Platform
vlakit-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 147.8 kB

Release files / vlakit-0.1.0.tar.gz

Download URL vlakit-0.1.0.tar.gz
Size 60.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1e4046089974e48de7dc3163d21b7c3cc4f0b4a9c20e8c475f65c6b6ee8d17ca
BLAKE2b-256 checksum
How to use checksums
fc35ce8b433097960399b33df3e0a9b0bb292a5d87ceae6f4ab3135dde480872
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 Jun 23, 2026.

Transparency log

Release files / vlakit-0.1.0-py3-none-any.whl

Download URL vlakit-0.1.0-py3-none-any.whl
Size 87.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
97858e11830273e689705a8e81d48160fc426489b820c0638aa9058ccaac330a
BLAKE2b-256 checksum
How to use checksums
5c4d73467f8e0015a817736dd678687d45b8dac3fa182be41b1a97d1b8342d4f
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 Jun 23, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release 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