Skip to content

Releases: dmmdea/offload-harness

v0.22.0 — fleet-node server

Choose a tag to compare

@dmmdea dmmdea released this 18 Jul 05:31

The harness can now join a Fleet Dispatcher fleet as a first-class node.

  • fleet-serve — implements the dispatcher's CONTRACT v2 node endpoints: health with live GiB VRAM and measured model footprints, ack-then-poll dispatch (202 + exact echo, idempotent duplicates, failures always non-2xx), and per-job status with ~1h terminal retention. Loopback by default; production binds your tailnet address behind an explicit --listen-trusted-network.
  • Measured footprints, passively — every image/video/audio/run-graph render records its observed VRAM peak per (model family, quant, task) — via the Windows PDH per-process counter set (the only per-process VRAM source under WDDM; nvidia-smi global-delta as fallback) — so the dispatcher routes on what jobs actually cost on this box, offload strategy included, not on full-residency formulas. fleet-measure primes an empty store in one command.
  • Full task surface — image-gen, video-gen, stt, audio-gen, and run-graph (arbitrary ComfyUI graph + self-provisioned node manifest) over the fleet wire.
  • Operator guidedocs/FLEET-NODE.md, including the recommended MSI Afterburner companion setup for per-process VRAM validation and monitoring.

Live-validated cross-box over a tailnet: dispatch → running → duplicate re-ack (exactly one render) → done with results; measured wan2.2 footprint within 0.3 GiB of the dispatcher contract's own worked example.

v0.21.1 — run-graph, warm batch, inpaint, edit ops

Choose a tag to compare

@dmmdea dmmdea released this 17 Jul 22:17

First tagged release since v0.6.2 (closing the stale-release gap — thanks @afelopez for flagging it).

