Live worker-count tuning — a − / + control (POST /concurrency), not just an env. The worker is now a pool of slots (shared model → slots add concurrent inference, not N× VRAM). Start/Stop + the dial replace pause/resume.
Fast orphan recovery (three layers)
Graceful release on stop / pool-shrink: a slot hands its still-leased jobs back to pending instantly (/api/gpu/jobs/release).
Lease TTL 300→180s — faster hard-crash recovery, still above any single job.
Backend (release/recover/TTL/sweep) is CI-tested (1009 passed); the agent half is verified by running. Triggers a build-agent republish (includes the cuDNN base).
## Agent control UI
- **GPU load readout** (nvidia-smi): util %, VRAM used/total + bar, temp.
- **Live worker-count tuning** — a − / + control (`POST /concurrency`), not just an env. The worker is now a pool of slots (shared model → slots add concurrent inference, not N× VRAM). Start/Stop + the dial replace pause/resume.
## Fast orphan recovery (three layers)
- **Graceful release** on stop / pool-shrink: a slot hands its still-leased jobs back to `pending` instantly (`/api/gpu/jobs/release`).
- **60s recovery sweep** (`recover_orphaned_gpu_jobs` beat): resets expired leases (hard-crashed agent), keeps queue counts honest.
- **Lease TTL 300→180s** — faster hard-crash recovery, still above any single job.
Backend (release/recover/TTL/sweep) is CI-tested (1009 passed); the agent half is verified by running. Triggers a `build-agent` republish (includes the cuDNN base).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
So work an agent orphaned gets picked back up quickly, three layers:
- GpuJobService.release(): a graceful agent stop hands its still-leased jobs back
to pending instantly (POST /api/gpu/jobs/release), no waiting out the lease.
- GpuJobService.recover_orphaned() + recover_orphaned_gpu_jobs Celery task on a
60s beat: resets expired leases (a hard-crashed agent) to pending and keeps the
queue counts honest even when nothing is leasing.
- Lease TTL 300→180s: still well above any single job (a capped-frame video embed
is tens of seconds, and a live worker heartbeats), but a hard crash recovers
faster once the sweep fires.
Tests: release returns-to-pending (token-scoped), recover_orphaned resets only
expired leases, release API round-trip.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
Control UI gains what the operator asked for:
- GPU load (nvidia-smi): util %, VRAM used/total + bar, temp — so you can see how
hard the card is working while you're at the desktop.
- Worker count is now a live − / + control (POST /concurrency), not just an env:
the worker is a pool of independent slots (shared model, so slots add concurrent
inference, not N× VRAM). Dial up for speed, down to free the card. Replaces
pause/resume with Start/Stop + the worker dial.
- Graceful release on stop / pool-shrink: a slot hands its still-leased jobs back
via client.release() so they're re-picked immediately (pairs with the server
recovery sweep).
Not CI-tested (agent/ outside CI) — verified by running.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Agent control UI
POST /concurrency), not just an env. The worker is now a pool of slots (shared model → slots add concurrent inference, not N× VRAM). Start/Stop + the dial replace pause/resume.Fast orphan recovery (three layers)
pendinginstantly (/api/gpu/jobs/release).recover_orphaned_gpu_jobsbeat): resets expired leases (hard-crashed agent), keeps queue counts honest.Backend (release/recover/TTL/sweep) is CI-tested (1009 passed); the agent half is verified by running. Triggers a
build-agentrepublish (includes the cuDNN base).🤖 Generated with Claude Code