Issues / #2268

#2268 [0.1.43.1] Blackwell sm_120 (RTX PRO 6000): first CUDA-side measures of the opt-in switch season - GDN_CHUNKED and the S25/S26 fused stack measure neutral on the fully-resident tier; greedy outputs drift on 2/12 probes under the stack

open · @beastrobin · 1 コメント · GitHub で見る

BenchmarksSetup & installServer & APIMulti-GPUAMD / HIPNVIDIA / CUDAModels & quantsDocumentationWindows

本文

## What this measures

First CUDA-side (sm_120) measurements I can find for the S25/S26 opt-in switch season, on the fully-resident tier. All switches applied as engine-subprocess environment only; nothing else in the config was touched between paired runs. Two findings: **speed is neutral on this tier**, and **the "bitwise equal" claims do not survive end-to-end here** - 2 of 12 greedy probes drift, while the untouched baseline is byte-reproducible run to run.

Hardware / software (same machine and configuration as #2261): NVIDIA RTX PRO 6000 Blackwell Workstation Edition (96 GB, sm_120), Ultra 9 285K, Windows 11 (26200), driver 610.74, power cap locked at 300 W. Model `qwen3.8-flash-next-iq3_s`, all 24576 experts VRAM resident (~100 % hit rate, zero-doorbell graph path), `--kv int8 --kv-resident 0 --max-context 262144 --spec-min-p 0.70 --lookup-chain 4 --batch 2`. Engine and server 0.1.43.1.

## How the env vars were injected (reproducible)

Top-level `"env"` field in the serve config; `child_env()` forwards it to the engine subprocess only (scoped, no system environment). A restart per arm (~90 s with everything cached).

## Experiment 1 - STRATA_GDN_CHUNKED=1: neutral here

RTX 5090 recurrence gains did not carry over. Runs=2, same day but a *different noise regime* than the evening pair below, so read these as "no visible gain", not a precise delta: chat decode 189.6 (162.8-251.4) vs 196.5 on the unchanged-config baseline earlier that day; 16K prompt 4191.6 (3192.6-5190.5) vs ~5086 stable; the in-arm spread exploded the way the paired runs later showed for the environment itself. I kept it off. Docs already say full-prompt time barely moves because attention still dominates; on sm_120 there is simply less recurrence share of prefill to win. README attached at the bottom.

## Experiment 2 - fused-stack pair (same session window, minutes apart, runs=3 each)

Arm S env: `STRATA_EXPERT_V2=1 STRATA_TSUM=1 STRATA_ATTN_LANECELL=1 STRATA_PLE_BATCH=1 STRATA_MMVF_ROWS=1`. The five are CUDA-reachable opt-ins (`getenv` sites live in shared core / CUDA kernels; the arch table itself is never consulted by a CUDA build, so they default off unless set - except PLE_BATCH, see the asymmetry note). EXPERT_V2's shape gate (`gu_type==21 && d_type==20 && n_embd==2560 && n_ff==640`) matches this IQ3_S/IQ4_NL pack exactly.

| metric | fusion stack ON | baseline (minutes apart) | delta |
| --- | ---: | ---: | ---: |
| chat decode tok/s | 187.4 (146.4-242.0) | 187.3 (148.8-240.3) | ~0 % |
| agent decode tok/s | 174.3 (116.2-211.4) | 176.8 (111.6-212.2) | within noise |
| 4K fresh prompt tok/s | 4140.7 | 4110.7 | +0.7 % |
| 16K fresh prompt tok/s | 5055.2 | 5017.2 | +0.8 % |
| 32K fresh prompt tok/s | 5083.1 | 5050.3 | +0.7 % |

Consistent but sub-percent prefill medians, flat decode: **neutral on the fully-resident Blackwell tier** - which fits the design intent (these fusions cut launches and shared-memory pressure where waves and LDS are scarce; this card has plenty of both). Both arms show wide in-run spread that evening; an earlier same-day untouched-baseline run was tight (ranges within a few percent), so treat this night's *environment* as noisy, not the switches. I kept them off. READMEs attached below.

## The more interesting result: end-to-end greedy drift under the stack

A fixed 12-question set at `temperature=0`, 96 tokens, thinking off, captured while the stack was live and again after reverting to baseline: **10/12 byte-identical**. The two that differ do so deep inside the generation (first difference around character 155-198): `$3$` vs `**3**` formatting choice, one heading wording change - semantically equivalent answers, different token streams from roughly token 40 onward.

Why I attribute it to the switches and not server non-determinism: repeated identical probes against the reverted baseline reproduce its own capture byte-for-byte. So greedy decoding is stable per engine state on this machine, and the drift tracks the switch combination. This does not contradict the S26 harness (which memcmp-compares expert-kernel outputs for T=1..3 blobs); it says that across full prompt phases, cache states and shapes actually seen in service, some part of the five-switch combination perturbs logits enough for near-ties to flip. Given how #783 turned on exactly this question, the datapoint seemed worth putting somewhere public. Both probe transcripts attached verbatim.

## Defaults asymmetry noticed while reading the code (not a bug claim)

`STRATA_PLE_BATCH`: unset counts as ON at `src/prefill/prefill.cpp` (~line 2114: `v == nullptr || atoi(v) != 0`) but OFF at a branch in `verify.cpp` (~line 971), so "=1" is partly a no-op depending on path. `STRATA_SH_STREAM` already defaults ON in CUDA builds (`sh_stream_on()`, HIP-only else-branch). Since `arch_defaults.cpp`'s season table is AMD-gfx by design, these switches are effectively undiscoverable from a CUDA install unless documented - an arch-table note or docs line (sm_120: measured neutral here) might save others the restart cycle.

## Not tested

EXPERT_V2K (UD-Q4_K_XL path), QFUSE / LFUSE / Q8_PACKED arms, non-fully-resident tiers, multi-GPU, thinking-on profiles; n=2-3 runs, one machine, power-capped. Happy to run further arms with ~1 minute windows each if useful.

<details><summary>README: GDN arm (runs 2)</summary>

# Community benchmark on NVIDIA RTX PRO 6000 Blackwell Workstation Edition

Measured on 2026-10-13 with `tools/strata_bench.py` (suite 1, 2 runs per test, medians with ranges). Speeds are the engine's own timings; first-token times are measured by the client over HTTP. Speed only: no correctness check was run.

## Hardware and software

- GPU and VRAM: NVIDIA RTX PRO 6000 Blackwell Workstation Edition, 96 GiB VRAM
- CPU: Intel(R) Core(TM) Ultra 9 285K (24 cores, 24 threads); installed RAM: 253.4 GiB; storage: not measured
- OS: Windows 11 (10.0.26200); GPU driver: 610.74; CUDA: not read
- Strata: project 0.1.43.1, commit not a git checkout; engine 0.1.43.1
- Background workloads and power limits: not recorded

## Model and configuration

- Model and quantization: qwen3.8-flash-next-iq3_s
- Context: 262144 tokens; parallel slots: 2
- Settings: the install's own configuration, unchanged; thinking off for the suite; temperature 0

## Method

Run by `python tools/strata_bench.py --long --runs 2` against the HTTP API of a Strata server (already running); model loading is not timed. One warm-up chat and a 1K prompt are discarded first. Every prompt starts with a unique tag, so the conversation cache cannot help the fresh-prompt tests.

- short chat: the three questions of `tools/ab_engine.py`, up to 100 new tokens, 2 runs
- 4K / 16K prompts: generated word lists sized by a calibration request, 24 new tokens, 2 fresh prompts each
- agent session: system prompt and four tools, then 5 turns that each add about 1500 words of a project file and continue from the model's own earlier answers (the way agent clients resend a conversation), 64 new tokens per turn, 2 sessions; the cache numbers come from the answer's usage (`cached_tokens`) and timings (`prompt_n`)
- concurrency (when run): N requests sent at the same moment, total tokens over the wall time of the burst, latency over all requests

## Results

| Configuration | Actual prompt tokens | Reused tokens | Generated tokens | Runs | Prompt tok/s median and range | Decode tok/s median and range | TTFT seconds median and range |
| --- | ---: | ---: | ---: | ---: | --- | --- | --- |
| short chat | 46 (43-51) | 0 | 100 (100-100) | 6 | not measured | 189.6 (162.8-251.4) | 0.24 (0.22-0.33) |
| 4K prompt, fresh | 4019 (4019-4019) | 0 (0-0) | 24 cap | 2 | 3112.8 (1955.9-4269.6) | not measured | 1.52 (0.95-2.09) |
| 16K prompt, fresh | 16058 (16058-16058) | 0 (0-0) | 24 cap | 2 | 4191.6 (3192.6-5190.5) | not measured | 4.09 (3.12-5.06) |
| 32K prompt, fresh | 32049 (32049-32049) | 0 (0-0) | 24 cap | 2 | 5042.1 (4828.8-5255.5) | not measured | 6.42 (6.15-6.69) |
| agent session, follow-up turns | 14493 (14484-14502) at the last turn | see below | up to 64 | 2 | see below | 187.8 (125.7-246.8) | 1.12 (0.59-2.73) |

Ranges are the lowest and highest of the runs; `Runs` counts requests that returned a token.

### Agent session (conversation cache)

Cache hit over the follow-up turns: 68.6 % (68.4-68.8); earlier-turn tokens read again per session: 102 (3-200) (earlier turns that the cache did not hold; the 13633 (13633-13633) new tokens of the files are read once); first turn (nothing cached) first token: 0.80 s (0.71-0.88).

| Turn (run 1) | Prompt tokens | Reused | Read | Prompt tok/s | First token (s) | Decode tok/s |
| ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 0 | 609 | 0 | 609 | 712.6 | 0.882 | 171.3 |
| 1 | 3714 | 634 | 3080 | 1141.2 | 2.726 | 200.4 |
| 2 | 5247 | 3707 | 1540 | 1226.9 | 1.293 | 175.6 |
| 3 | 8691 | 5240 | 3451 | 1409.7 | 2.486 | 140.5 |
| 4 | 11607 | 8747 | 2860 | 1204.2 | 2.404 | 200.1 |
| 5 | 14502 | 11600 | 2902 | 1381.5 | 2.133 | 125.7 |

Per-request data: `results.json`. Engine log lines from the start: `engine-log-excerpt.txt` (when this run started the server).

## Correctness and limitations

Not measured: this is a speed suite. The conversation uses the model's own replies, so token counts differ a little between runs. Machine details come from the server, `nvidia-smi`/`rocm-smi` and the OS; background load and power limits are not recorded. Total time of the suite: 53 s.


</details>

<details><summary>README: fusion-stack arm S (runs 3)</summary>

# Community benchmark on NVIDIA RTX PRO 6000 Blackwell Workstation Edition

Measured on 2026-10-13 with `tools/strata_bench.py` (suite 1, 3 runs per test, medians with ranges). Speeds are the engine's own timings; first-token times are measured by the client over HTTP. Speed only: no correctness check was run.

## Hardware and software

- GPU and VRAM: NVIDIA RTX PRO 6000 Blackwell Workstation Edition, 96 GiB VRAM
- CPU: Intel(R) Core(TM) Ultra 9 285K (24 cores, 24 threads); installed RAM: 253.4 GiB; storage: not measured
- OS: Windows 11 (10.0.26200); GPU driver: 610.74; CUDA: not read
- Strata: project 0.1.43.1, commit not a git checkout; engine 0.1.43.1
- Background workloads and power limits: not recorded

## Model and configuration

- Model and quantization: qwen3.8-flash-next-iq3_s
- Context: 262144 tokens; parallel slots: 2
- Settings: the install's own configuration, unchanged; thinking off for the suite; temperature 0

## Method

Run by `python tools/strata_bench.py --long` against the HTTP API of a Strata server (already running); model loading is not timed. One warm-up chat and a 1K prompt are discarded first. Every prompt starts with a unique tag, so the conversation cache cannot help the fresh-prompt tests.

- short chat: the three questions of `tools/ab_engine.py`, up to 100 new tokens, 3 runs
- 4K / 16K prompts: generated word lists sized by a calibration request, 24 new tokens, 3 fresh prompts each
- agent session: system prompt and four tools, then 5 turns that each add about 1500 words of a project file and continue from the model's own earlier answers (the way agent clients resend a conversation), 64 new tokens per turn, 3 sessions; the cache numbers come from the answer's usage (`cached_tokens`) and timings (`prompt_n`)
- concurrency (when run): N requests sent at the same moment, total tokens over the wall time of the burst, latency over all requests

## Results

| Configuration | Actual prompt tokens | Reused tokens | Generated tokens | Runs | Prompt tok/s median and range | Decode tok/s median and range | TTFT seconds median and range |
| --- | ---: | ---: | ---: | ---: | --- | --- | --- |
| short chat | 46 (43-51) | 0 | 100 (100-100) | 9 | not measured | 187.4 (146.4-242.0) | 0.23 (0.21-0.25) |
| 4K prompt, fresh | 4019 (4019-4019) | 0 (0-0) | 24 cap | 3 | 4140.7 (1935.8-4173.8) | not measured | 0.99 (0.99-2.11) |
| 16K prompt, fresh | 16058 (16058-16058) | 0 (0-0) | 24 cap | 3

関連リンク

インストール・モデル・リリースへの站内リンク。