Research: tails, position and other deep dives
Deeper views behind the headline numbers, for readers who want them: how the per-position differences are distributed, how they depend on the history behind a position, one document where the vLLM fork differs from itself, and the follow-up designs.
Tails and position (K3.25)
Most positions sit far below the mean: the median position's KL on P-A is 0.0032 (vLLM fork) and 0.0035 (CuteAFD) against means of 0.0458 and 0.0476; the highest-KL 5% of positions carry 57% and 57% of the total. p99 on P-B generated positions: vLLM fork 0.567-0.609 over its three runs, CuteAFD 0.620. On P-A, positions with a short history carry more KL on both engines (history 1-256 tokens: 0.114 and 0.115; 1,025-2,047 tokens: 0.032 and 0.035), so a panel's mean depends on which positions it scores.
What this shows. Three views of the same 51,175 per-position scores: how often a position exceeds a KL value, the mean by the history behind a position, and the share of the total carried by the highest positions.
How to use it. If the curves run together the engines differ in the bulk of positions, not in a few outliers.
Table view: the exact numbers
| Run | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 | Confident top-1 |
|---|---|---|---|---|---|---|---|---|
| vLLM fork V1 | 0.0458 | 0.0032 | 0.103 | 0.638 | 2.39 | 8.28 | 93.50% | 98.51% |
| vLLM fork V1r | 0.0458 | 0.0032 | 0.103 | 0.638 | 2.39 | 8.28 | 93.50% | 98.51% |
| vLLM fork V2 | 0.0458 | 0.0032 | 0.103 | 0.638 | 2.39 | 8.28 | 93.50% | 98.51% |
| CuteAFD C1 | 0.0476 | 0.0035 | 0.108 | 0.662 | 2.30 | 7.45 | 93.15% | 98.48% |
| Positions | History, tokens (min / median / max) | Run | Mean KL | p99 | p99.9 | Top-1 |
|---|---|---|---|---|---|---|
| rows 0-255 | 1 / 128.5 / 256 | vLLM fork V1 | 0.1143 | 1.325 | 3.95 | 88.61% |
| vLLM fork V1r | 0.1143 | 1.325 | 3.95 | 88.61% | ||
| vLLM fork V2 | 0.1143 | 1.325 | 3.95 | 88.61% | ||
| CuteAFD C1 | 0.1155 | 1.379 | 3.26 | 88.58% | ||
| rows 256-1023 | 257 / 640.5 / 1,024 | vLLM fork V1 | 0.0409 | 0.542 | 2.18 | 93.82% |
| vLLM fork V1r | 0.0409 | 0.542 | 2.18 | 93.82% | ||
| vLLM fork V2 | 0.0409 | 0.542 | 2.18 | 93.82% | ||
| CuteAFD C1 | 0.0421 | 0.559 | 2.08 | 93.43% | ||
| rows 1024-2046 | 1,025 / 1,536 / 2,047 | vLLM fork V1 | 0.0325 | 0.435 | 1.43 | 94.48% |
| vLLM fork V1r | 0.0325 | 0.435 | 1.43 | 94.48% | ||
| vLLM fork V2 | 0.0325 | 0.435 | 1.43 | 94.48% | ||
| CuteAFD C1 | 0.0346 | 0.447 | 1.66 | 94.09% |
What this shows. Three views of the same 15,104 per-position scores: how often a position exceeds a KL value, the mean by the history behind a position, and the share of the total carried by the highest positions.
How to use it. If the curves run together the engines differ in the bulk of positions, not in a few outliers.
Table view: the exact numbers
| Run | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 | Confident top-1 |
|---|---|---|---|---|---|---|---|---|
| vLLM fork V1 | 0.0457 | 0.0013 | 0.120 | 0.609 | 1.78 | 5.04 | 93.84% | 96.66% |
| vLLM fork V1r | 0.0451 | 0.0014 | 0.121 | 0.586 | 1.51 | 5.04 | 93.76% | 96.60% |
| vLLM fork V2 | 0.0446 | 0.0014 | 0.121 | 0.567 | 1.51 | 5.41 | 93.78% | 96.64% |
| CuteAFD C1 | 0.0484 | 0.0024 | 0.132 | 0.620 | 1.53 | 5.38 | 93.33% | 96.31% |
| CuteAFD C0 (control) | 0.0487 | 0.0024 | 0.132 | 0.582 | 1.70 | 5.08 | 93.47% | 96.39% |
| Positions | History, tokens (min / median / max) | Run | Mean KL | p99 | p99.9 | Top-1 |
|---|---|---|---|---|---|---|
| 0-2K | 1,084 / 1,735 / 2,361 | vLLM fork V1 | 0.0474 | 0.707 | 2.12 | 94.52% |
| vLLM fork V1r | 0.0468 | 0.707 | 2.11 | 94.60% | ||
| vLLM fork V2 | 0.0464 | 0.695 | 2.11 | 94.62% | ||
| CuteAFD C1 | 0.0486 | 0.655 | 1.55 | 94.20% | ||
| CuteAFD C0 (control) | 0.0502 | 0.693 | 1.81 | 94.20% | ||
| 2-8K | 2,083 / 4,254 / 5,781 | vLLM fork V1 | 0.0318 | 0.496 | 1.28 | 95.43% |
| vLLM fork V1r | 0.0329 | 0.462 | 1.32 | 95.69% | ||
| vLLM fork V2 | 0.0316 | 0.439 | 1.15 | 95.80% | ||
| CuteAFD C1 | 0.0328 | 0.513 | 1.20 | 95.83% | ||
| CuteAFD C0 (control) | 0.0335 | 0.470 | 1.02 | 95.43% | ||
| 8-16K | 10,284 / 12,069 / 14,402 | vLLM fork V1 | 0.0514 | 0.622 | 1.90 | 92.73% |
| vLLM fork V1r | 0.0500 | 0.577 | 1.41 | 92.40% | ||
| vLLM fork V2 | 0.0497 | 0.560 | 1.43 | 92.38% | ||
| CuteAFD C1 | 0.0557 | 0.636 | 1.64 | 91.69% | ||
| CuteAFD C0 (control) | 0.0551 | 0.558 | 1.63 | 92.16% |
What this shows. No BF16 reference exists beyond 14K tokens, so this compares the engines with each other (orange) and the vLLM fork with its own repeat (blue; it covers 24,576 of the 73,728 positions).
How to use it. The gap between the curves is the engine difference beyond run-to-run noise; it says nothing about which engine is closer to BF16 at these lengths.
Table view: the exact numbers
| Pair | Positions | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 agreement |
|---|---|---|---|---|---|---|---|---|
| CuteAFD vs vLLM | 73,728 | 0.0141 | 0.0024 | 0.022 | 0.135 | 1.09 | 25.62 | 96.18% |
| vLLM vs its repeat | 24,576 | 0.0047 | 0.0012 | 0.010 | 0.055 | 0.23 | 1.47 | 97.81% |
Tails and position (K4, top-20 measures)
What this shows. Three views of the same 51,175 per-position scores: how often a position exceeds a KL value, the mean by the history behind a position, and the share of the total carried by the highest positions.
How to use it. If the curves run together the engines differ in the bulk of positions, not in a few outliers.
Table view: the exact numbers
| Run | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 | Confident top-1 |
|---|---|---|---|---|---|---|---|---|
| vLLM launch 1 | 0.0192 | 0.0014 | 0.043 | 0.280 | 0.97 | 3.41 | 95.28% | 99.21% |
| vLLM launch 2 | 0.0192 | 0.0014 | 0.043 | 0.280 | 0.97 | 3.41 | 95.28% | 99.21% |
| CuteAFD | 0.0219 | 0.0017 | 0.050 | 0.314 | 1.01 | 4.01 | 94.73% | 99.11% |
What this shows. Three views of the same 15,104 per-position scores: how often a position exceeds a KL value, the mean by the history behind a position, and the share of the total carried by the highest positions.
How to use it. If the curves run together the engines differ in the bulk of positions, not in a few outliers.
Table view: the exact numbers
| Run | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 | Confident top-1 |
|---|---|---|---|---|---|---|---|---|
| vLLM launch 1 | 0.0306 | 0.0008 | 0.082 | 0.394 | 1.19 | 3.80 | 94.88% | 97.46% |
| vLLM launch 1, repeat | 0.0311 | 0.0008 | 0.080 | 0.436 | 1.23 | 2.65 | 94.91% | 97.48% |
| vLLM launch 2 | 0.0304 | 0.0008 | 0.078 | 0.415 | 1.18 | 4.53 | 94.99% | 97.66% |
| CuteAFD | 0.0358 | 0.0015 | 0.095 | 0.455 | 1.20 | 4.47 | 94.59% | 97.41% |
What this shows. No BF16 reference exists beyond 14K tokens, so this compares the engines with each other (orange) and the vLLM fork with its own repeat (blue; it covers 73,728 of the 73,728 positions).
How to use it. The gap between the curves is the engine difference beyond run-to-run noise; it says nothing about which engine is closer to BF16 at these lengths.
Table view: the exact numbers
| Pair | Positions | Mean | p50 | p90 | p99 | p99.9 | Max | Top-1 agreement |
|---|---|---|---|---|---|---|---|---|
| CuteAFD vs vLLM launch 1 | 73,728 | 0.0185 | 0.0022 | 0.021 | 0.191 | 2.34 | 19.83 | 95.92% |
| CuteAFD vs vLLM launch 2 | 73,728 | 0.0205 | 0.0022 | 0.021 | 0.196 | 3.06 | 19.83 | 95.80% |
| vLLM launch 1 vs 2 | 73,728 | 0.0114 | 0.0012 | 0.011 | 0.097 | 1.59 | 12.58 | 97.17% |
Computed by tools/kl_tails.py from the per-position files in q/rows/ (K3.25) and q/rows/ (K4); python3 tools/kl_tails.py --check reproduces them.
K3.25 by context bucket, with the follow-up F1 arms
Panel P-B, generated rows, against the mean of the three vLLM runs (two launches; pb-vs-vllm-mean3.json). The 8-16K bucket is block B, long code reading; whether length or content drives the difference is not separated here. F1c and F1d are follow-up F1 arms of CuteAFD, outside the frozen protocol. History: the tokens before each scored position. Tails (p99, p99.9) and KL by position: q/tails/.
| Bucket | Rows | History, tokens (min / median / max) | KL, CuteAFD − vLLM | Top-1, CuteAFD − vLLM | KL, F1c (W8A16 prefill) − vLLM | KL, F1d (KDA, head, prefill) − vLLM |
|---|---|---|---|---|---|---|
| all generated rows | 15,104 | 1,084 / 5,751.5 / 14,402 | +0.0033 [+0.0016, +0.0049] | -0.46 pts [-0.73, -0.17] | +0.0017 [+0.0006, +0.0028] | +0.0010 [-0.0002, +0.0021] |
| 0-2K | 4,035 | 1,084 / 1,735 / 2,361 | +0.0017 [-0.0006, +0.0044] | -0.38 pts [-0.88, +0.05] | +0.0007 [-0.0010, +0.0027] | +0.0008 [-0.0011, +0.0028] |
| 2-8K | 3,547 | 2,083 / 4,254 / 5,781 | +0.0007 [-0.0029, +0.0032] | +0.19 pts [-0.16, +0.52] | +0.0016 [+0.0007, +0.0026] | -0.0001 [-0.0017, +0.0013] |
| 8-16K | 7,522 | 10,284 / 12,069 / 14,402 | +0.0054 [+0.0034, +0.0074] | -0.81 pts [-1.22, -0.44] | +0.0022 [+0.0005, +0.0041] | +0.0016 [-0.0005, +0.0033] |
K4 precision in full, and K4 against K3.25 on the same measure
| Measure (top-20) | Scored history, tokens (min / median / max) | vLLM (mean of 2 launches) | CuteAFD | CuteAFD − vLLM [95%] | vLLM launch 2 − launch 1 | Reading |
|---|---|---|---|---|---|---|
| P-A, teacher KL20 (25 windows × 2,048 tokens) | 1 / 1,024 / 2,047 | 0.0192 | 0.0219 | +0.0027 [+0.0012, +0.0047] | +0.0000 | differs |
| P-A, top-1 agreement with the teacher | 1 / 1,024 / 2,047 | 95.28% | 94.73% | -0.55 pts [-0.72, -0.37] | +0.00 pts | differs |
| P-A, NLL of the actual token | 1 / 1,024 / 2,047 | 1.0627 | 1.0653 | +0.0026 [+0.0005, +0.0048] | +0.0000 | differs |
| P-B, generated rows, KL_pb20 | 1,084 / 5,751.5 / 14,402 | 0.0305 | 0.0358 | +0.0053 [+0.0033, +0.0076] | -0.0002 | differs |
| P-B 0-2K | 1,084 / 1,735 / 2,361 | 0.0325 | 0.0343 | +0.0018 [-0.0007, +0.0049] | +0.0004 | not resolved |
| P-B 2-8K | 2,083 / 4,254 / 5,781 | 0.0219 | 0.0235 | +0.0015 [+0.0005, +0.0027] | +0.0004 | differs |
| P-B 8-16K | 10,284 / 12,069 / 14,402 | 0.0334 | 0.0424 | +0.0090 [+0.0062, +0.0122] | -0.0009 | differs |
| P-B block B (long code reading; the 8-16K windows) | 10,790 / 12,083 / 13,388 | 0.0372 | 0.0469 | +0.0098 [+0.0064, +0.0137] | -0.0012 | differs |
| P-B, generated rows, top-1 agreement | 1,084 / 5,751.5 / 14,402 | 94.93% | 94.59% | -0.34 pts [-0.62, -0.09] | +0.11 pts | differs |
| Q2, NLL on human-written text, 32K-128K (6 documents, t-interval) | 28,672 / 63,487.5 / 131,071 | 1.2434 | 1.2510 | +0.0076 [-0.0076, +0.0228] | +0.0003 | not resolved |
Q2 without the window q2-code-c2-064k (reported separately by rule): CuteAFD − vLLM launch 1 +0.0012 [-0.0007, +0.0030], CuteAFD − vLLM launch 2 -0.0008 [-0.0086, +0.0071]. On that window vLLM differs from its own second launch on 192 rows by more than 1 nat (c2/). Determinism: CuteAFD's two passes were byte-identical on every window (row hashes); vLLM's two launches returned identical values on 20 of 64 P-B windows and on none of the 25 P-A windows, though their mean KL20 there differs by less than 1e-7.
| Measure (top-20, same definition on both) | vLLM, K3.25 | vLLM, K4 | CuteAFD, K3.25 | CuteAFD, K4 | CuteAFD − vLLM, K3.25 | CuteAFD − vLLM, K4 |
|---|---|---|---|---|---|---|
| P-A, teacher KL20 | 0.0365 | 0.0192 | 0.0380 | 0.0219 | +0.0015 [+0.0006, +0.0025] | +0.0027 [+0.0012, +0.0047] |
| P-A, top-1 agreement | 93.50% | 95.28% | 93.15% | 94.73% | -0.35 pts | -0.55 pts |
| P-B, generated rows, KL_pb20 | 0.0445 | 0.0305 | 0.0477 | 0.0358 | +0.0032 [+0.0014, +0.0049] | +0.0053 [+0.0033, +0.0076] |
| P-B 8-16K, KL_pb20 | 0.0495 | 0.0334 | 0.0547 | 0.0424 | +0.0052 [+0.0031, +0.0075] | +0.0090 [+0.0062, +0.0122] |
Where the long-code difference may come from
- CuteAFD's distributions are flatter at 8-16K (K3.25): predictive entropy 0.580 against the vLLM fork's 0.523, higher in 18 of 18 windows (read from the full-vocabulary dumps by the audit). This is why its NLL difference is larger than its KL difference on this greedily generated text.
- Candidates, not inferred: the FP8 projections, head and KDA projections; the sparse-attention indexer's key format (CuteAFD BF16, the vLLM fork FP8); attention placement (CuteAFD splits each attention layer across both GPUs, the vLLM fork gives whole layers to one GPU); prefill geometry; the vLLM fork's BF16 logits. The settings follow-ups switch the ones CuteAFD exposes; on K4 what remains with every switch off sits in parts with no BF16 option.
Q2 document c2 on K4: a window where the vLLM fork differs from itself
CPU-only reading of the K4 Block Q captures (top-20 rows), arms V-r1 and V-r2 (two vLLM launches) and C-r1 (CuteAFD). Document c2 is a concatenation of vLLM's own Python source. Its three Q2 windows are prefixes of one token stream (c2-032k = tokens 0-32K, c2-064k = 0-64K, c2-128k = 0-128K), and each scores its last 4,096 rows.
| Window (scored rows) | NLL, V-r1 | Top-20 entropy, V-r1 | Rows with |ΔNLL| > 1 nat: V-r1 vs V-r2 | V-r1 vs C-r1 | V-r2 vs C-r1 |
|---|---|---|---|---|---|
| c2-032k (28,671-32,766) | 0.448 | 0.313 | 9 | 34 | 29 |
| c2-064k (61,439-65,534) | 1.013 | 0.463 | 192 | 292 | 298 |
| c2-128k (126,975-131,070) | 0.611 | 0.334 | 70 | 67 | 90 |
| c0-064k (code control) | 0.508 | 0.344 | 8 | 25 | 23 |
| c1-064k (code control) | 0.586 | 0.416 | 9 | 15 | 14 |
| pg28988-064k (prose control) | 1.804 | 1.336 | 0 | 1 | 3 |
KL20n per window (the frozen Q2 scorer's engine-against-engine form) on c2-064k: vLLM against its second launch 0.094, vLLM against CuteAFD 0.148 and 0.168 (one value per vLLM launch). On the other 17 windows the same pairs read 0.003-0.039 (vLLM against vLLM) and 0.005-0.066 (vLLM against CuteAFD).
What the rows show:
- On c2-064k the two vLLM launches disagree with each other on 192 rows by more than 1 nat. vLLM's run-to-run variation alone produces nat-scale changes there; CuteAFD's count against either launch (292, 298) is of the same order. The K3.25 run had no vLLM repeat of c2, and its audit recorded that this window "cannot be attributed to either engine". On K4 the window is sensitive for vLLM against itself as well.
- The sensitivity is specific to the document and the position. It is small at 32K, largest at 61-65K and smaller again at 127-131K of the same stream; the c0, c1 and prose windows show 0-9 such rows between the vLLM launches. The text is ordinary code throughout (no long lines, runs, binary or non-ASCII stretches, scanned in 4K-token blocks).
- Many of the volatile rows are confident ones. Of the 192 vLLM-against-vLLM rows on c2-064k, 38 have one launch giving the actual token more than 0.9 probability; 20 are top-1/top-2 swaps between the launches. The window's NLL (1.01) is more than twice its top-20 entropy (0.46): the model is confident there and often does not predict the actual token.
- Long-range exact copying accounts for part of it. Rows whose next token completes a 12-gram that also occurs more than 2,048 tokens earlier are about three times as volatile between the vLLM launches on c2-064k (14% against 4.4%); c1-128k has 287 such rows and none of them is volatile.
Open question (not tested): whether near-duplicate code earlier in the stream, and which earlier variant the sparse-attention indexer selects, accounts for the confident flips. Answering it needs per-layer indexer selections from two launches.
The protocol reports q2-code-c2-064k separately and also gives the Q2 numbers without it (../q/q2-top20.json, without_outlier). Files: c2-summary.json (the table and items 2-3, from c2_summary.py), c2-rows.json (per window and pair: mean ΔNLL, rows above 1 nat by quarter of the window, the largest ΔNLL rows with their positions), copy-rows.json (item 4).
Follow-up designs
FOLLOWUPS.md: K3.25: F1 (FP8 switches), F2 (prefix cache), F3 (second vLLM launch), drift checkFOLLOWUPS-K4.md: K4: W8A16 prefillFOLLOWUPS-K4b.md: K4: the other FP8 switches, K4c (W8A16 + amax), K4d (W8A16 + best)RESULTS-F1.md: K3.25 F1 results in fullRESULTS-F1K4b.md: K4 settings results in full