Repository navigation
[RFC]: FlashLoop integration — token-sparse prefill, sparse decode attention, and KV residual quantization #156
Description
Status: RFC draft for discussion. Date: 2026-10-27.
Feedback period: at least one week after publication. Keep this issue open afterward for ownership and implementation tracking.
1. Motivation, goal and scope
Integrate FlashLoop as three independently selectable execution features:
- Token-sparse prompt updates across recurrent loops.
- Sparse decode attention with a cached reference contribution.
- Packed KV storage using a quantized base and cross-loop residuals.
The existing stage, scheduler, executor and loop execution boundaries remain. Scheduler continues to choose operations, token ranges and recurrence depths. FlashLoop changes the work performed inside those operations and the physical representation of their KV. A broad runtime refactor is not a prerequisite.
The integration targets the existing legal combinations of PD, mixed scheduling, WCPB, asynchronous execution, CUDA Graphs, block speculation and token pipelines. It does not make currently unsupported combinations legal: in particular, mixed scheduling still excludes speculative work. Compatibility is a delivery target, not a claim that these combinations already work with FlashLoop.
The first model target is four-loop Ouro with BF16 compute and LAST_EXITED history. Other models require their own sparsity schedules and numerical qualification. SHARED history is outside the initial scope. All features default to disabled, preserving the current dense execution path.
FlashLoop is approximate. Quality preservation must be measured; it does not imply identical logits, greedy sequences or sampling distributions to dense Ouro. Speculative acceptance must be evaluated against a clearly defined target using the same FlashLoop configuration and cache representation rules. Strict equivalence to serial execution is optional; an execution-dependent quantization policy must be identified as approximate and evaluated separately.
2. Baseline and existing execution boundaries
The code mapping below uses runtime revision 8fbf4cd and the accompanying local pipeline integration changes reviewed on 2026-10-27. Pipeline-specific contracts describe that working tree, not a claim that every change is in the committed revision. Implementation PRs must pin their actual base and patch revision.
The relevant existing contracts are documented in unified execution, runtime configuration, WCPB and self-speculation.
Caller process
LLM / StageClient
| IPC
StageWorker process
StageEngine
Scheduler + KVCacheManager + optional PD connector
Executor
ordinary ModelRunner or speculative round controller
shared ModelRuntime
model + attention + device KV operations
StageWorker owns process/device initialization and model loading. ModelRunner prepares batches, manages device state and buffers, orders streams/events and collects results. The speculative controllers additionally own draft, verify, accept/reject and token-pipeline progression.
ModelRuntime is the thin shared model invocation layer in executor.py. It consumes ForwardBatch, executes PRELUDE, RECURRENT or CODA, and returns ForwardResult. It also invokes the selected graph execution path. It does not own admission, request queues or speculative acceptance. Ordinary and speculative runners reference the same runtime, model and cache resources.
Consecutive loops may remain in one submission. FlashLoop must work both when execution returns to Scheduler after each loop and when a submission executes several loops locally. It must not add a CPU synchronization at every loop.
3. Algorithm contracts
Loop numbers below are one-based; runtime depth indices are zero-based. Every KV version refers to the same request, token position and physical Transformer layer. Attention statistics are also specific to a query and attention head.
3.1 Token-sparse prefill
Execute loops 1 and 2 densely. Before loop r, score eligible prompt tokens using the preceding completed loop states:
score[i] = norm(H[r-1, i] - H[r-2, i]) / max(norm(H[r-1, i]), epsilon)
active[r] = top_k(score over active[r-1], budget[r])
Scores use FP32 arithmetic. Retention budgets refer to the original selection window length, not the preceding active count. Active sets are nested. Break equal-score ties by absolute token position so packing and batch order do not change the result. Preserve the old active hidden rows before overwriting them; two tensor aliases cannot provide a meaningful cross-loop change score.
For selected rows, execute every physical layer's normalization, QKV projection, attention, output projection and MLP, followed by the end-of-loop normalization. Inactive rows retain their previous final hidden state and each layer's previous KV. They do not receive another normalization. Each active query still attends to every legal causal position, including inactive tokens' inherited KV.
An illustrative eight-token window with retention budgets 4 and 2 could execute:
t1 t2 t3 t4 t5 t6 t7 t8
loop 1 x x x x x x x x
loop 2 x x x x x x x x
loop 3 . x . x . x . x
loop 4 . . . x . . . x
At loop 3, active queries use the logical KV sequence [KV2, KV3, KV2, KV3, KV2, KV3, KV2, KV3]. The query for t4 sees t1 through t4. Compaction must preserve original positions for both RoPE and causal masking. Passing the compacted rows to a contiguous packed-prefill kernel without that mapping is incorrect. Existing per-query paged attention can serve as a reference; an optimized path must explicitly support nonconsecutive query positions.
For the integrated serving path, use fixed prompt selection windows. Each window has a stable identity and absolute boundaries independent of the temporary batch. Select by score within each window's budget, with no reserved slot for a window's final token or the final prompt token. Unselected positions retain their previous hidden state and KV. Window-local selection is an explicit variation from global prompt selection.
For window length N, candidate Ouro retention ratios are [1, 1, 0.25, 0.10]; these are calibration starting points, not validated defaults for this engine. All-off execution and 100% retention must bypass unnecessary selection work.
3.2 Sparse decode attention
Use loop 2 as the reference for loops 3 and 4, matching the reviewed standalone engine. Select keys independently for each physical layer, query position and attention head. Selection includes the current position if its probability ranks within the budget; it always excludes future positions and padding.
At the reference loop, compute full causal attention and retain:
S selected absolute key positions
m sum of reference probabilities on S
O_ref full reference attention output
C_ref reference weighted value contribution on S
At a later loop r:
p_local = softmax(Q[r] @ K[r, S].T / sqrt(head_dim))
C_new = m * (p_local @ V[r, S])
O[r] = O_ref - C_ref + C_new
Current-token Q/K/V are computed normally at each loop. Historical K/V are read at the requested depth, reconstructed if compressed. This feature reduces attention reads and QK/PV work; it does not eliminate the current token's KV write, projections or MLP.
For a scalar example, suppose the reference probabilities are [0.1, 0.3, 0.6] and values are [10, 20, 30]. Full output is 25. Selecting the last two keys gives m=0.9, C_ref=24, and an unselected contribution of 1. If the later selected softmax is [0.75, 0.25] and selected values are [20, 40], then:
O_new = 25 - 24 + 0.9 * (0.75 * 20 + 0.25 * 40) = 23.5
The approximation preserves the reference contribution outside S and its mass m; it does not compute the current full-softmax denominator. With all keys retained, m is 1 and the formula reduces to current dense attention, up to numerical error.
Reference state lasts only for that input token and its dependent loops. A new token establishes its own state. Loop 4 continues to use loop 2 as its reference; recursively updating selection from loop 3 is a separate algorithm variant. If execution skips the reference loop, sparse correction is unavailable and must not consume stale state. Fixed loop bounds below the sparse start remain dense.
The dense source kernel must supply selection statistics. Existing attention outputs alone cannot reconstruct key probabilities. Measure the cost of collecting statistics, top-k and cache writes; avoid permanently materializing a full attention matrix. A reference implementation may materialize probabilities.
3.3 Quantized base and cross-loop KV residuals
For X equal to K or V, store:
X_hat[1] = dequantize(quantize(X[1]))
delta[r] = X[r] - X_hat[r-1]
X_hat[r] = X_hat[r-1] + dequantize(quantize(delta[r]))
Subtract the reconstructed predecessor, not its uncompressed source value. For example, if X[1]=10.03 reconstructs as 10.00 and X[2]=10.08, the residual is 0.08. Storing the raw difference 0.05 would preserve the first round's error even if the residual were encoded exactly.
Use affine INT4 groups with stored minimum and scale. For a nonconstant group, scale=(max-min)/15, code is the rounded/clipped (x-min)/scale, and decoding is min+scale*code. Define constant groups explicitly to avoid division by zero. The reference configuration uses group size 64, FP16 quantization parameters, post-RoPE K grouped across token rows per channel, and V grouped across channels per token. BF16 remains the compute dtype. A packed storage dtype must not be mistaken for the model activation dtype.
Only active prefill tokens produce late-loop residual payload. Maintain explicit logical-position-to-compact-row mappings. An absent residual means inheritance; it is not equivalent to an INT4 code of zero, which may decode to a nonzero minimum. A logical loop-4 read can resolve to:
t1: base + delta2
t2: base + delta2 + delta3
t4: base + delta2 + delta3 + delta4
Keep logical LAST_EXITED history separate from physical storage encoding. Early-exited decode tokens inherit their final depth at deeper loops. Encoding that inheritance as absent residuals must establish the same logical validity as the existing finalization operation, with completion dependencies intact.
Optimized readers consume packed base/residual tiles directly during QK/PV, rather than constructing a full persistent BF16 shadow cache. Prefill scratch, conversion buffers and the recent BF16 tail remain part of peak memory accounting. Compacting residual payload is required for token sparsity to reduce physical capacity; merely writing zeros into fully reserved depth planes does not do so.
The reference rolling tail retains at least 64 recent tokens and flushes complete 64-token groups; it can therefore contain 64 through 127 tokens after a step. Its standalone flush timing cannot be copied unchanged into speculative or wavefront execution. Section 6 defines the additional representation constraints.
4. Local implementation changes
| Existing owner | FlashLoop responsibility | Main integration points |
|---|---|---|
| StageWorker and StageEngine | Construct validated feature configuration and account for resources | Stage initialization and memory planning |
| Scheduler | Keep existing selection/progress rules; obtain resource costs and selection-window readiness | core/scheduler.py, core/scheduling_policy.py |
| Ordinary and speculative runners | Own selections, token reference slots, scratch and event lifetimes | worker/model_runner.py, worker/speculative.py, worker/async_speculative.py |
| ModelRuntime | Invoke the same FlashLoop computation for ordinary and speculative calls | worker/executor.py, ForwardBatch |
| Model and attention | Compact token computation; dense source statistics and sparse correction | models/ouro.py, attention/, kernels/ |
| KV manager and device storage | Allocate, map, encode, read, inherit and release KV versions | core/kv_cache_manager.py, worker/metadata.py |
| PD connector | Transfer format metadata and every required storage region | pd/connector.py, pd/transport.py |
Extend current contracts with small named views rather than adding a new engine or a second scheduler. Proposed execution metadata carries absolute positions, depths, row modes, token-state slots and optional active-row mappings. The runner owns the tensors; the runtime and kernels borrow them for the submission.
Mixed rows can share projections/MLP where their shapes permit, while attention dispatches dense-source, sparse-correction and sparse-prefill segments. All segments restore results to their original logical rows. A backend may use separate kernels for these segments without separating their request lifecycle.
Extend backend capabilities for the operations actually required: source statistics, nonconsecutive causal queries, packed KV reads, device-owned positions and graph-safe sparse execution. Existing FA4 support does not imply support for these new operations. Explicit incompatible backend choices fail clearly; auto chooses a compatible implementation and reports the choice. Do not silently turn off a requested algorithm component.
5. State ownership and lifetime
| State | Identity and contents | Authoritative owner | Retirement |
|---|---|---|---|
| Prefill selection | Request generation, absolute window, depth; scores and nested active positions | Runner prompt state | Window completion and final dependent read |
| Attention reference | Request generation, token position/incarnation, layer/head; S, m, O_ref, C_ref | Runner token-state pool | Token completion/rejection and final dependent read |
| Packed KV | Request allocation, position, physical layer, depth and encoding version | KV storage with logical manager references | Existing allocation, prefix and transfer leases |
| Execution scratch | Gather/scatter buffers, source statistics, quantization staging | Submission/buffer owner | Completion event covering all users |
For R live token slots, L layers, H heads and head dimension D, attention output state is logically [R,L,H,D], mass is [R,L,H], and indices are [R,L,H,K_bucket] with valid counts/masks. Use FP32 mass and accumulation; source output storage precision is a measured accuracy/memory choice. Index width must cover the supported context. Prefill maps identify window-local rows and absolute positions separately. These are GPU tensors in accelerated paths.
A token's reference progresses through empty, source-ready, reusable and retired states. Source-ready requires stream ordering or an event establishing completed writes. Batch row numbers never identify persistent state. Position alone is also insufficient after rejection: a corrected token can reuse the same position. Reset state on token incarnation changes and reject stale execution generations.
Pipeline shifts move reference state with the surviving token, just as they move hidden, depth and candidate state. Snapshot/restore includes this state whenever the token can resume after its reference loop. A snapshot of hidden and KV alone cannot resume sparse attention correctly.
6. Composition with existing execution features
6.1 WCPB and fixed selection windows
WCPB may run (chunk A, loop 3) while later chunks are at loops 1 and 2. Global prompt top-k would require waiting for those later chunks and introduce a full prompt barrier. Use fixed selection windows instead, shared by ordinary, mixed, wavefront and PD execution.
Window boundaries are anchored to absolute prompt positions, not the current batch or prefix-cache hit. The final prompt window may be shorter. Initially, require scheduler chunks to align with the configured windows and contain whole windows; reserve enough hidden rows for them. Token-budget subdivisions may execute a window over several submissions, but selection for its next sparse loop waits for that window's complete scoring input. Report incompatible geometry at configuration time. The default window size remains a discussion item.
After active KV writes and inactive inheritance are ready, the existing per-depth frontier advances over the full logical window. Physical work count and logical completion count are different. Existing hidden-ring reclamation still waits for final-depth completion and dependent readers. Add the active maps and any old hidden rows needed for scoring to that lifetime and memory budget.
This windowed algorithm requires quality comparison against global selection. Changing the selection window is an algorithm change; regrouping the same windows into runtime batches should not change their selection decisions.
6.2 Mixed execution and asynchronous submissions
Keep the current mixed PRELUDE/RECURRENT selection rules. Sparse-prefill selection is local to its request/window; decode key selection is local to its token/head. Never run a top-k over unrelated requests simply because they share a batch.
Use a decode-first, active-prefill-second execution-row order. Build gather indices by stable partition and concatenation rather than a general sort on every submission. For example, [P0,D0,P1,P2,D1,P3] with active prefill rows P1 and P3 becomes [D0,D1 | P1,P3]. The split offset identifies the attention segments; compatible projections and MLP work can still share a batch. Preserve original absolute positions, request/token-state identities and a scatter map for results. Inactive prefill rows retain their prior state. Decode rows may require further dispatch by depth or reference/correction mode. Device-owned active selections and index construction remain on the GPU.
All token state and KV operations follow existing compute/boundary/copy stream dependencies. Do not read GPU positions, active counts or acceptance decisions back to the CPU to prepare the next asynchronous operation. Retain bounded buffers through ticket completion; CPU delivery of an older ticket cannot reset state already used by a newer submission.
6.3 Block speculation and token pipelines
With draft depth 2, drafting must retain loop-2 attention references for every verification input position as well as hidden and shallow KV. Verification then uses those references at loops 3 and 4. With draft depth 1, the verifier creates the reference when it executes loop 2. Classify verification rows as decode queries even when they are packed together; do not apply prompt token selection to them. Every row obeys its own causal length and source identity.
For a token pipeline, a request can simultaneously contain tokens at several depths. Reserve one reference slot per live token, not one per request. A rejected ancestor invalidates descendant references, candidate KV and pending writes; surviving slots shift together. Reuse is ordered after the last reader/writer. Existing legal preemption points remain; snapshots include surviving references and encoding state. Existing block/pipeline sampling and scheduling restrictions remain unless separately implemented and qualified.
Quantization adds a numerical rollback choice. An unverified candidate can change a K group's min/max and therefore the reconstructed values of accepted tokens. Removing the candidate does not undo that error. Reversible/private groups can preserve accepted values; retaining the quantization effect is an additional approximation to measure under Section 6.4. Rejected logical positions and stale pending writes must still be invalidated in either case.
6.4 Quantization timing and the quality/performance tradeoff
WCPB and speculation share the same quantization-timing problem. WCPB can read shallow KV while other work advances deeper windows; block verification can evaluate several positions before committing them. Encoding at different times can make these executions read different reconstructed values on the same prefix. Strict serial numerical equivalence is not a default integration requirement.
Memory safety remains mandatory: do not overwrite storage while GPU operations or transfers still use it. Order in-place conversion after those operations, or encode into separate storage and retire the old allocation after its final use. Readers must see a complete payload with matching parameters, maps and valid base/residual dependencies. This does not require every logical cache reference to disappear before encoding.
Evaluate two choices rather than mandating a version protocol:
- Execution-dependent encoding: convert at safe points in actual execution, without keeping extra versions solely to match serial execution. Measure additional numerical drift, task quality, speculative acceptance and runtime gains across batch sizes and schedules. This mode does not claim distributional equivalence to the originally defined serial target.
- Serial-aligned encoding: define representation visibility per query, splitting execution at encoding boundaries or retaining versions when necessary. Measure the additional storage, synchronization and lost batching against the stronger equivalence target; it is not assumed to be the preferred serving mode.
Different loops need not share quantization parameters. The choice concerns when readers switch representations, not whether KV may be quantized. Dependencies between encoded bases and residuals must remain well-defined in either mode.
A fixed completed-prompt encoding with generated KV kept in BF16 provides a simple comparison baseline. It saves no generated-history bytes and does not establish a lower prefill peak; reserve its full generation budget. Rolling and streaming encoding are candidates to evaluate against it, not blocked on strict serial equivalence. Include temporary BF16 storage and conversion overlap in peak memory accounting, and choose the policy from quality, throughput, latency and memory measurements.
6.5 PD handoff
Preserve stage roles: P produces prompt KV and final hidden; D performs CODA and local generation/speculation. Require an agreed model, logical layout, feature configuration and versioned encoding descriptor. The descriptor identifies bit width, group axes/sizes, depth representation, window policy and tail policy.
Extend NIXL registration and range descriptions to include base/residual payload, scales/minima, compact-position mappings, validity/inheritance metadata, BF16 tail and final hidden. Destination allocations bind logical entries to local addresses; source physical pointers are not portable cache identities. Reserve the required bytes for all regions before transfer.
Each exported range must have complete dependencies at the advertised depths. Unsealed groups can travel as an explicitly described BF16 region. Pin or version exported buffers until transport completion so tail flushes cannot mutate an in-flight source. D activates only after the required ranges and metadata are received and device-visible. Keep transfer generation, sequence, acknowledgement and cancellation leases; remote writes must terminate before destination reuse.
Ordinary prompt handoff does not transfer per-generated-token attention references: D creates those when it starts forwarding generated tokens. Migrating an already running speculative pipeline would require a richer snapshot and is outside this prompt-handoff protocol.
6.6 Prefix reuse and recovery
Prefix identity includes the model and algorithm/encoding configuration. Publish only completed selection windows whose token choices and stored representations are independent of a later suffix. A partially shared window cannot reuse its old selection: another suffix can change top-k even with causal attention. Quantization groups and inherited base dependencies must also be closed and immutable; complete physical pages alone are not sufficient evidence.
Snapshots include packed data, maps, encoding epochs, mutable tail and any live execution references. For WCPB, retain the existing rewind-to-completed-frontier policy and recompute incomplete windows deterministically. For pipeline recovery, restore surviving token state exactly. Preserve RNG and exit-policy state through the existing owners. Reject unsupported snapshot formats rather than restoring only dense fields and continuing with incomplete state.
6.7 CUDA Graphs and adaptive exit
Graphs need stable-address token/reference storage, bounded selection buffers, valid lengths and masked inactive rows. Extend graph keys for execution mode, encoding and capacity buckets where they change kernel structure. Capturing a specific batch's mask or source identity as a constant is invalid. An eager fallback may preserve the requested algorithm for unsupported shapes, with a diagnostic; it must not silently switch to dense model semantics.
Adaptive exit keeps the existing gate production and consumption timing. Sparse execution and quantization can change gate values and exit depths, so qualify their combined quality and latency separately. Requests exiting before loop 3 receive no late-loop attention savings, although source-statistics overhead may already have been paid. Measure that cost. Fixed-depth traces isolate execution savings from changes in exit behavior.
7. Configuration and resource accounting
Organize configuration into three independent feature groups. Each has a standard enabled switch and parameters belonging to that feature. All three switches default to false and do not require each other. These are proposed groups and fields, not an existing API; final names follow repository configuration conventions.
7.1 Token-sparse prefill: token_sparse_prefill
| Field within the group | Meaning | Initial contract or candidate value |
|---|---|---|
enabled |
Update only selected prompt tokens in later loops | Default false |
retention_by_loop |
Per-loop token fractions relative to the original selection window | Candidate [1,1,0.25,0.10] for four-loop Ouro; requires calibration |
selection_window |
Fixed token domain for independent top-k | Initially aligned with fixed prefill chunks; independent of temporary batch subdivisions |
This group controls prompt token selection only. Rank within the window without reserving final-token slots. Validate the window against existing chunk settings as in Section 6.1, rather than introducing conflicting chunking rules.
7.2 Sparse decode attention: sparse_decode_attention
| Field within the group | Meaning | Initial contract or candidate value |
|---|---|---|
enabled |
Recompute attention contributions only for selected keys | Default false |
key_retention |
Retained key fraction per query/head, relative to that query's causal key count | Calibrate for quality and performance; 1.0 provides a full-retention control |
The initial algorithm uses the loop-2 reference for loops 3 and 4, as specified in Section 3.2. This is an algorithm contract, not an additional switch for unimplemented reference-loop or selection variants.
7.3 KV residual quantization: kv_residual_quantization
| Field within the group | Meaning | Initial contract or candidate value |
|---|---|---|
enabled |
Store a quantized base and cross-loop KV residuals | Default false; disabled uses existing dense storage |
bits |
Quantization bit width for base and residuals | Initially only 4; other widths require implementation and validation |
group_size |
Elements per quantization group, with axes defined in Section 3.3 | Reference value 64; accept only sizes supported by readers/kernels |
tail_size |
Minimum recent BF16 token count for rolling quantization | Reference value 64; actual tail also includes an incomplete group |
policy |
Encoding scope, timing and numerical consistency policy | Fixed prompt or rolling; rolling policy declares whether it aligns with serial representation, evaluated under Section 6.4 |
tail_size applies to rolling policies; fixed-prompt encoding leaves generated KV in BF16. Accepted policies and values must match implemented capabilities; candidate choices in this table are not claims of existing support.
7.4 Shared validation and resource accounting
Keep logical layout=last_exited separate from physical KV encoding, which is determined by the quantization group rather than another duplicate master switch. Resolve one immutable effective configuration at stage initialization, validate P/D agreement, and include it in diagnostics, snapshots, prefix identity and benchmark records. Do not expose an independent configuration system per runner.
The allocator must budget payload, quantization parameters, maps, inherited references, mutable tails, live token references, graphs and conversion scratch. Speculation increases live token/reference count beyond request count. Small residual streams may require partially filled groups; account for their physical padding rather than assuming ideal retention ratios. Resource queries should report actual format costs without making Scheduler inspect packed tensors.
As a payload-only illustration, four BF16 depth versions cost 4N * 16 bits per scalar channel. Retention [1,1,0.25,0.10] with INT4 costs 2.35N * 4 before metadata and tails, a ratio of about 6.81. This is not an end-to-end memory or speed claim. In particular, generated tokens may update every depth.
8. Feature integration matrix
Organize implementation and acceptance by the three FlashLoop features crossed with existing runtime capabilities, without prescribing sequential increments. Deliver the work in three implementation PRs, one per FlashLoop feature. Each PR covers its feature's core implementation and the applicable integration work in its column. Matrix cells divide collaboration and validation work within those PRs; they are not separate PR deliverables. Contributors are encouraged to collaborate on each feature PR because its integration scope spans many areas. Each cell names integration or validation work; all are pending targets, not claims of implemented support. Existing combination restrictions remain: listing mixed and speculation separately does not make their combination supported.
| Existing capability | Token-sparse prefill | Sparse decode attention | KV residual quantization |
|---|---|---|---|
| Ordinary prefill / decode | Active-row gather/scatter; inactive hidden/KV inheritance; original positions | Reference contributions and sparse correction; separate state per input token | Base/residual encoding, compact allocation, direct reads and reconstruction |
| Mixed | Decode first, active prefill second; mapped writeback | Dispatch decode segments by depth and reference/correction mode | Read/write appropriate KV versions within a batch; match payload and parameters |
| WCPB / chunked prefill | Independent top-k in fixed chunks; advance full logical-window frontiers | No decode correction on prefill rows; establish references when decode begins | Safe encoding during chunk production/consumption; compare timing quality/performance |
| Async scheduling and execution | Retain active indices and scratch through final use | Token/submission reference lifetime; old tickets cannot overwrite newer state | Order encoding, reads and release through streams/events |
| Synchronous self-speculation | Prompt only; verification rows remain decode | References for each verification position; shared draft/verify algorithm | Candidate encoding and rejection; measure policy impact on acceptance |
| Asynchronous self-speculation | Hand off correct hidden/KV after prompt completion | Isolate references for outstanding rounds; GPU acceptance drives retirement | Allocation, conversion and invalidation dependencies across outstanding rounds |
| Token pipelines | Supply sparse-prefill results; no prompt top-k on generated positions | Slot per live token; shift on progression and invalidate on rejection | Cross-depth reads/writes/conversion; valid dependencies and safe reuse after rejection |
| PD disaggregation | Transfer inheritance/validity, required position maps and final hidden | D creates generated-token references locally; absent from ordinary prompt handoff | Transfer payload, parameters, maps and BF16 regions with agreed formats |
| Prefix cache | Reuse later sparse-loop results at complete selection windows; no direct partial-window reuse | No cross-request reuse of generated-token references | Encoding configuration in cache identity; reused groups/dependencies cannot change with a suffix |
| Preemption and recovery | Preserve completed selections or rewind and recompute deterministically | Preserve live per-token references needed after resume | Preserve payload, maps, tail and policy-required encoding state |
| CUDA Graphs | Stable active-index/buffer addresses; dynamic valid lengths/masks | Stable reference slots and selected-key buffers | Capture-compatible packed readers; stable addresses and capacity buckets |
| Adaptive exit | Preserve gate timing; evaluate sparse-update effects on exit | Account for reference-statistics cost when exiting before sparse loops | Preserve LAST_EXITED inheritance; evaluate gate and exit-depth changes |
Also validate interactions among the three features: sparse attention reads the logical KV produced by token sparsity; token sparsity plus quantization stores compact residuals only for active tokens; sparse attention plus quantization reconstructs selected keys directly. Cover all eight switch combinations, including the all-off existing baseline and all-on configuration, under the existing legal execution modes above.
Implementation shares the existing execution stack, with explicit capability checks for unsupported combinations. A working kernel alone does not complete its integration cells. Apply Section 9 acceptance criteria; dense physical copies of inherited KV in a reference cannot substantiate packed-memory savings.
9. Validation and acceptance
Algorithm and runtime correctness
Compare implementation against an explicit FlashLoop reference on fixed inputs, then compare FlashLoop quality against dense Ouro. These answer different questions. Use declared BF16/FP32 tolerances rather than assuming cross-batch bitwise identity.
- Token selection: nested sets, budget rounding, stable ties, unchanged inactive hidden, nonconsecutive causal positions, and inherited state when a window's final token or the final prompt token is not selected.
- Attention: scalar worked example, multiple heads, inclusion of the current token, reference-loop identity, full retention and missing/stale references.
- KV: constant groups, metadata precision, compact maps, inactive inheritance, partial groups, tail rollover and bounded direct-reader error.
- Composition: fixed windows executed atomically, split, mixed and as WCPB; several requests and depths; padding; prefix hits at legal boundaries.
- Speculation: accepted prefixes, rejection at each candidate, same-position replacement, multiple outstanding rounds, pipeline shifts, and quantization boundaries crossed by a verification batch. Check each mode against a reference implementing its declared encoding policy. Compare verifier rows with serial execution on the same prefix: require numerical agreement for serial-aligned encoding, and measure the divergence for execution-dependent encoding.
- Lifecycle: EOS, cancellation, late completion, request-ID reuse, memory pressure, preemption/resume and CUDA Graph buffer reuse.
- PD: payload and metadata parity, prompt hidden parity, partial transfers, producer flush during transfer, cancellation and failed destination activation.
Extend the existing suites rather than creating a parallel runtime test harness: mixed execution, split prefill, KV, prefix growth, speculation, async speculation, async lifecycle, graphs and PD.
Quality and performance
Measure all three components independently and cumulatively. Start with four-loop Ouro, fixed prompt/output sets and dense execution using the same runtime optimizations. Include short and long contexts, low and high concurrency, and fixed-arrival mixed workloads. Compare PD with the same GPU count and P/D ratio. Record window size, retention schedule, encoding policy, backend and actual execution mode. Keep generated length/exit-policy changes visible.
Report prefill latency, TTFT, decode ITL/TPOT, throughput, tail latency, failed requests and peak allocated/reserved memory. Separate steady cache bytes from conversion peak, reference state, graph storage and transient buffers. For speculation, include acceptance rate and complete draft/verify/accept cost. For PD, include transferred bytes, handoff latency and temporary storage.
Follow the performance workflow: repeated unprofiled measurements first, then separate ops-only and full profiles. Attribute gains and overhead to selection, packing, dequantization, projection sizes, kernel launches, synchronization and transport. A reduction in FLOPs or payload bytes alone does not establish a runtime improvement.
Use held-out task evaluation and long-context checks, including perplexity and retrieval-sensitive cases. Report uncertainty and per-task changes; average scores can hide a regression. Establish acceptable quality changes before promoting a configuration to a recommended recipe. Publication speedups from FlashLoop are context for investigation, not acceptance targets for vllm-rlt.
10. Decisions for discussion
- Selection-window default. Choose the initial size and scheduler alignment constraints from quality and occupancy measurements. Keep its semantics fixed across execution modes and include the window in prefix identity.
- Rolling encoding policy. Compare execution-dependent and serial-aligned encoding, including the treatment of quantization effects from rejected candidates. Choose from measured quality, acceptance, throughput and memory; strict serial equivalence is optional. Fixed-prompt encoding is a baseline.
- Quality budget. Agree on per-task degradation limits and uncertainty before selecting retention ratios, state precision and a deployment default.
References
- FlashLoop paper, especially Sections 4 and Appendix D.
- FlashLoop engine, reference-loop selection and decode correction.
- FlashLoop prefill and selection, compact active rows and nested budgets.
- FlashLoop cache and packing, reconstructed residuals and physical formats.
- Chipmunk, related cached sparse-delta attention and MLP computation across diffusion steps. Similarity of the update structure does not make its normalization or execution assumptions interchangeable with FlashLoop.
Source implementations guide the algorithm reference; vllm-rlt retains its own request, batching and resource lifetimes. Preserve applicable upstream notices when incorporating source code.
11. Ownership and progress
Use the cross-feature table and assignee columns from RFC #69, with the status markers from RFC #43. Track new FlashLoop implementation/integration, not completion of existing capabilities themselves. Section 8 defines each cell's scope.
Allocation: coordination comment. Shared support: @MinhaoLi0318 covers adaptive-exit evaluation across all three features; @0z5a helps with review and SM90 performance validation. KV quantization coordination, remaining storage/readers and unassigned integration cells remain open.
The implementation plan has exactly three feature PRs:
| Feature PR | Scope | PR link | Coordinator(s) | Collaborators |
|---|---|---|---|---|
| Token-sparse prefill | Core algorithm, configuration and all applicable integrations in its matrix column | — | @MinhaoLi0318 | @prettygirlisnotme (WCPB/mixed); @GrassHeadd (prefix cache) |
| Sparse decode attention | Core algorithm, configuration and all applicable integrations in its matrix column | #157, shared feature PR to be completed | @kunkunblueberry | @Levius-Fubuki (attention/backend, ordinary decode, synchronous self-speculation); @MinhaoLi0318 (adaptive-exit evaluation) |
| KV residual quantization | Storage/readers, configuration and all applicable integrations in its matrix column | — | TBD | @howardforpr (INT4 packing/unpacking, residual reconstruction); @MinhaoLi0318 (adaptive-exit evaluation) |
Collaboration is encouraged within each PR. Contributors can take different integration cells, contribute commits to the shared feature branch/PR, and review and validate each other's changes. Record the feature's coordinator(s) and collaborators above, and the contributors for each adaptation below. Coordinate shared interfaces across the three PRs; cross-feature fixes and combination validation belong in the relevant feature PRs rather than a separate integration PR per cell. PR numbering here does not impose a merge order.
- ⬜ Pending implementation;
Claimedidentifies assigned work without a reported implementation. 🚧 Implementation in progress or partially integrated; ✅ merged and validated for the stated scope. - Claim a cell, feature column or integration row as collaborative work within the corresponding feature PR(s). Multiple contributors may share a cell; assignees from other RFCs are not assigned automatically.
- Link each feature PR once in the table above. Cells track adaptation progress, contributors and validation evidence; they do not require separate issues or PRs. Completion includes the supported scope and evidence.
- Include combined quality, performance and memory validation in the relevant claims. Standalone completion does not qualify every combination. Unassigned work is shown as
—. Assignments refreshed on 2026-10-28; claims do not imply completed implementation or validation.
| Integration | Token-sparse prefill progress | Collaborator(s) | Sparse decode attention progress | Collaborator(s) | KV residual quantization progress | Collaborator(s) |
|---|---|---|---|---|---|---|
| Basic implementation: ordinary prefill / decode | ⬜ Claimed | @MinhaoLi0318 | 🚧 Shared foundation in #157; attention integration pending | @kunkunblueberry (foundation); @Levius-Fubuki (attention/ordinary decode) | ⬜ Packing/reconstruction claimed; remaining foundation open | @howardforpr |
| Mixed | ⬜ Claimed | @prettygirlisnotme | ⬜ | — | ⬜ | — |
| WCPB / chunked prefill | ⬜ Claimed | @prettygirlisnotme | ⬜ | — | ⬜ | — |
| Async scheduling and execution | ⬜ | — | ⬜ | — | ⬜ | — |
| Synchronous self-speculation | ⬜ | — | ⬜ Claimed | @Levius-Fubuki | ⬜ | — |
| Asynchronous self-speculation | ⬜ | — | 🚧 Reference lifecycle in #157; kernel integration pending | @kunkunblueberry | ⬜ | — |
| Token pipelines | ⬜ | — | ⬜ | — | ⬜ | — |
| PD disaggregation | ⬜ | — | ⬜ | — | ⬜ | — |
| Prefix cache | ⬜ Claimed | @GrassHeadd | ⬜ | — | ⬜ | — |
| Preemption and recovery | ⬜ | — | ⬜ | — | ⬜ | — |
| CUDA Graphs | ⬜ | — | ⬜ | — | ⬜ | — |
| Adaptive exit | ⬜ Evaluation claimed | @MinhaoLi0318 | ⬜ Evaluation claimed | @MinhaoLi0318 | ⬜ Evaluation claimed | @MinhaoLi0318 |
Activity
MinhaoLi0318 commentedon Oct 27, 2026
@bjf-frz I'd like to take Basic implementation for token-sparse prefill and the Adaptive exit row across all three features, as a collaborator on the token-sparse prefill PR. I can also coordinate that PR if nobody else steps up.
Adaptive exit is where I can add the most. I'm on the exact-policy async exit row in #69, and I ran the Ouro adaptive-exit evaluation in #56 (pinned 3-shot GSM8K, paired McNemar against fixed depth, matched-work throughput, per-token exit depths), so most of the harness for this row already exists. Two inputs from it for Section 6.7:
docs/runtime.md:334), so token-sparse prefill doesn't move any prompt gate. What it changes is the loop-3/4 prompt KV that deeper decode tokens read. Decode tokens that exit at depth 2 only read loops 1–2, which stay dense. In [RFC]: Adaptive early exit on Ouro-1.4B: accuracy–throughput evaluation and exact-policy async exit #56 (ouro, τ=0.2,min_loops=2, GSM8K 1,319, on09f229a), 81.6% of decode tokens exited at depth 2; at fixed depth, none do. So the same retention schedule can cost very different quality under fixed depth and adaptive exit. I'd report both, plus a trace-mode replay of the dense run's exit depths (depths_by_request) to separate execution savings from exit-depth changes, as 6.7 suggests.For KV residual quantization, I'd use the same three runs (fixed depth, adaptive exit, trace replay), since quantized KV can also shift gate values and exit depths.
For decisions 1 and 3, I can run windowed vs global selection with a pre-registered rule, as in #56: thresholds and test fixed before the run, paired McNemar with 95% CIs on GSM8K, plus a long-context retrieval set.
I'd start after the feedback period and after the #83 rebase. Before writing code, I'll post the reference-parity plan here (fixed inputs against FlashLoop
prefill.py/selection.pyataeaadee). Does that split work for you?AI assistance: Claude Code read the RFC, checked the docs and #56 numbers, and drafted this reply; I reviewed it before posting.
prettygirlisnotme commentedon Oct 27, 2026
I'd like to take the WCPB/chunked-prefill and mixed-execution parts of token-sparse prefill, including active-row packing, position mapping and hidden/KV inheritance.
@MinhaoLi0318 I'll build on the basic implementation and keep this in the same feature PR.
GrassHeadd commentedon Oct 27, 2026
I’d like to take the prefix-cache cell for token-sparse prefill.
I’ll make sure cache hits stop at completed selection-window boundaries. If a hit ends partway through a window, that window should be recomputed; the same goes for a short final prompt window if a later request extends it. I’ll check how window boundaries need to align with KV blocks and make sure cache identity includes the effective sparse-prefill settings.
I’ll add tests for partial-window hits, different continuations, and configuration changes, then run CUDA validation once the basic implementation is ready. @MinhaoLi0318 and @prettygirlisnotme, I’ll coordinate the cache boundary with your work and contribute through the shared feature PR.
Levius-Fubuki commentedon Oct 27, 2026
I’d like to take the basic implementation and synchronous self-speculation cells for sparse decode attention, focusing on attention interfaces/backend capability checks, the reference implementation, and ordinary synchronous decode integration, followed by speculative adaptation and validation of per-token reference lifetime and acceptance/rejection handling.
I’ll contribute through the shared sparse decode attention feature PR and coordinate interfaces with the other feature contributors.
kunkunblueberry commentedon Oct 27, 2026
I'd like to contribute the asynchronous self-speculation integration for sparse decode attention, building on the basic and synchronous path.
My proposed scope is the lifecycle contract for per-token reference state across outstanding rounds: preserving references for verification inputs, invalidating rejected candidates and dependent descendants, and ensuring slots are not reused before the final reader/writer completes. I'd cover focused tests for draft depths 1/2, rejection at different candidate positions, same-position replacement, delayed completion, and reference-slot reuse.
I'll coordinate the metadata/interface with @Levius-Fubuki and contribute through the shared sparse-decode-attention PR, avoiding overlap with the basic implementation and synchronous self-speculation. Does this split fit the current plan?
HowardYangAI commentedon Oct 27, 2026
I'd like to work on INT4 KV packing/unpacking and cross-loop residual reconstruction. I plan to use FlashLoop's packing.py and the residual reconstruction code in cache.py as references and adapt them for vllm-rlt. I'll add CPU/CUDA tests for reconstruction error and storage size, and coordinate the format with the storage and kernel contributors in the shared KV quantization PR
MinhaoLi0318 commentedon Oct 27, 2026
@prettygirlisnotme Sounds good, happy to share the PR. To avoid writing the same code twice, here's the split I'd suggest, following the Section 8 matrix:
Before writing code, I'll post the reference-parity plan here together with the active-row view (window ids, absolute positions, active indices), so your cells can build on the same interface. Does that boundary work for you?
AI assistance: Claude Code compared the claims with the RFC matrix and drafted this reply; I reviewed it before posting.
prettygirlisnotme commentedon Oct 27, 2026
That split works for me. I'll handle chunk/window progress and mixed-batch packing/writeback on top of your active-row view.
0z5a commentedon Oct 27, 2026
Hi @prettygirlisnotme @kunkunblueberry @GrassHeadd @Levius-Fubuki @MinhaoLi0318 @howardforpr ,Thanks a lot for your enthusiasm! Please make sure to reuse to current interface and test high-currency end-to-end throughput with different batch sizes before submission of PR.
I could help to review, validating end-to-end throughput with Nvidia SM90 GPUs, and explore more space for KV cache quantization optimization based on current paper. Feel free to ping me any time.
Superone77 commentedon Oct 27, 2026
Thanks a lot, I could also help to review and provide more details about the algorithm! Feel free to ping me any time.
0z5a commentedon Oct 27, 2026
@bjf-frz Could you please add https://github.com/Superone77/FlashLoop to the issue description? I think it is an important code reference.
bjf-frz commentedon Oct 28, 2026
Thanks everyone. Here’s the proposed allocation:
Three PRs total, one per feature. Please collaborate within the shared feature PRs.
Special thanks to @Superone77 for offering algorithm guidance and review support!
LyxWxj commentedon Oct 28, 2026
@MinhaoLi0318 @prettygirlisnotme Hello : ). Due to fast-paced development, some code could've beed designed better in wcpb #144 . I would like to do a small(or medium) refactor on the Wavefront scheduling of Scheduler and open the pr (very soon), keeping the logic unchanged while making the code more concise, and I will fully take the design of this new feature into consideration so that you can easily develop on it without a large refactor. Appreciate your understanding : ). I’d also be happy to collaborate with you in implementing this feature if you don't mind.
benchmarks: engine-level TTFT and ITL comparison for sparse decode at…
prettygirlisnotme commentedon Oct 28, 2026
Thanks for the heads-up! Happy to coordinate. I'll check your refactor before changing the scheduling path.
MinhaoLi0318 commentedon Oct 29, 2026
@bjf-frz The allocation works for me. For token-sparse prefill I'll open the shared PR as a draft from my fork once the basic path runs; @prettygirlisnotme and @GrassHeadd can send PRs against that branch, so the feature stays in one PR.
@LyxWxj Thanks, happy to work on it together. I see #159 is up. The active-row view (window id, absolute position, active indices) sits right on top of the wavefront selection and prefill progress it reshapes, so I'll write the interface draft against #159 rather than current
main, and I'll review #159 from that angle.Before writing code, I'll post the reference-parity plan and a draft of the active-row interface here by Friday (10-30), including the end-to-end throughput runs across batch sizes that @0z5a asked for. For adaptive exit, I'll reuse the #56 harness and report fixed depth, adaptive exit and a trace replay for each of the three features.
AI assistance: Claude Code read the thread and drafted this reply; I reviewed it before posting.
LyxWxj commentedon Oct 30, 2026
The remaining WCPB/refill/priority-preemption liveness issue documented in #137 should be resolved before enabling token-sparse prefill in the affected configurations.
We observed that failure in mode
atomic_prefill=Falsewhether wcpb on or off before commit 51479a8, and that failure occurs whenmode="mixed"and wcpb on(or we havn't found a corner case which introduces that failure whenmode="mixed"wcpb off yet) since 51479a8. Since we may maintain a larger window(larger than chunk size) for token sparse selection, I concern that failure will be more dangerous when flashloop on.MinhaoLi0318 commentedon Oct 30, 2026
This is the reference-parity plan and active-row interface proposal I promised. Anchors: main
9ad03fc(#159 merged; thecore/scheduler.pylines cited below are the same as atb4a848a), #157e4f8988(tests unchanged in kunkunblueberry'sf292b76), FlashLoopaeaadee. Nothing is implemented yet.1. Reference parity
select_prefill_tokens/sparse_prefill_loop(CPU/FP32 tiny model,force_last_token=False) andflashloop_torch(GPU/BF16 Ouro-1.4B, @Superone77's gold on Sparse decode attention: per-token reference lifecycle for async self-speculation #157), with our active sets injected throughexplicit_masksbecause it always forces the last token (flashloop_torch/token_updates.py:305).atol=rtol=4e-5(tests/test_sparse_decode_sync.py:279-291) on per-loop hidden states, K/V and logits; exact active sets; bitwise-unchanged inactive rows. BF16 is judged against the dense HF-vs-native logit gap.max(1, ceil(f·window_len))budgets, smaller-position tie-break as inselect_keys(attention/sparse.py:123-136). Windows never span requests; in FP32, selection must match alone, batched and split.2. Active-row interface (proposal)
I propose no new scheduler field:
ScheduledRequest(core/scheduler.py:24-38) already carries absolute start, depth,chunk_startand ring offset. Three rules::558-591,:642);:887-898,:761).Worker side (
build_execution_batch,worker/executor.py:16):Scores compare loop r−1's input and output (
worker/executor.py:203-212). Active rows run throughrecurrent_prepared(models/ouro.py:283-291) via gather/scatter; inactive rows skip the extra norm. KV inherits by copying the previous depth plane forward, likefinalize_token(core/kv_cache_manager.py:752-777). Attention uses the per-queryDeviceKVMetadatapath (worker/metadata.py:44-69), so no loop needs a CPU sync. Window-level state (the selection map and loop r−1's saved scoring inputs) is runner-owned and released only after the last fragment and reader that depends on it, not at one chunk's retirement, as @LyxWxj noted under inline 3.@prettygirlisnotme: (a) at
:642and (b) fit your WCPB/chunk-window scope, and your #159 reply already gates selection on the full window. Your prototype already cuts budget-sized fragments, including zero-active ones, so (c) touches it: would you like to take (c), or should I? I'll put the shared view up next week so your prototype can move onto it.@GrassHeadd: WCPB anchors chunks at the prefix hit (
:457,:618-621), so the window-boundary stop you described also fixeswindow_startin the shared view. Does that match your plan?3. Measurements
[1,1,0.25,0.10], C = 1/8/32/64, GSM8K and long prompts, three warmed repetitions; TTFT, prefill latency, tok/s, peak memory (KV vs workspace). Dense is the acceptance baseline (#157 review); on the reference path this shows overhead, not final speed. About 5 A100-hours. @0z5a, could you rerun it on SM90?ouroτ=0.2 (min_loops=2), plus feature replaying dense exit depths (trace mode,docs/runtime.md:307). Reported: paired McNemar (95% CIs), exit-depth agreement, loops per question; for sparse decode, tokens exiting before loop 3. Accuracy budgets are set beforehand. About 2 A100-hours per feature.Hours are #56-based estimates (about 11 total); the reference path may be slower. Full 1,319-question runs will be decided from screen results.
4. Open question: progress under preemption
@LyxWxj showed on #137 that WCPB with refill and priority preemption can replay
PREFILLING_PRELUDEwithout progress: there is no PRELUDE/RECURRENT fairness rule, and_rewind_split_prefill(engine/stage_engine.py:637-653) returns a preempted request to its final-depth frontier. Rule (b) would likely add another wait on that path. @LyxWxj added here that the failure still occurs withmode="mixed"and WCPB on after51479a8, and that windows larger than a chunk make it more dangerous. Agreed: I propose token-sparse prefill stays disabled in that configuration until the liveness issue is fixed, and the #137 workload goes into the parity tests as a liveness check. Is a PRELUDE/RECURRENT fairness rule on your list, so (b) can build on it?5. Boundaries and order
I own config, selection, the active-row view, KV inheritance, atomic-PREFILL alignment, parity tests and adaptive-exit evaluation, and build on main now that #159 has merged. The shared view comes next week; after the feedback period, the CPU reference path, then the shared draft PR.
AI assistance: Claude Code read the code and drafted this plan; I reviewed it before posting.
0z5a commentedon Oct 30, 2026
@MinhaoLi0318 I ran the SM90 dense baseline requested in your measurement plan on
gh200_1(one NVIDIA GH200, SM90, 97,871 MiB device memory), pinned tomainat9ad03fce. This is the dense acceptance baseline only: token-sparse prefill is not implemented at this head, so retention 1.0 and[1,1,0.25,0.10]could not be run. I did not run an adaptive-exit feature screen or claim a feature speedup.Setup: BF16 Ouro-1.4B (model revision
574fa66c), Triton attention, refill scheduler, 256-token prefill chunks, four fixed loops, greedy decoding, 16 generated tokens per request with EOS ignored. I used the first 64 fixed prompts from the frozen GSM8K-87 protocol (289–372 tokens), plus deterministic concatenations of those prompt token IDs to 1,536 and 4,096 tokens. The 4,096-token cells use 16 requests; the others use 64. The long prompts are synthetic length workloads, not long-document tasks. No speculation, CUDA Graphs, prefix cache, or preemption. Each cell had one same-shape warmup and three measured repetitions.Direct StageEngine: output tokens divided by the full burst wall time, including enqueue, prefill, decode, and drain. TTFT is host arrival to first returned token. Prefill is the median of the last-false/first-true observations when polling the final prefill CUDA completion event; it is a coarse observation interval, not an exact GPU timestamp. Memory is the maximum PyTorch allocated peak across repetitions / fixed four-depth KV pool / remainder after model and KV subtraction, in GiB. The remainder includes engine allocations and transient workspace, so it is not pure workspace.
The 4,096-token C32/C64 cells were skipped before allocation: their predicted KV pools were 96.94/193.69 GiB, above the frozen 86%-of-device-memory ceiling. The direct-engine audit passed for all ten measured cells (plus one separate smoke cell); every measured repetition completed all requests with 16 tokens at depth 4, reached its planned resident C, and drained KV allocations.
I also ran a loopback HTTP/SSE check against the pinned source's completions endpoint. Each request returned HTTP 200,
[DONE],finish_reason=length, and 16 completion tokens; the selected HTTP prompts tokenized to the same IDs as the direct run. Here, C is client in-flight concurrency. First-event timing includes client/server transport and queuing. Each prompt-length server kept one KV pool sized for its largest C, so these are not per-C memory readings.One numerical caveat: direct-engine outputs were identical across three repeats within each C, but GSM8K C1 versus C8/C32/C64 matched only 58/64, 57/64, and 57/64 complete 16-token sequences. A separate diagnostic reproduced source ID 152's first-token difference: the leading BF16 logits tie at 17.375 for C1, while C8 has 17.375 versus 17.250. This is a numerically sensitive example, not a proven explanation for every divergence. HTTP high-C repeats also changed 1–2 request texts per cell. I would not treat the cross-C outputs as bitwise equivalent or these 16-token runs as GSM8K answer scoring.
Both independent audits passed. I retained the exact source archive and manifest, frozen protocol, model hashes, raw per-request results, logs, diagnostic vectors, and GPU admission/closeout receipts in a local evidence bundle (SHA-256
cc801af48e164952a65fd6805743bd0aac01cf93007d2ff18773e3fedf282f62). Final readback showed no task-owned process, GPU compute app, device handle, or lock holder. I can share the raw bundle if useful when the feature branch is ready for the dense/retention comparison.prettygirlisnotme commentedon Oct 30, 2026
Thanks @MinhaoLi0318, I can take (c) with WCPB/mixed. I'll keep logical progress and KV capacity separate from the active-row budget. We can settle whole-window versus fragment scheduling with the shared view.
sparse decode attention: remove the per-layer host round-trips from c…
sparse decode attention: fused consume and no host round-trips in the…