19 Commits
Author SHA1 Message Date
Niko1221 89f4fa18ee Run manifest (lite): STRATA_MANIFEST=<file> writes the selected fast paths, fallback reasons, tensor formats, engine choice and budgets as JSON (P0.1)
A diagnostic for testers and for the performance work, off by default. With STRATA_MANIFEST unset every call returns at once
and nothing is printed or written. With it set, the engine writes <file> (whole file, replaced by rename) when it is ready and
again after a request if something new was recorded; the launcher (strata_control/split_engine.py) writes the all-cards split
decision to <file>.launch.json. Sorted keys, no timestamps, process ids or addresses, so two matched runs give the same text.

Content:
- engine: version, engine kind (single GPU or layer split), stages, KV format, drafter, spec window, pipeline windows, PLE I/O.
- budgets: context, KV resident cells, expert slots and cache MiB (all tiers and primary), VRAM reserve, prefill chunk cap and
  stages, pool workers, memory limit, resident budget, batch slots, conversation cache.
- paths: one entry per decision with selected/declined and the reason in plain words: prompt experts per format class (MMQ,
  FP16 WMMA tiles, native fused kernels, FP16 GEMM, with the gate/up and down formats and the layer count), MMQ direct and group
  sort, HC_Q8, the output head (VRAM or pinned host, repacked or not), route tail skip, DMA batch mode.
- tensors: dense and head formats as held (count, bytes), the packed and HC_Q8 copies made at load.
- launch: split-engine mode, engine chosen, reasons, card architecture and count, routed-expert types, and the AMD auto rule
  condition by condition (architecture, card count, expert types), so four gfx1201 with the IQ3_S set is recognised and two or
  three cards are not promoted by the four-card rule.

The only text it prints is "strata: STRATA_MANIFEST: cannot write <file>" on stderr, once, when the variable is set and the file
cannot be written.

