Skip to content

[Benchmark] RTX 4090 Laptop 16 GB (sm_89), Strata 0.2.7 / engine 0.1.52: STRATA_ROUTE_PRIOR on a 16 GB card - speed and KL, up to 255K tokens #4345

Closed

Description

@blue0orbit

Reproduction status: Measured locally

What was measured

Whether the 0.2.7 residency-biased routing (STRATA_ROUTE_PRIOR, on by itself only for cards of 13 GiB or less) pays on a 16 GB card, and what it costs in quality. Also 0.1.50 vs 0.1.52 at the same settings (the release notes ask for RTX 40 data).

Hardware: RTX 4090 Laptop GPU 16 GB (sm_89, PCIe 4.0 x16, driver 616.56, WDDM; desktop on the iGPU, 0 MiB used before load), i9-13900HX (8P+16E, no AVX-512), 64 GB DDR5 (48 GB + 16 GB, running at 4800 MT/s), NVMe, Windows 11 build 26300, Legion Performance mode, on AC.
Software: source checkout at v0.2.6 + the prebuilt Windows CUDA 13 engines 0.1.50 and 0.1.52 (v0.2.7 release, checksums verified). ISTA-DASLab Qwen3.8-Flash-Next IQ2_XS and IQ3_XXS; SC117 abliterated IQ3_S (RAM budget 28 GiB). Setup's configs: --max-context 262144 (IQ3_S 131072), --kv int8 --kv-resident 32768, --spec 4 --spec-min-p 0.5, MTP with the en draft vocabulary, --vram-reserve-mib 1280, 15 pool workers, text only (no --vision) unless noted. Windows large pages were refused (error 1314) in every run.

