From 0d0a6f62ff1a34561bcebdf9eae5f91727e74896 Mon Sep 17 00:00:00 2001 From: t Date: Mon, 9 Nov 2026 08:54:17 -0400 Subject: [PATCH] docs: the --npu-target refusal, measured in all three forms, and the one ordering caveat serve adds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gate item 4 of #803 is the acceptance line this page says is checkable without a ticket, and nobody had run it. Measured on 2026-11-09 with `ONEBIT_NPU=ON` against the shipping runtime (no ticket, no device — the refusal happens before both): - `forward-serve --npu-target hexagon` → `--npu-target hexagon: this build has no such target (compiled: xdna)`; - the default target proceeds to its own checks, so `xdna` is the default; - `serve --device npu --npu-target hexagon` prints the same by-name message through the child. The caveat the third form earned: `serve` only reaches the child once its own kernel resolution succeeds, so a pack whose full ELFs resolve nothing refuses with the *kernels* message first and the target refusal never prints (measured on Qwen3-0.6B and on bonsai2-27b-t2s2-serve, whose kernels-m16/ does not satisfy that check). Not a code defect — the route cannot run without kernels, and duplicating the compiled-target list into serve would break the one-place rule — so it is stated here, with the practical consequence: set the kernels up before testing this row. Refs #803. --- docs/npu-p4-target-split.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/npu-p4-target-split.md b/docs/npu-p4-target-split.md index 086ebcc2b..5135234cb 100644 --- a/docs/npu-p4-target-split.md +++ b/docs/npu-p4-target-split.md @@ -176,6 +176,23 @@ A3 is the step with the large diff and no numerical content; it goes after the g `--npu-target hexagon: this build has no such target (compiled: xdna)` and exits, and the same message comes out of `serve --device npu --npu-target hexagon` because it reaches the forward unchanged. + **Measured (2026-11-09, `ONEBIT_NPU=ON` against the shipping runtime, no ticket and no device — the refusal is + before both):** + + | form | what it prints | + |---|---| + | `forward-serve … --npu-target hexagon` | `--npu-target hexagon: this build has no such target (compiled: xdna)` | + | `forward-serve …` (default) | proceeds to its own checks — `xdna` is the default | + | `serve --device npu --npu-target hexagon` | the same by-name message, carried through the child | + + **One caveat the `serve` row earned:** it only reaches the child after `serve`'s own kernel resolution succeeds. + With a pack whose full ELFs resolve nothing, `serve` refuses first with *its* message (`… no NPU kernel (full ELF) + directory resolves for it: set ONEBIT_NPU_KERNELS …`) and the target refusal is never printed — measured on + `Qwen3-0.6B` and on `bonsai2-27b-t2s2-serve`, whose `kernels-m16/` does not satisfy that check. That is not a + defect to fix in code: the route cannot run without kernels either, and duplicating the compiled-target list into + `serve` to reorder the two refusals would break the rule that keeps the list in one place. It is a reason to set + the kernels up before testing this row, which is what the table's third line did. + Runs go through `npu-hold` tickets; a new ELF is not involved (no kernel changes), so tickets are the normal kind. The reference binary is the `c20`-era build with the same model dir, so a difference can only be the split.