Highlights (0.18 → 0.21.1)

  • offload_run_graph / run-graph — execute any ComfyUI API-format graph under the GPU-lock/zero-warm lifecycle. Self-provisions a per-workflow node manifest: custom node packs at pinned commits, ONE unified uv dependency resolve under host-torch constraints (provisioning never replaces your CUDA torch — it defers instead), models downloaded and sha-verified. Node-addressed outputs, typed defers, never cloud.
  • generate-image --batch — N prompts through one warm ComfyUI session: the checkpoint loads once (measured 22.4s warm floor). Zero-warm remains the single-render default; full teardown at the batch boundary.
  • offload_inpaint_image + mask_boxes — SDXL masked re-denoise inpainting with a per-machine dual model binding, plus --auto-text vision-grounded text removal (3/3 grounding eval).
  • Edit op packgrade (compose-once LUT discipline), lut_cube, perspective_composite (pure-Python homography), finish (delivery sharpen), renditions export matrix, GIMP instantiate_design template factory.
  • Trust-path tests + manifest drift guard — characterization tests for validator/verifier/cache and a .printing-press.json-vs-registered-tools drift test (community contribution by @afelopez, PR #1).

Full details in CHANGELOG.md. Every feature shipped with live hardware acceptance on 8GB and 16GB boxes.

v0.6.2 — GPU-contention fix: vision calls wait for generation jobs instead of failing

Choose a tag to compare

@dmmdea dmmdea released this 04 Jul 21:54

v0.6.2

Fixes the worst production failure mode on single-GPU machines: vision calls (vqa/ocr/assess_image/video_describe) mass-failed with 5xx whenever an image/video generation job occupied the GPU — every failure fell back to your cloud model, burning exactly the tokens this harness exists to save (in one observed incident: 295 defers in a single hour).

  • Vision calls now detect the generation GPU lock and wait (bounded, configurable vision_gpu_wait_sec, default 90s) instead of failing
  • Distinct defer reason + ledger class gpu_busy so contention is visible in ledger reports
  • One automatic retry after 3s on transient 5xx
  • New config: gpu_lock_path, vision_gpu_wait_sec (see regenerated config.example.json)

Upgrade: go install github.com/dmmdea/offload-harness@v0.6.2 or grab the Windows binary below.

v0.6.1 — full cascade, vision/STT/generation tools, self-tuning flywheel, go-install fixed

Choose a tag to compare

@dmmdea dmmdea released this 04 Jul 20:34

local-offload v0.6.1

The first public release since the initial drop — this tag brings the public repo up to the current private mainline (everything from the 0.4.x/0.5.x/0.6.0 internal cycles, plus the 2026-07-03 packaging & robustness patch).

Breaking / Upgrade

  • Module path fixed. The module is now github.com/dmmdea/local-offload, matching this repository, so go install finally works:
    go install github.com/dmmdea/local-offload@latest
    If you previously installed under any older module path (local-offload-pp-cli, offload-harness), delete the old binary and reinstall with the command above. Import paths in forks must be updated to github.com/dmmdea/local-offload/....
  • Config search order is now: --config <path> > $LOCAL_OFFLOAD_CONFIG > ./config.json > ~/.local-offload/config.json > built-in defaults. If you relied on defaults being used despite a config.json sitting in the working directory, that file is now picked up.

Highlights

  • Full self-learning cascade — confidence-gated escalation (logprob class-mass margin + self-reported confidence), per-task conformal thresholds (calibrate), a logistic entry-tier router (train-router), health monitoring + circuit breakers (EWMA / Page-Hinkley / CUSUM, P95 timeouts), few-shot exemplars (optimize), and a kNN entry-tier prefilter — all trained offline and inference-free over the token ledger.
  • Shadow-labeling flywheel — optional capture of live calls, counterfactual replay through other tiers to manufacture training labels, and a rigorous adoption gate (paired-bootstrap CI) that only promotes a retrained artifact when it provably lowers error. The long-running MCP server hot-reloads nightly-retrained weights without a restart.
  • Vision toolsvqa, ocr, extract-image, assess-image on a local VLM tier (grammar-constrained, grounded).
  • Speech-to-texttranscribe (whisper.cpp; turbo + --hq high-quality model, VAD, SRT output) and video understandingvideo-describe (frame sampling).
  • Local media generation (opt-in, single 8 GB GPU, one cross-process GPU slot): image (SDXL via ComfyUI), voice (Chatterbox TTS, zero-shot cloning), music (ACE-Step), video (Hunyuan 1.5 I2V — wired; quality renders want a bigger card), plus a dependency-free SVG data-viz kit (gauge / comparison-bar / chromatogram / icons).
  • Opt-in NVIDIA NIM remote tool (nim / offload_nim) — reach NVIDIA's hosted free-model catalog or a self-hosted NIM for the rare frontier-model task. Key from $NVIDIA_API_KEY env only (never a config field), never counted in the savings ledger; the local cascade is untouched.
  • 15 MCP tools over stdio + the same surface as a single-binary Go CLI.
  • Agent runtime library (internal/agent) — the sandboxed local-agent building blocks (policy cage, write cage, egress control, memory layer) used by the MCP server's agent path.

2026-07-03 packaging & robustness patch (ships in this tag)

  • Relative render-script paths resolve against the executable's directory, so generation tools work from any working directory.
  • Tilde expansion in all path-typed config fields; ./config.json joined the config search order.
  • Bad MCP tool arguments surface as a structured defer carrying the argument error (instead of a generic failure).
  • doctor diffs the live /v1/models roster against every configured model alias; models output is data-driven.
  • The ledger records each defer reason; ledger reports the top defer reasons.
  • The llama client's request budget is split from tier timeouts, and cold-model-swap timeouts no longer trip the circuit breaker.
  • Rune-safe context trimming (no more mid-UTF-8 cut points).
  • The savings ledger labels its estimate honestly: est_value_kept_local.

System requirements

OS Linux, macOS, Windows (agent sandbox cages are Linux-only; everything else is cross-platform)
Go 1.26+ (to build)
GPU NVIDIA, ~8 GB VRAM for the text + vision cascade
RAM / disk 32 GB+ system RAM and a fast SSD recommended (model weights, MoE CPU offload)
Serving a local llama.cpp server, ideally behind a model-swapper (llama-swap) on http://127.0.0.1:11436 with the Gemma-4 QAT family (E2B / E4B / 26B-A4B) — skill/scripts/detect.sh checks your box and skill/scripts/setup.sh installs the whole stack (both env-var driven)
Optional per feature ffmpeg on PATH (audio/video), a whisper.cpp server (STT), ComfyUI (image/music/video generation), Node.js (render scripts), $NVIDIA_API_KEY (hosted NIM tool only)

A defer ({"deferred": true, "reason": ...}) is a normal result, not an error — it means "do this one yourself."