Tests: tests/core/run_manifest_test.cpp (off is free and writes nothing, matched runs in any recording order give the same text,
replace-on-rerecord, escaping, dirty tracking, unwritable target), tests/split/test_split_engine.py::LaunchManifest.
2026-11-06 00:21:53 +01:00
Niko1221 ae5e73de20 drafting: a DFlash2 the person chose by name keeps the number of requests they chose (DFlash2 with N requests); Auto and the MTP unchanged
- drafting.blocked_by(named=True): only --pipeline-windows still blocks; Metal keeps the old rule (no per-request drafters there)
- apply/launcher/plan pass the choice; the all-cards split engine runs --draft dflash2 --draft-model PACK only for DFlash2 by name AND --split-engine on
- the split engine's own DFlash2 start line counts as "DFlash2 on"; a split run config with --draft dflash2 is left as it is
- app Drafting hint and Terminal --drafting help say it (owner-approved wording, English only)
- tests: terminal drafting/single/split-parallel, split engine, serve parallel, node parallel-default
2026-11-03 16:28:14 +01:00
Niko1221 9149835c6a Auto starts the split engine on 4 x R9700 for the IQ3_S set (and the other i-quant / Q2_0 expert types). Owner's yes 11-03. With the shared expert fused into the routed launches the split beats the layer split on IQ3_S: 1 user 186.8 against 104.2 tok/s, 8 users 364.6 against 320.7 through launch; 61-task suite 57/61 against 54/61; first-token KL vs the layer split 0.041. 2 and 3 cards unchanged; --split-engine off keeps the layer split 2026-11-03 11:39:16 +01:00
Niko1221 8fbf6b1902 Split engine on AMD: the default lane count is 8 (was 6). A plain launch on 4 R9700 ran 8 users in two waves (255 tok/s aggregate); with 8 lanes they run in one (350). The K/V pool and buffers of 8 lanes at 128K context leave 7.2 GiB free on each card. NVIDIA keeps 6; a number the person chose stays. 2026-11-03 01:35:59 +01:00
Niko1221 9d1ee9b191 split HIP: auto on AMD only for the UD-Q4 expert family (IQ3_S set stays on the layer split; on still runs it) 2026-11-02 15:22:21 +01:00
Niko1221 a4b4e06fa7 split HIP: auto on four cards only (AUTO_SPLIT_AMD_CARD_COUNTS = (4,)); on still runs 2 and 3 2026-11-02 15:12:40 +01:00
Niko1221 da20fc301d split: FNX_ADMIT_INTERLEAVE (default 1): one decode window between two admissions; AMD auto card-count constant; tests 2026-11-02 14:41:28 +01:00
Niko1221 418982072b tests: AMD architecture sources pinned (self-test before load, code objects, package script, issue template) 2026-11-02 13:06:04 +01:00
Niko1221 83cadd32fe split HIP: gfx11/gfx12 WMMA paths, one binary with code objects for gfx1100-1103 gfx1200 gfx1201, kernel self-test on cards not run (hip/selftest*), exe lookup strata-split-N-amd, experimental AMD only on explicit on, packaging for N=2,3,4 2026-11-02 12:39:12 +01:00
Niko1221 202bb94ae6 split HIP: AMD gfx1201 starts the split by default (AUTO_SPLIT_AMD_ARCHS), off by key, preset or STRATA_SPLIT_ENGINE=0; tests and docs 2026-11-02 12:27:01 +01:00
Niko1221 2c1771dce2 Merge f-0291-split (up to ea2aed12c: auto/on/off switch, drafting fix, i-quant sets, PF_JOB) into f-0291-split-hip; AMD opt-in rule (AUTO_SPLIT_AMD_ARCHS), strata-split-N-gfx1201 lookup, packaging/build_split_hip.sh, AMD tests 2026-11-02 12:13:42 +01:00
Niko1221 242549e432 split-hip: line endings back to LF in the files my edits had turned to CRLF (diff against f-0291-split is now the real change) 2026-11-02 12:00:59 +01:00
Niko1221 71120303b1 split HIP: peer push on by default (probe and host fallback stay); RCCL for the prompt sums behind FNX_PF_RCCL (dlopen, self-test, one-line fallback) with a policy test 2026-11-02 11:51:56 +01:00
Niko1221 bbfa7c85cf split-hip: FNX_PEER (AMD): peer push of the window sums and the attention merge into the other cards' device memory, behind a start probe of every directed pair (stores, full read-back compare, flag round trips) with the host exchange as the fallback for the whole run; FNX_PEER=0 forces the host exchange; CPU policy test; NoPeerAccess now allows HIP peer calls in the one probed file only 2026-11-02 11:19:35 +01:00
Niko1221 15fb6ffe3f split: Auto drafting on a setup the split accepts runs the split with its MTP; DFlash2 or off chosen by the person keeps the layer split
split_config writes "drafting": "mtp" (what the split engine runs), so serve/server.py's drafter step, which resolves Auto to DFlash2 where the
engine has it, cannot add DFlash2 flags to the split engine's arguments; the fallback keeps the person's own drafting word (or none: Auto), so the
layer split that starts instead gets DFlash2 as usual. The rule refuses (quietly in auto) for an explicit dflash2 or off, and for Auto on a card
where the split has not been measured to decode faster than the layer split with DFlash2. Tests: all four cases, the card rule, the server's
drafter step on a split config.
2026-11-02 10:53:28 +01:00
Niko1221 ac1965edea split: the all-cards split engine is automatic by default, with an off switch
strata launch --split-engine auto|on|off (settings field, saved in the preset and written to the launch config, so an off survives updates);
STRATA_SPLIT_ENGINE=0/1 for testers. auto (the default) uses the split engine where the rule says yes and says nothing where it says no; on says
why it cannot run; off never. The rule also leaves the layer split for choices the split engine does not honour (DFlash2, custom engine arguments,
replicas, a conversation memory format other than int8). The engine is looked up per card count and architecture (strata-split-N-smCC, then
strata-split-N); sm_120 joins sm_86 as a tested architecture. Tests: modes, auto/on/off, silent refusals, the flag, a saved off.
2026-11-02 10:44:43 +01:00
Niko1221 aaa7a8e494 split: the selection rule accepts the i-quant and Q2_0 expert sets the engine now runs
EXPERT_TYPES gains IQ2_S, IQ3_XXS, IQ3_S, IQ4_XS, IQ4_NL and Q2_0; a set with such experts may have embeddings, shared experts and an output
head in any type the loader converts to Q8_0; the memory estimate counts the Q2_0 to Q4_0 repack twice; the per-layer embedding table type is
checked. Tests for the supported sets (the IQ3_S set, UD-IQ4_XS), the plain refusal lines and the scan.
2026-11-02 08:41:19 +01:00
Niko1221 43c40ecb19 split: the launcher side: apply_to_config probes the cards (nvidia-smi) and RAM, reads the GGUF, and turns the run config into the split engine's with the normal one kept as fallback; strata launch calls it only when the config says split_engine true (or STRATA_SPLIT_ENGINE=1 for testers); tests 2026-11-01 21:05:45 +01:00
Niko1221 28f94d6890 split: the rule for when the all-cards split engine may run (off unless asked; Linux, 2-4 identical cards of a tested kind, UD-Q4_K_XL-type GGUF, every expert fits the cards, RAM free), its run config with the normal config kept as fallback, tests incl. no peer API in src/split; defaults: SM-ring prompt path, Strata's draft-layer files 2026-11-01 20:51:40 +01:00