Speed method: one server per arm, started fresh, port 8080. Fresh word-list prompts made from docs/*.md (unique prefix, no cache reuse), temperature 0, thinking off, 512 new tokens; numbers are the engine's own generated in ... (tok/s) line. Each arm = one run of 2K, 2K, 32K, 128K (IQ3_S: 120K). Not interleaved pairs. Identical arms repeated later differed by up to ~18% at 2K and ~7% at 128K, so read single differences below ~10% as noise.

Quality method: tools/quant_quality.py run (teacher-forced, data/quant_quality/v1, 4,995 positions) with --env STRATA_ROUTE_PRIOR=X and --gpu-experts set to the cache size the real server gets (IQ2_XS 6100, IQ3_XXS 4700). Reference: IQ3_XXS with the prior off and --gpu-experts 1500 (no Q8_0 on this PC). So the KL below includes the GPU/CPU rounding difference, and the reference is a quant, not Q8_0.

Decode tok/s (2K / 2K / 32K / 128K)

Arm Engine Prior 2K 2K 32K 128K Decode hit % (32K)
IQ2_XS 0.1.50 off 80.6 89.4 77.5 68.0 88.4
IQ2_XS (repeat, end of run) 0.1.50 off 84.2 92.1 89.6 75.4 88.7
IQ2_XS 0.1.52 off 73.0 84.9 74.3 76.2 88.7
IQ2_XS (repeat) 0.1.52 off 87.7 98.0 86.2 78.5 88.9
IQ2_XS 0.1.52 0.5 113.0 115.3 105.1 95.2 95.5
IQ2_XS 0.1.52 1.0 117.9 125.5 108.7 103.5 98.3
IQ2_XS 0.1.52 1.25 119.9 124.4 118.8 105.3 98.8
IQ2_XS (4 arms, same setting) 0.1.52 1.5 115-149 120-148 108-129 100-110 99.3-99.4
IQ3_XXS 0.1.50 off 60.0 76.1 67.7 68.4 82.6
IQ3_XXS 0.1.52 1.0 94.7 110.8 101.3 87.9 96.1
IQ3_XXS 0.1.52 1.5 112.6 111.4 115.0 101.5 98.3
IQ3_XXS with --vision (GPU encoder) 0.1.52 1.0 96.4 103.5 92.8 80.3 95.3
SC117 IQ3_S, 28 GiB RAM budget 0.1.50 off 41.3 44.6 43.0 32.2 (120K) 79.6
SC117 IQ3_S, 28 GiB RAM budget 0.1.52 1.0 57.0 69.6 66.7 50.9 (120K) -
SC117 IQ3_S, 28 GiB RAM budget 0.1.52 1.5 84.6 92.0 83.3 77.3 (120K) 97.1
SC117 IQ3_S, all experts in RAM (2.55 GiB short warning) 0.1.52 1.5 89.6 99.4 95.6 85.7 (120K) 97.2

Prompt reading was the same with and without the prior (~2,400-2,750 tok/s at 128K; IQ3_S with the RAM budget ~1,050-1,340, all in RAM 2,417).

At ~255K tokens (one 255,150-token prompt, 512 new tokens, then a 128-token follow-up on the same chat):

Model Engine / prior Prompt tok/s Decode tok/s Follow-up decode Hit %
IQ2_XS 0.1.50 / off 2,440 66.5 67.6 89.9
IQ2_XS 0.1.52 / 0.5 2,475 82.1 69.9 95.7
IQ3_XXS 0.1.50 / off 2,421 55.5 49.2 86.6
IQ3_XXS 0.1.52 / 1.0 2,487 79.9 73.2 96.5

Tried and no consistent gain here: 23 or 7 (+--pool-affinity p-cores) pool workers, --kv-resident 16384. Raising the engine to high priority / no EcoQoS failed (OpenProcess access denied) so it was not tested.

Quality (teacher-forced, vs IQ3_XXS prior off)

Run Top-1 Mean KL KL p99 PPL (ref 4.145)
IQ2_XS prior off 82.22% 0.248 3.07 4.532
IQ2_XS prior 0.5 82.48% 0.263 3.23 4.602
IQ2_XS prior 1.0 80.70% 0.301 3.52 4.780
IQ2_XS prior 1.5 77.42% 0.368 3.61 4.959
IQ3_XXS prior 1.0 86.07% 0.164 2.28 4.434
IQ3_XXS prior 1.5 82.14% 0.270 3.15 4.649

IQ2_XS prior 0.5 against IQ2_XS prior off directly: top-1 91.15%, KL 0.074.

Reading

  • On this 16 GB card the prior lifts the decode hit rate from ~88% to 95-99%. Decode at 2K-128K against the prior-off runs: IQ2_XS +28-33% at 0.5 and +40-52% at 1.5; IQ3_XXS +29-51% at 1.0. At 255K: IQ2_XS +23% (0.5), IQ3_XXS +44% (1.0).
  • 1.5 costs clearly more here than the 12 GB check suggests: IQ2_XS PPL 4.53 -> 4.96, IQ3_XXS at 1.5 lands at plain IQ2_XS quality. 1.0 on IQ3_XXS stays better than plain IQ2_XS (KL 0.164 vs 0.248) while being faster than plain IQ2_XS at every length.
  • So a lower default for 13-16 GiB cards (for example 0.5-1.0) might be worth a look on your side; one PC and one run per arm is not enough to set it.
  • 0.1.50 vs 0.1.52 with the prior off (sm_89 MMVQ-IL tables on by default in 0.1.52): no difference above the noise here (two runs each).

Limits

One PC, single runs per arm (not interleaved pairs), temperature 0 summaries of docs text; no agent task suite or needle test for the prior; KL reference is IQ3_XXS, not Q8_0; RAM is a mixed 48+16 GB pair at 4800 MT/s.

Raw data (per-request JSON from the benchmark, the quant_quality compare output and per-run engine arguments, the run plan, sanitized configs and nvidia-smi/RAM diagnostics) is kept and can be shared on request.

Activity

  1. udqe commented on Oct 28, 2026

    @udqe

    AI-assisted (model: Qwen3.8-Flash-Next Unsloth UD-Q4_K_XL served by this repo's own engine 0.1.52, driven by a DeepSeek-based harness); every number below was measured and cross-checked by the maintainer on the machine described.

    Adding a 24 GiB dual-card data point (desktop RTX 4090 ×2, the band #4345 does not cover):

    Hardware/software. 2× RTX 4090 24 GiB (sm_89, PCIe 4.0 x16 both, measured link 26.3–26.4 GB/s by the engine's own probe), Threadripper 3970X (32c/64t, no AVX-512 — expert kernels on AVX-2), 128 GiB RAM, Windows, driver 610.88. Model: Unsloth UD-Q4_K_XL (Qwen3.8-Flash-Next), --max-context 307200 --kv int8 --kv-resident 32768 --spec 4 --pipeline-windows 2 --layer-split auto (K=22) --vram-reserve-mib 1728 --vram-reserve-later-mib 972, engine 0.1.52 (v0.2.7). Conversation cache 12 GiB / 4 slots, MTP on, vision on. No large-page refusal logged.

    Arm A (prior off), 2026-10-28 06:49–07:1x JST, live agent traffic (~150K-token sessions, thinking on):
    decode expert-cache hit rate over 11 request windows: min 81.4 / avg 86.7 / max 89.6 %; decode 81.9–104.8 tok/s on long-context turns; prefix reuse 97–99.9 %.
    (Earlier window on engine 0.1.50 with the old 900/512 reserves: hit avg 87.4, max 91.7, but 11 × "#2065 VRAM nearly free" warnings that day vs 1 after raising the reserves — consistent with the reserve advice in the field.)

    Arm B (prior 0.5), started 2026-10-28 07:07 JST, same config, 52 min of the same agent traffic (35 requests): cumulative decode hit 94.9 % (vs 86.7 % arm-A average, +8.2 pt), decode 98.6–151.7 tok/s (up from 82–105). A cold 160,459-token prompt (0 reused) read at 3,290 tok/s / 48.8 s — far above the ~2,600 tok/s the 16K community benchmark reports for a single 4090; note --ple-io ram (0.1.52 auto-moved the 26.8 GiB PLE table to RAM here, locked in 33.4 s), so the big-prompt win is plausibly the PLE table rather than the prefill path: the engine logged layer-major off for this prompt: no VRAM for a super-chunk (1173 MiB free) even though layer-major prefill is on for this layer split — the 1728/972 reserves keep super-chunks from fitting at 307200 context. 1 VRAM warning in 52 min (vs 11 in one morning at 900/512 reserves).

    Quality cost of prior at 24 GiB — quant_quality v1, teacher-forced, 4,995 positions, UD-Q4_K_XL, engine 0.1.52, three sessions differing only by the env (--expert-cache 1, --pcie-frac 0, FP16 K/V, same tool as #4345):

    prior top-1 vs prior 0 mean KL (p99) PPL (ref 4.045)
    0.5 94.59 % 0.0347 (0.543) 4.024
    1.0 94.69 % 0.0335 (0.513) 4.029

    On UD-Q4_K_XL at 24 GiB the cost does not grow between 0.5 and 1.0 (flat within noise, unlike the IQ3_XXS/16 GiB curve above where 1.0 is clearly worse). We stayed on 1.0: 65 min / 196 agent requests give cumulative decode hit 97.6 % (min window 94.8, vs 86.7 % prior-off on the same day), decode median 127 tok/s (95.5 min / 239 max), one #2065-class warning the whole hour, KV streaming 95–98 % VRAM, and cold 170K-token prompts reading at ~3,200 tok/s.

    Caveats: production traffic, sequential arms (not interleaved); KL/PPL are from the yardstick's dedicated single-session runs, not the split.

  2. Niko1221 commented on Oct 29, 2026

    @Niko1221
    Owner

    Thank you for measuring this and writing it up. We are building a Strata website with a page for community benchmarks, and results like these will be added there when it launches, so we are closing this here. If your numbers change with a new version, you are welcome to post them again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions