Skip to content

prefill: STRATA_PREFILL_KEEP (128) is the slots a loan leaves the cache - #2833

Closed
gopinath87607 wants to merge 1 commit into
Niko1221:mainfrom
gopinath87607:prefill-keep
Closed

gopinath87607 wants to merge 1 commit into
Niko1221:mainfrom
gopinath87607:prefill-keep

Conversation

@gopinath87607

@gopinath87607 gopinath87607 commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

STRATA_PREFILL_KEEP=N (128 by default): the expert-cache slots a loan must leave resident while a prompt chunk
borrows the cache's tail. On a small cache it is this number, not the auto lend's 90% cap, that picks the chunk. On
the Q8_0 four-way's 691- and 937-slot stages it leaves 563 and 809 slots where the cap would leave 621 and 843.
STRATA_GLM_PREFILL_KEEP is accepted as the same knob.

The clamp is up, not down: a lend has to leave the elastic K/V a region to grow into (its floor is
STRATA_KV_GROW_FLOOR, 128 by default), so a smaller N is clamped to that floor and the start says so — lower both
together to lend more of the cache and let the chunk grow at the K/V's expense. A larger N keeps more experts
resident for the prompt's own tokens and buys a smaller chunk.

The number is the same one the auto scan, the per-stage lend regions, the serve loan, the smallest cache a start
accepts and the vram-elastic reserve used before; this change routes all of them through one reader of the variable.

From the Maya checkout (project-maya), local commit 71c1ca7 (2026-10-15).

What it leaves alone

Unset, every use is 128, exactly as before — this is by construction, not a measurement, and this PR's default run
is byte-identical on that path. With the variable set to 128 (its default) the numbers are also unchanged.

Measurements

That commit lowered its pool's floor from 13 to 11 slots a layer (STRATA_GLM_RESERVE_MB=400) on a four-way split and
measured, on a 99,758-token conversation, the binding part reach an 8192-token chunk: a 49,152-token piece
61,762 → 57,507 ms (-6.9%) and a whole five-piece read 161,291 → 158,938 ms, on the live split (5060/5060/3060/3060)
— where it was not a free win either (a 16,384-token piece that went from three chunks to two lost 3%,
28,716 → 29,651 ms, since the parts run a chunk as a chain and there is less left to overlap). No number is claimed
for our rig
: the four-way Q8_0 runs so far used 128, which is this default.

Checks

  • Default path: unset = 128 everywhere by construction.
  • Build: src/program/generate.cpp compiles clean against this branch's headers with the build's own flags
    (-fsyntax-only; one pre-existing unused-variable warning in unrelated code). The development branch that also
    carries the change built fully with ninja (CUDA 13.2).
  • HIP / SYCL: not compiled here (no toolchain on the machine). generate.cpp carries no per-backend code, so both
    builds compile the same change.

🤖 Generated with Claude Code

@gopinath87607
gopinath87607 force-pushed the prefill-keep branch 2 times, most recently from 426621d to 1a34d1d Compare October 17, 2026 02:47
From the Maya checkout (`project-maya`), local commit `71c1ca7` (2026-10-15): `STRATA_GLM_PREFILL_KEEP` there -
the slots a layer of the pool keeps while the pool lends the prompt path - and that name is accepted here too,
so a config written for the Maya checkout runs unchanged.

There, the floor became a knob because the floor is what binds on the small cards: with the auto lend's
percentage cap above it, the number of slots a lend must leave is what decides how big a chunk a part can
lend, and lowering it from 13 to 11 (with STRATA_GLM_RESERVE_MB=400) moved that rig's binding part from 6144
to 8192-token chunks on a 99,758-token conversation (its 49,152-token piece 61,762 -> 57,507 ms; the whole
five-piece read 161,291 -> 158,938 ms, with a 16,384-token piece that went from three chunks to two losing 3%,
28,716 -> 29,651 ms, since the parts run a chunk as a chain). This engine has the same number in the same
role, hard-coded as 128 in twelve places: the chunk scan's old rule, its ring budget and its bisection
(plan_lend), the per-stage lend regions, the serve scan's fits_one and ring_room, serve's own loan, the
split-autoplan gate, the stage-sizing probe, the smallest cache a start accepts (#496), the vram-elastic
reserve check and the vram-elastic relend. All of them read prefill_keep_slots() now, so the number lives
once.

The clamp is up, not down, as there: a lend has to leave the elastic K/V a region to grow into (kvg_start
takes the lend's first slot as its top and turns the K/V off when that region is no larger than its own
floor), so a smaller value is clamped to that floor - STRATA_KV_GROW_FLOOR, 128 by default - and the start
says so rather than obeying it. Lower both together to lend more of the cache. On this rig the floor is the
binding test on the Q8_0 four-way's 691- and 937-slot stages already: it leaves 563 and 809 slots where the
90% cap would leave 621 and 843.

Unset, every one of those twelve numbers is 128 as before and nothing prints; what a smaller value buys on a
given rig is its owner's A/B - the chunk the start prints and the prompt's ms/token against the same run
without it.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@gopinath87607

Copy link
Copy Markdown
Contributor Author

Closed because the source fork was deleted. This PR was opened from the gopinath87607/Strata fork, which was deleted on 2026-10-19. Deleting a fork deletes its branches, and GitHub then closes every pull request whose branch lived in it; a closed PR whose source branch is gone cannot be reopened. Nothing was lost: the same work was recreated from a new fork, rebased onto current main, in #3310. Please continue the discussion there.

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