From c485940adefb7974b4fba4d761cf65a14bd7c15f Mon Sep 17 00:00:00 2001
From: webdevtodayjason
Date: Mon, 6 Jul 2026 20:25:11 -0500
Subject: [PATCH] docs: sync README to 0.5.2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Audit README against v0.5.2 reality (CHANGELOG 0.4.44→0.5.2 + source
truth) and fix drift only — no restructure:
- Fix broken "What Works" anchor (april → june 2026).
- Install: installer resolves + pins the highest numeric GHCR tag to
~/.ainode/image.env; swappable systemd unit (EnvironmentFile,
Restart=always) survives cold power cycles and replays loaded models.
- Update: tag → CI (self-hosted Spark runner) → GHCR pipeline;
`ainode update [version]` and `POST /api/cluster/update-all` do a real
pull + swap. Drop stale AINODE_IMAGE=…:0.4.1 example; bump pin example
to 0.5.2.
- Features: add per-load overrides (persisted), node-targeted load,
stacked-load admission guard (409 > 0.9), VLM fp8-KV auto-skip,
training + adapter-merge in a spawned GPU container, deploy pipeline,
cancellable commit-pinned parallel downloads, delete-from-disk,
AutoData v2.2. Mirror the shipped items into the roadmap.
- Fix ssh-copy-id host typo (10.0.0-2 → 10.0.0.2).
Co-Authored-By: Claude Fable 5
Claude-Session: https://claude.ai/code/session_017NziXzqT1L9kj2T1byA3Ak
---
README.md | 53 +++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 41 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index 90b3e76..898a7dc 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ platform, open source ChatGPT alternative.
·
Screenshots
·
- What Works / What Doesn't
+ What Works / What Doesn't
---
@@ -138,16 +138,22 @@ current member list with per-node role, address, and last-seen.
```bash
curl -fsSL https://ainode.dev/install | bash
```
- That one-liner performs:
+ That one-liner:
```
- docker pull ghcr.io/getainode/ainode:latest
+ # resolves the highest numeric GHCR tag (never a floating :latest)
+ docker pull ghcr.io/getainode/ainode:
+ # pins it to ~/.ainode/image.env and installs a swappable systemd unit
systemctl enable --now ainode.service
```
+ The unit reads the pinned image from `~/.ainode/image.env`
+ (`EnvironmentFile`, `Restart=always`), so it survives cold power
+ cycles and **replays the models you had loaded** on boot.
3. **Open the UI** at `http://:3000`. First-run onboarding walks
you through picking a model. Click a model card → click **Launch** →
chat.
-Upgrade is `ainode update` (pulls the latest image and restarts).
+Upgrade is `ainode update` (resolves + pulls the newest pinned release
+and restarts) — or `ainode update 0.5.2` to pin a specific version.
**Prefer to pull the image yourself?** Both registries serve identical
images — GHCR is canonical (what the installer uses), Docker Hub is a
@@ -156,7 +162,7 @@ public mirror:
```bash
docker pull ghcr.io/getainode/ainode:latest # canonical (always newest)
docker pull argentaios/ainode:latest # Docker Hub mirror
-# pin a release instead: …/ainode:0.5.0
+# pin a release instead: …/ainode:0.5.2
```
### Two nodes (distributed mode)
@@ -187,7 +193,7 @@ across two DGX Sparks:
}
```
```bash
- ssh-copy-id sem@10.0.0-2 && sudo systemctl restart ainode
+ ssh-copy-id sem@10.0.0.2 && sudo systemctl restart ainode
```
5. **Open the head UI** — you should see both nodes, aggregated VRAM
("2 nodes · 244 GB · 2 GPUs"), and the instance badged as
@@ -266,6 +272,15 @@ set the read token with `ainode config --hf-token hf_xxx`.
| Model stacking — N concurrent models per node, persisted + replayed on boot | ✅ |
| Serve models from on-disk weights (`~/.ainode/models/`) | ✅ |
| fp8 KV-cache default on GB10 (long-context headroom) | ✅ |
+| Per-load overrides (`served_model_name` / `max_model_len` / `kv_cache_dtype` / `quantization` / `trust_remote_code`), persisted across restarts | ✅ v0.5.0 |
+| Node-targeted model load (`POST /api/cluster/load {node_id}`) | ✅ v0.5.1 |
+| Stacked-load admission guard — explicit `gpu_memory_utilization` required, reject > 0.9 projected total (409) | ✅ v0.5.1 |
+| VLM (vision) support — fp8 KV auto-skipped on GB10; `kv_cache_dtype=auto` per-load override | ✅ v0.5.1 |
+| LoRA / QLoRA training **and** adapter merge run in a spawned GPU container (slim orchestrator has no torch) | ✅ v0.5.0 |
+| Deploy pipeline — `git tag` → CI (self-hosted Spark runner) → GHCR → `ainode update` / cluster update-all (genuine pull + swap) | ✅ v0.5.0 |
+| Cancellable, commit-pinned, parallel model downloads | ✅ v0.5.2 |
+| Delete a downloaded model from disk (`delete-repo`, frees GB) | ✅ |
+| AutoData — Δ-filtered synthetic-data generation (v2.2 val-set lift objective) | ✅ v0.5.0 |
---
@@ -479,7 +494,7 @@ into the running container via `docker exec`. You never need to type
`docker` yourself.
```bash
-ainode update # docker pull + restart service (upgrade in place)
+ainode update [version] # resolve/pull newest (or pinned) tag + restart (upgrade in place)
ainode start # Start AINode (inference + web UI)
ainode stop # Stop AINode
ainode status # Show cluster status
@@ -492,21 +507,31 @@ ainode logs -f # Tail the engine log
### Updating AINode
-New releases ship as a new container image tag. To upgrade in place:
+Releases ship through a **tag-triggered pipeline**: `git tag vX.Y.Z` →
+CI on a self-hosted Spark runner builds and pushes
+`ghcr.io/getainode/ainode:X.Y.Z`. To upgrade a node in place:
```bash
ainode update
```
-That runs `docker pull ghcr.io/getainode/ainode:latest` and restarts
-the systemd service. Your config (`~/.ainode/config.json`), models
+That resolves the **highest numeric GHCR tag** (never a floating
+`:latest`), pulls it, pins it to `~/.ainode/image.env`, and restarts the
+systemd service. Your config (`~/.ainode/config.json`), models
(`~/.ainode/models/`), and fine-tune outputs are on the host — the
container is stateless, so upgrades never touch your data.
-To pin a specific version instead of `:latest`:
+To pin a specific version:
```bash
-AINODE_IMAGE=ghcr.io/getainode/ainode:0.4.1 ainode update
+ainode update 0.5.2
+```
+
+To roll every node in a cluster from the master, use the **Update all**
+button or:
+
+```bash
+curl -X POST http://:8000/api/cluster/update-all # genuine pull + swap on every node
```
---
@@ -607,6 +632,10 @@ scrape_configs:
- [x] In-browser quantization (AWQ / NVFP4) + push to Hugging Face
- [x] Federated multi-model serving (master routes `/v1/*` by model name)
- [x] Model stacking (N models per node, persisted + replayed)
+- [x] Training + adapter-merge in a spawned GPU container (slim orchestrator)
+- [x] Deploy pipeline (tag → CI → GHCR → `ainode update` / cluster update-all)
+- [x] VLM (vision) serving with fp8-KV auto-skip on GB10
+- [x] AutoData — Δ-filtered synthetic-data generation (val-set lift objective)
- [ ] Model marketplace (custom registries)
- [ ] Mobile-friendly UI