Skip to content

[Docs] File the performance inventory and close the PLE read-path knobs - #14

Merged
rwkeyes merged 1 commit into
dirigo/0.2.12-verifiedfrom
docs/perf-inventory
Nov 14, 2026
Merged

rwkeyes merged 1 commit into
dirigo/0.2.12-verifiedfrom
docs/perf-inventory

Conversation

@rwkeyes

@rwkeyes rwkeyes commented Nov 14, 2026

Copy link
Copy Markdown
Owner

Problem and result

A month of performance work lives in 55 notes, a history table and a dozen scripts, and nothing in the repository says
which levers are already closed. This adds docs/PERF-NEXT.md with that record, and reports the first experiment it
proposed.

Result of that experiment: both PLE read-path knobs are closed. A 4 M-row cache and --ple-inflight 1024 are flat;
a 16 M-row cache (1.44 GB) costs 8–17 % prefill. The 94 MB default and inflight 256 stand, and the ~330 ms fixed
per-request cost is not PLE row-read starvation.

Related discussion

none — documentation and evidence.

Approach

  1. Kept levers, each with the number that earned it (cache routing −22.1 % TTFT, short-answer drafting +11.3 %,
    thinking suppression −58 % wall, parking off −25…−30 %, NVMe move, calibration 394→276 s, plus upstream's).
  2. Closed levers, each with the number that killed it: --batch 2/4, --kv-grow, --suffix-draft/--lookup-chain,
    prefill 16k/32k, --prompt-cache-tail, --conversation-cache-mib, spec-min-p 0.7, --mtp-max-t, 4-bit KV,
    PLE in RAM, expert-cache size, spec_window, DFlash2 on SYCL, and now the PLE row cache and inflight.
  3. The remaining cost shape: prefill fits 336 ms fixed + 0.67 ms/token over the 18 fresh legs of the 0.2.13 battery;
    the engine is at parity with stock, so what is left is upstream's or in that fixed term.
  4. The untried list, ranked — batch_after 1–2 (measured −21 % median TTFT, default still 4), the fixed-cost
    attribution, the SYCL residency router (route_prior.cu is CUDA-only; 12,288 of 24,576 experts are resident here),
    prefill-chunk intervals, pool affinity on the 7700X, SYCL dispatch overhead, DFlash2 on SYCL.
  5. The sweep, six card windows of bench_prefill + longprobe on the 0.2.13 tree, one knob per window plus a
    closing default repeat for drift, production restored between windows.

Validation

Passed:

  • Six arms, all with data: default, 4 M rows, 16 M rows, inflight 1024, both, default again. Drift band from the
    two default arms: 0.2 % on fresh 4.2k, 3.6 % on 8.8k, ≤1.2 % elsewhere.
  • Verdicts against that band: cache 4 M and inflight 1024 inside it; 16 M rows −8 % (4.2k), −8…−12 % (8.8k),
    −17 % (4.4k follow-up), −10 % (30k), −9 % needle gain at most.
  • Production: strata-b70 restored after every window with :8095 http=200 and engine 0.1.58 in the log, and
    checked after the last one — the sweep never left the box down.
  • Links and rendering: no broken relative link in the new page, the index entry added, GitHub's Markdown API
    renders its four tables.

Failed:

none observed.

Not run:

  • Nothing here re-measures the fixed cost itself — the sweep only excludes the PLE read path as its cause. That is
    the next experiment (item 2 in the new page), at 8–256-token prompts.
  • No repeat-traffic test: no leg re-reads the same n-grams, so a bigger row cache for that shape stays untested and
    the page says so.

Limits

  • One knob family, one box, one engine version. The ranking in the page is this deployment's, not a general claim.
  • The event log, configs and per-leg JSON are shipped; the card-window launcher is on the operator's box as
    ~/bin/strata-card-window.sh, copied into the folder as the script that produced the run.

Two things from one session: a page that records what has been tried (so
the next session stops re-deriving it), and the first result from it.

docs/PERF-NEXT.md:
- kept levers, each with the number that earned it;
- closed levers, each with the number that killed it (batch/slots, kv-grow,
  suffix-draft, prefill 16k/32k, 4-bit KV, PLE in RAM, expert-cache size,
  spec_min_p 0.7, spec_window, DFlash2 on SYCL);
- the remaining cost shape: prefill 336 ms fixed + 0.67 ms/token over 18
  fresh legs;
- the untried list, ranked, each with evidence, cost and a first test —
  batch_after 1-2 first (already measured, not shipped), then attributing
  the 330 ms, then the SYCL residency router, prefill-chunk CIs, pool
  affinity, dispatch overhead, DFlash2.

The PLE sweep, six card windows on the 0.2.13 tree, closes two knobs:
- row cache 4 M rows and --ple-inflight 1024 are flat against a drift band
  of 0.2-3.6 %;
- row cache 16 M rows (1.44 GB) costs 8-17 % prefill (fresh 4.2k, 8.8k,
  a 4.4k follow-up, 30k).
So the 94 MB default and inflight 256 stand, and the fixed per-request cost
is not PLE row-read starvation. Artifacts, configs, per-leg JSON, log and
script are in dirigo-results/0.2.13-port/ple-sweep/.

Production stayed on 0.1.58 throughout: each window's restore line shows
:8095 http=200 with the engine 0.1.58, and the service was verified after
the last one.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant