Repository navigation
bench: community report, 2x RTX 3080 20 GB, UD-Q4_K_XL, 2 x 262K lanes in a 512K pool, 3.0K tok/s prompt, 86 tok/s decode - #1640
Closed
noon-at-cgn wants to merge 7 commits into
Conversation
…62K lanes in a 512K shared KV pool (fork build) Results-only. Community harness (unmodified benchmark.py, 3 runs at 4K/25K/51K/104K/127K) on the running production engine, plus our own two-stream A/A script, the two Strata Monitor peak screenshots (labelled as instantaneous), exact command, engine binary sha256 and the branches/commits of the patches the build needs that are not in main (shared KV pool, batch MTP on a layer split, --adapt-async beside slots), and the config-vs-patch breakdown.
…3 and the --ple-io direct readings
…s, always-on list, newer upstream note, PatchAudit facts per patch
…0.1.41 numbers (strata-w10), commit list
Niko1221#1637 and the four older ones), 0.1.41 batch-MTP, adaptive-tier and pool measurements
noon-at-cgn
marked this pull request as ready for review
October 9, 2026 01:54
This was referenced Oct 9, 2026
Closed
Niko1221
pushed a commit
that referenced
this pull request
Oct 10, 2026
…s in a 512K pool (PR #1640)
Owner
|
Thank you, in v0.1.42 with your commits squashed into one, and a row in bench/results/COMMUNITY.md. One line of the README about how it was prepared was dropped; the numbers are yours. |
giridhart
pushed a commit
to giridhart/Strata
that referenced
this pull request
Oct 15, 2026
…s in a 512K pool (PR Niko1221#1640)
giridhart
pushed a commit
to giridhart/Strata
that referenced
this pull request
Oct 15, 2026
…21#1638 Niko1221#1647 Niko1221#1655 Niko1221#1681 Niko1221#1692 Niko1221#1695 Niko1221#1716 Niko1221#1717 Niko1221#1657 Niko1221#1640; the 6900 XT 0.1.40.1 row now has the numbers Niko1221#1657 added
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Title
Issue: Related: none (results-only PR, no engine change). Nearby: #1598, #1599, #1600, #1601, #1614, #1636, #1637 (my open PRs, listed below), #1190 (resident split lend regions, by another contributor), #1253 (batch MTP on a layer split, another contributor; same design as #1636), #1011 (shared KV pool, closed by the 2026-10-06 history rewrite).
Summary
I run Qwen3.8-Flash-Next at UD-Q4_K_XL (104 GB) on a used server I built for about $2,000. A 2016 Xeon and two RTX 3080 20 GB cards read a 104K-token prompt at a median 2,996 tok/s and decode at a median 86 tok/s, with two 262,144-token lanes sharing one 524,288-token KV pool. One person measuring, one machine, 2026-10-08.
My build:
Community harness (
benchmark.py, unmodified), 3 runs per length, 256-token greedy output, median (range):ab.py, 12 rounds x 2 identical arms, n = 24)The two screenshots in the report show peak instantaneous performance. Prefill, 3,124 tok/s at 65,536 of 104,067 tokens (peak instantaneous). Decode, 109.4 tok/s (peak instantaneous).
This does not reproduce from upstream
mainplus the open PRs. The engine is my fork's build on the 0.1.40.3 base (strata-w7, sha256b1df9608...). It depends on four changes that are in neithermainnor #1598-#1601: the shared KV pool (--kv-pool-tokens, my open PR #1614),--batch-mtpon a layer split (my open PR #1636) and--adapt-asyncbeside--batchslots (my open PR #1637, stacked on #1636), and #1190 (resident split lend regions; an open PR by evaanp, not mine, not inmain, currently conflicting). With a layer split and prefill borrowing, the RAM copy of the lend regions that #1190 keeps is required for the "no disk reads while serving" behaviour (start line: 5396 lent slots, all kept in RAM, 15.76 GiB). I did not measure how much the numbers depend on #1190.To get the binary I measured, build branch
repro/w7(commit428d9910134aaaae9ffd8c8e262cec39504221e5) on noon-at-cgn/Strata: it is upstream v0.1.40.3 plus my patch stack. Everything in it that is not in upstreammainis listed inrepro-w7-commits.txtin the report folder. The sha256 of my binary is from a build of the earlier ids (ac5fc3fonup-merge9098e89);repro/w7has the same source (emptygit diffagainstac5fc3f) but every commit has a new id, because the wrong author e-mail on my own commits is corrected. A rebuild fromrepro/w7gives the same source, not necessarily the same binary bytes.Configuration versus patch, as measured:
--prefill auto:16384,STRATA_PREFILL_RING=384,STRATA_PREFILL_EQUAL=1main--ple-io directMemAvailablefrom 4.6-13.8 GiB to 30.8-32.7 GiB (same pre-merge binary, 2026-10-07; readings in the README)--aux-cpusSTRATA_SPLIT_MTP_BATCH--memory-limit-mibSTRATA_SPLIT_RING)main--batch-mtpon a split, #1637--adapt-asyncbeside slotsmain, plus 9 merge commits; 7 of the 77 are inmainunder other commit ids)a48f52c/1194892onrepro/w7, earlier ids530afec/d68cf5e; changes the captured window graph at--pcie-frac 0.1,STRATA_VERIFY_FLAGB=1restores the old wait), per-slot vision tables (#1242), the parking fixes (#1163 andc55444d= #1503, earlier id460b0a7), the serve give-way rule (#1288)All seven of my open PRs (#1598-#1601, #1614, #1636, #1637) are in this table.
What changed
bench/results/2026-10-08-community-2x-rtx3080-20gb-ud-q4-k-xl-512k-pool/:README.md(my build, model and exact command, method, results, the peak screenshots, 0.1.41 numbers, what did not help),benchmark.py(the unmodified harness from2026-09-30-community-rtx-5090),run_harness.py(adds the API-key header, since the harness has no option for one),ab/(my own two-stream script and its output),data/(results, summary, telemetry, small request records, the 0.1.41 probe output inw10-0.1.41/),repro-w7-commits.txt(every commit ofrepro/w7that is not in v0.1.40.3, with both ids),start-command.txt,strata-q4xl-prod.json,BUILD.json,machine.txt,model-provenance.json,images/,TRIMMED.md.bench/results/COMMUNITY.md: one row for the new folder.Extra Notes
Source and patches. All branches are on
https://github.com/noon-at-cgn/Strata. Production source:repro/w7428d991(=up-merge9098e89, upstream v0.1.40.3d5ea713merged into my stack, plus theopt/04commitac5fc3f; the binary does not embed its commit, the match to those earlier ids is by my build notes and by time). The binary has the 0.1.40.x-based branches of the patches that are now my open PRs (the PRs are written against 0.1.41), with merge results of those branches as text merges against upstreammainfb58e0d, nothing compiled:pr/kv-pool-141, head400fc50): binary haskv-shared-pool9c533de(b346dd6onrepro/w7), copypr/kv-pool3aefa11; base82f46a8, 13 commits, 393 commits behindmain, conflicts only in code that upstream already has--batch-groups auto#1636 (pr/batch-mtp-141, head2c08077; same design as open Enable serial multi-GPU batch MTP #1253 by ilumn): binary hasbatch-mtp-split384d67e(0aec553), copypr/batch-mtp-split484b49c, withpr/mtp-shared-draft-head08ef4a3; base82f46a8, 3 commits, 393 commits behindmain, merges clean--adapt-asyncbeside--batchslots, batch: the adaptive expert tier keeps adapting in batch windows (--adapt-async 1beside slots) #1637 (pr/adapt-async-141, head4dba66a; stacked on batch-mtp: work with a layer split, +15% two-stream decode, one group under--batch-groups auto#1636): binary hasbatch-adapt8d0c106(7c011e0), commits347420d(822a0d3) and3e9cecb(c2ce009); base82f46a8, 393 commits behindmain;347420dapplies cleanly,3e9cecbconflicts with upstream13eee45Newer upstream: 0.1.41. My numbers are on engine 0.1.40.3 plus my patches (v0.1.40.3,
d5ea713). Upstreammainis now 0.1.41 and has 128 more commits thanup-merge. I built my stack on 0.1.41 as branchup-141(head10baecb, code headdb925c1, notes indocs/UP141_NOTES.mdon that branch) and ran it asstrata-w10on the same machine with the same production config. With my own probes (read96,ab.py), not the harness, and compared withstrata-w7from the same probes (medians of two restarts;strata-w10is one start): prompt reads 25K 2,048 vs 2,128.5, 51K 2,386 vs 2,553, 104K 2,706 vs 2,940 tok/s (3.8%, 6.6%, 8.0% lower; I do not know why). Decode: one stream 79.6 and 78.7 vs 79.7 and 80.4 tok/s, two streams 88.3 and 86.9 vs 90.8 and 90.7 tok/s; the twostrata-w10values are the two identical arms of one run, so the restart-to-restart spread of up to about 5% is not covered and I do not claim a decode change. On 0.1.41,--batch-groups autois on by default for a layer split with--batchabove 1, which runs two pipelined groups of one slot where batch MTP does not draft (upstream issue #1413); myup-141commitdb925c1makesautoresolve to 1 when--batch-mtpor--adapt-async 1is given (start log:batch-groups auto: 1 group of 2 slots). #1253 is similar batch-MTP-on-a-split work by another contributor; my open PR for it is #1636.More
strata-w10measurements from later the same day (two slots, greedyab.pyprompts, same binary, only the named flags differ; "pipelined groups" isstrata-w10started with the flags upstream 0.1.41 would pick, not the upstream binary), medians: two-stream decode with batch MTP 89.2 tok/s (3 restarts) against 77.3 without it (2 restarts) and 77.7 for the pipelined groups (1 restart). The pipelined groups read a long prompt beside a running decode 2.06x faster than my serial batch windows (2,508 against 1,217 tok/s). With the adaptive tier, two-stream decode is 89.2 tok/s with the asynchronous tier, 74.7 with the blocking tier and 45.2 with the tier off. The shared KV pool pins 3.1 GiB less RAM at two lanes (72.0 against 75.1 GiB), and two-stream decode is 89.2 with the pool and 87.7 without it, inside the restart-to-restart spread.What did not help (same day, same box): a 280 W cap (+2% prefill, decode 0),
STRATA_STAGER_SLEEP=0,STRATA_AUX_STAGER=0,STRATA_MMVQ_IL=0, deeper PLE I/O, ring 512, layer split 24 (-3%),--prefill auto:32768(+6% at 104K but the RAM is too tight), pipelined windows and two-lane pipelining.Method. Run on the machine that hosts the engine, against the production engine that was already running (not restarted, status idle for 32 minutes before the first request). The two-stream and one-stream numbers come from
ab.py, my script, not the harness; its two identical arms are an A/A control, and the one-stream pair differs by 4%, which is the method's noise.Prepared with an AI assistant (Claude Code) from the raw measurements; the numbers are the engine's and the client's own output, unedited.
🤖 Generated with Claude Code