docs(vault): halogen NPU lane on the current pin, and the greedy-schema law #42

Merged
dank merged 1 commits from feat/open-notebook-portal into main 2026-10-19 21:14:53 -07:00
Owner

Why

Two research questions, both answered against primary sources and the live host, both of which found the vault pointing the wrong way.

1. Can the TTS engine run on the Strix Halo NPU? No — and the answer generalises: XDNA2 executes only vendor-precompiled AIE partition programs, which is exactly why the qwentts graph was declined. But halogen ships such programs, on other architectures.

2. Then give the fleet the embedding endpoint it lacks. open-notebook fails every note save with No embedding model configured because nothing in the fleet serves /v1/embeddings. Frank's recollection of an embeddinggemma-2 NPU model checks out — docs/NPU.md lists it — but it lands in 0.18.3 and we run 0.16.2. Better: qwen3-embedding-0.6b is already in the catalog of the pinned image (/opt/halogen/npu/models.txt in the running container, docs/NPU.md at tag v0.16.2), so /v1/embeddings needs no runtime bump.

What changes (docs only)

Page Change
LLM/frank-dragoon.md response_format law corrected (it is supported, greedy only) + new The NPU lane section with the four prerequisites this host census says we do not meet
Dankclaw/Open Notebook.md scriptwriter probe verdict; embedding gap now names its door
Dankclaw/Frank TTS.md "the NPU is not a door at all" narrowed to "not a door for a model nobody compiled"
LLM/Dankclaw System Specs.md NPU runtime row = the distro XRT actually installed; stale "zealot serves 27B" payload line deleted

Evidence

  • Greedy-only schemas (live probe of :7770): json_schema and json_object → HTTP 200 with schema-valid 4-turn JSON at temperature: 0; → 400 "...decodes greedy in this release: send temperature 0 (or omit it). Sampling under a schema is not implemented yet" at 0.7, and also when temperature is omitted, because the sampler default is server-side. The same prompt with no response_format returned parseable JSON sampled, so prompt-only JSON is the escape hatch that keeps sampling.
  • The 400 is a landmine, not a降级 signal: is_json_schema_unsupported_error matches not implemented, so _SchemaFallbackModel downgrades to json_object, draws the same 400, and the run dies — esperanto's drop-response_format rescue only fires on 'response_format.type' must be 'json_schema'.
  • No per-row temperature: GET /openapi.json → ModelCreate = {credential, name, provider, type}. open-notebook cannot express greedy, so frank-archon stays the scriptwriter rather than adding a body-rewriting proxy to the path.
  • Host census for the NPU lane: amdxdna 0.7.0 in-tree bound, /dev/accel/accel0 present, iommu=pt, firmware 1.1.2.65, distro XRT libxrt2/libxrt-npu2 1:2.21.75 with libxrt_driver_xdna.so.2 — and no /opt/xilinx/xrt, so the distro mount form applies. Container today: no devices, pp_dpm_fclk unheld (levels 400–2000 MHz, none forced), /models mounted :ro (the first-boot HALOGEN_DOWNLOAD needs a writable /models/npu).
  • The hard prerequisite is the fabric clock. halogen refuses to start unless the GPU fabric clock is held, and the engine can only hold it itself when running as root with /sys mounted — frank-dragoon is a rootless podman run, so the vendor's root host unit is the path. That is precisely the pp_dpm_fclk pin deferred in dankclaw-iommu-translation-off with "it goes in when an NPU endpoint actually exists".

After merge

Nothing deploys (docs-only). Enabling the NPU lane is a separate, windowed change on a live endpoint and needs your go-ahead: it adds the accel device and XRT mount to frank-dragoon, installs a root host unit that pins the iGPU fabric clock, and takes a few GB of the RAM the n-gram table currently uses.

Tests: ./tests/run.sh → 455 passed. Branch head is the docs commit on top of main; no code, no config, no deploy.


cwd: /home/blank/.omp/wt/wt-20261019-020309-6d1fc1f · session: 01a15366-7601-7175-bb69-c62186c3f8b5

