mirror of
https://github.com/Niko1221/Strata.git
synced 2026-11-07 18:35:04 -10:00
DGX Spark: STRATA_SIDE_MIXER=2 is one of the sm_121 defaults (docs: five speed defaults)
Port of pull request 4737 by InB4DevOps (commit c14ee15d9 on v0.2.8). The mixer's input-only QSA/GDN work runs on graph branches; scheduling only, no arithmetic change. STRATA_SM121_PERF=0, STRATA_DEFAULTS=026 or STRATA_SIDE_MIXER=0 turn it off. Measured here on a Spark, IQ3_S, greedy: ids identical 48 of 48; alone +1.0..+2.9% per class, with mode 8 +3.6% pooled. Not yet measured at parallel 4.
This commit is contained in:
1 parent
f94a27da60
commit
5e46c34159
3 files changed
+17
-9
No files matched your search
@@ -111,20 +111,22 @@ the aggregate tokens per second over all clients: 8 clients 35.6, 16 clients 41.
|
||||
a prompt of its own and a hidden code for each client, every answer named its own code and nobody else's (8 clients at 4 slots, 16 clients at 8
|
||||
slots), and none failed or hung.
|
||||
|
||||
## The four speed defaults of this part
|
||||
## The five speed defaults of this part
|
||||
|
||||
On a GB10 the engine switches on four settings that were measured here, and prints them at every start. `STRATA_SM121_PERF=0` (or
|
||||
On a GB10 the engine switches on five settings that were measured here, and prints them at every start. `STRATA_SM121_PERF=0` (or
|
||||
`STRATA_DEFAULTS=026`, which gives back everything 0.2.7.1 changed) turns the whole set off; a switch you set yourself is kept.
|
||||
|
||||
| Switch | What it does | Measured in the first run (26 October) |
|
||||
| Switch | What it does | Measured on this Spark |
|
||||
|---|---|---|
|
||||
| `STRATA_PF_FUSED=1` | the fused IQ prompt kernels | IQ3_S prompt +10 to 27% |
|
||||
| `STRATA_PREFILL_NVFP4=w4a4` | NVFP4 prompt matrix product with FP4 activations | NVFP4 prompt +16% |
|
||||
| `STRATA_HC_UPMIX=1` | the hyper-connection read's up projection and mix in one kernel | decode +5.4% |
|
||||
| `STRATA_SIDE_MIXER=2` | input-only QSA/GDN work on branches of the verify graph | fixed-work IQ3_S decode +6.7% (30 October) |
|
||||
| `STRATA_SPEC_COST=1` | the draft window follows what a draft costs | decode +4.7% |
|
||||
|
||||
**What the first two switches do to the answers.** The fused prompt path and the FP4 activations round differently from the paths they replace,
|
||||
and the other two do not touch the text (the fused hyper-connection read gives bit-identical logits; the cost-aware window only chooses
|
||||
and the other three do not touch the text (the fused hyper-connection read gives bit-identical logits; the side mixer changes only graph scheduling;
|
||||
the cost-aware window only chooses
|
||||
which drafts to try, and the target checks every draft). 24 short greedy prompts gave 24 identical answers on IQ3_S and on NVFP4. On
|
||||
24 long prompts (1.5K to 24K tokens, the first-token logits compared with the switches off, `STRATA_DUMP_FIRST_LOGITS`) the distribution
|
||||
does move: IQ3_S mean KL 0.019 (largest 0.082), NVFP4 0.032 (largest 0.126); the most likely token changed on 2 of 24 prompts for each, in
|
||||
@@ -133,8 +135,9 @@ of the same setting gave identical logits, so the difference is the switches, no
|
||||
prompt path, and all of the NVFP4 difference from `w4a4`. On the 61-task quality suite (long-document retrieval, extraction of up to 72 exact rows, summaries, code, JSON, agent loops with tools), run through the server with the switches on and off: IQ3_S passed 56 tasks on and 51 off, NVFP4 56 on and 52 off. Retrieval found all 63 facts in every run, and no agent loop made an invalid tool call. The extraction facts were equal on IQ3_S (621 of 642 both ways); on NVFP4 one 40-row register lost a row with the switches on (616 against 621 of 642). One summary in each model gained or lost a flagged name or figure. Answers differ in wording on 21 of 61 tasks (IQ3_S) and 25 of 61 (NVFP4), and the wins and losses go both ways, so read the suite as "no loss we could measure", not as an improvement. The same setting run twice gave identical answers, so every difference comes from the switches. If you want the answers of 0.2.7, set `STRATA_SM121_PERF=0`: you keep the other
|
||||
Spark settings and lose the prompt speed-up.
|
||||
|
||||
With `"parallel": 4` (the default) the set adds up: 32 clients at 2,000-token prompts read 41.3 tok/s with all four on and 35.7 with all off. At
|
||||
`"parallel": 8` the two decode switches cost about 3.5% each; set `STRATA_HC_UPMIX=0 STRATA_SPEC_COST=0` there.
|
||||
With `"parallel": 4` (the default) the original four-switch set adds up: 32 clients at 2,000-token prompts read 41.3 tok/s with those four on
|
||||
and 35.7 with all four off. The side mixer was not part of that check. At `"parallel": 8` the two original decode switches cost about 3.5%
|
||||
each; set `STRATA_HC_UPMIX=0 STRATA_SPEC_COST=0` there.
|
||||
|
||||
## What this does not cover
|
||||
|
||||
|
||||
@@ -70,6 +70,10 @@ std::vector<std::pair<std::string, std::string>> nv_default_env(int major, int m
|
||||
// src/prefill/gr_upmix_parity.cu covers it upstream). The HC read is ~13% of a decode round here, which is
|
||||
// why a fusion on it moves the number at all.
|
||||
{"STRATA_HC_UPMIX", "1"},
|
||||
// Run the mixer's input-only QSA/GDN work on graph branches. With the grouped experts' mode 8 selected,
|
||||
// fixed-work IQ3_S decode measured +6.68% paired median and +6.67% geometric mean over 8 balanced pairs
|
||||
// (AB +11.60%, BA +6.68%, identical 512-token output and verifier work). The branch changes no arithmetic.
|
||||
{"STRATA_SIDE_MIXER", "2"},
|
||||
// the cost-aware MTP window: pick the verify window from what a draft costs against what it has been paying.
|
||||
// Measured on IQ3_S: decode 1.047x [1.019, 1.079], prompt unchanged, 24 of 24 greedy answers byte-identical.
|
||||
// It only changes which drafts are attempted, and every draft is verified, so the answers cannot drift.
|
||||
|
||||
@@ -36,13 +36,14 @@ int main() {
|
||||
unset("STRATA_SM86_PERF");
|
||||
unset("STRATA_SM60_PERF");
|
||||
unset("STRATA_EMULATE_CC");
|
||||
// GB10 (12.1): the four measured switches, and nothing else
|
||||
// GB10 (12.1): the five measured switches, and nothing else
|
||||
{
|
||||
const auto t = nv_default_env(12, 1, false);
|
||||
CHECK(t.size() == 4);
|
||||
CHECK(t.size() == 5);
|
||||
CHECK(find(t, "STRATA_PF_FUSED") && *find(t, "STRATA_PF_FUSED") == "1");
|
||||
CHECK(find(t, "STRATA_PREFILL_NVFP4") && *find(t, "STRATA_PREFILL_NVFP4") == "w4a4");
|
||||
CHECK(find(t, "STRATA_HC_UPMIX") && *find(t, "STRATA_HC_UPMIX") == "1");
|
||||
CHECK(find(t, "STRATA_SIDE_MIXER") && *find(t, "STRATA_SIDE_MIXER") == "2");
|
||||
CHECK(find(t, "STRATA_SPEC_COST") && *find(t, "STRATA_SPEC_COST") == "1");
|
||||
}
|
||||
// STRATA_DEFAULTS=026 (the 0.2.7 master switch; the sm_121 table is newer than 0.2.6) empties it
|
||||
@@ -51,7 +52,7 @@ int main() {
|
||||
put("STRATA_SM121_PERF", "0");
|
||||
CHECK(nv_default_env(12, 1, false).empty());
|
||||
put("STRATA_SM121_PERF", "1");
|
||||
CHECK(nv_default_env(12, 1, false).size() == 4);
|
||||
CHECK(nv_default_env(12, 1, false).size() == 5);
|
||||
unset("STRATA_SM121_PERF");
|
||||
// the other cards: sm_120 (RTX 50) and sm_100 get nothing from this file; the sm_86 / sm_60 tables are unchanged by the flag
|
||||
CHECK(nv_default_env(12, 0, false).empty());
|
||||
|
||||
Reference in new issue
Block a user