## Why Two research questions, both answered against primary sources and the live host, both of which found the vault pointing the wrong way. **1. Can the TTS engine run on the Strix Halo NPU?** No — and the answer generalises: XDNA2 executes only vendor-precompiled AIE partition programs, which is exactly why the qwentts graph was declined. But halogen ships such programs, on other architectures. **2. Then give the fleet the embedding endpoint it lacks.** `open-notebook` fails every note save with `No embedding model configured` because nothing in the fleet serves `/v1/embeddings`. Frank's recollection of an `embeddinggemma-2` NPU model checks out — `docs/NPU.md` lists it — but it lands in **0.18.3** and we run 0.16.2. Better: **`qwen3-embedding-0.6b` is already in the catalog of the pinned image** (`/opt/halogen/npu/models.txt` in the running container, `docs/NPU.md` at tag `v0.16.2`), so `/v1/embeddings` needs no runtime bump. ## What changes (docs only) | Page | Change | |---|---| | `LLM/frank-dragoon.md` | `response_format` law corrected (it *is* supported, greedy only) + new *The NPU lane* section with the four prerequisites this host census says we do not meet | | `Dankclaw/Open Notebook.md` | scriptwriter probe verdict; embedding gap now names its door | | `Dankclaw/Frank TTS.md` | "the NPU is not a door at all" narrowed to "not a door for a model nobody compiled" | | `LLM/Dankclaw System Specs.md` | NPU runtime row = the distro XRT actually installed; stale "zealot serves 27B" payload line deleted | ## Evidence - **Greedy-only schemas** (live probe of `:7770`): `json_schema` and `json_object` → HTTP 200 with schema-valid 4-turn JSON at `temperature: 0`; → 400 `"...decodes greedy in this release: send temperature 0 (or omit it). Sampling under a schema is not implemented yet"` at 0.7, and also when `temperature` is omitted, because the sampler default is server-side. The same prompt with no `response_format` returned parseable JSON sampled, so prompt-only JSON is the escape hatch that keeps sampling. - **The 400 is a landmine, not a降级 signal**: `is_json_schema_unsupported_error` matches `not implemented`, so `_SchemaFallbackModel` downgrades to `json_object`, draws the same 400, and the run dies — esperanto's drop-`response_format` rescue only fires on `'response_format.type' must be 'json_schema'`. - **No per-row temperature**: `GET /openapi.json` → `ModelCreate = {credential, name, provider, type}`. open-notebook cannot express greedy, so **frank-archon stays the scriptwriter** rather than adding a body-rewriting proxy to the path. - **Host census for the NPU lane**: `amdxdna 0.7.0` in-tree bound, `/dev/accel/accel0` present, `iommu=pt`, firmware 1.1.2.65, distro XRT `libxrt2`/`libxrt-npu2` 1:2.21.75 with `libxrt_driver_xdna.so.2` — and **no `/opt/xilinx/xrt`**, so the distro mount form applies. Container today: no devices, `pp_dpm_fclk` unheld (levels 400–2000 MHz, none forced), `/models` mounted `:ro` (the first-boot `HALOGEN_DOWNLOAD` needs a writable `/models/npu`). - **The hard prerequisite is the fabric clock.** halogen refuses to start unless the GPU fabric clock is held, and the engine can only hold it itself when running as root with `/sys` mounted — `frank-dragoon` is a rootless `podman run`, so the vendor's root host unit is the path. That is precisely the `pp_dpm_fclk` pin deferred in `dankclaw-iommu-translation-off` with "it goes in when an NPU endpoint actually exists". ## After merge Nothing deploys (docs-only). Enabling the NPU lane is a separate, windowed change on a live endpoint and needs your go-ahead: it adds the accel device and XRT mount to `frank-dragoon`, installs a root host unit that pins the iGPU fabric clock, and takes a few GB of the RAM the n-gram table currently uses. Tests: `./tests/run.sh` → 455 passed. Branch head is the docs commit on top of `main`; no code, no config, no deploy. --- cwd: /home/blank/.omp/wt/wt-20261019-020309-6d1fc1f · session: 01a15366-7601-7175-bb69-c62186c3f8b5
dank added 1 commit 2026-10-19 16:41:02 -07:00
- frank-dragoon: measured the response_format contract. json_schema and json_object answer
  schema-valid JSON at temperature 0 and draw a 400 at any sampled temperature, and because
  the sampler default is server-side an absent temperature is sampled. The page claimed
  "response_format is unsupported", which sends the next agent past a working feature.
- frank-dragoon: new "The NPU lane" section. The pinned 0.16.2 image already ships the
  five-program AIE catalog including qwen3-embedding-0.6b, so /v1/embeddings is one env var
  plus the accel device, the distro-XRT mount and the fabric-clock hold; embeddinggemma-2
  needs 0.18.3+, the stock-kernel-driver memory-budget fix 0.18.8+. Host census recorded:
  no /opt/xilinx/xrt, distro XRT 1:2.21.75 with libxrt_driver_xdna, clocks unheld.
- Open Notebook: scriptwriter probe verdict — greedy-only, and open-notebook's model record
  is {credential, name, provider, type} with no per-row config, so it cannot ask for greedy;
  frank-archon stays the writer. The embedding gap now has a named door instead of "build a
  new llama.cpp slot".
- Frank TTS: "the NPU is not a door at all" was too broad. It is not a door for the TTS
  family; halogen's precompiled catalog is a door on the same device.
- System Specs: NPU runtime row corrected to the distro XRT actually installed, and the
  stale "frank-zealot serves 27B" line retired in favour of [[frank-zealot]] as sole owner.

Tests: ./tests/run.sh, 455 passed.
dank merged commit fa093e617d into main 2026-10-19 21:14:53 -07:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dank/serverAppConfigs#42