… docs
The prefetch that hides a streamed model's expert reads was predicting with the gate-ahead
router, which does not fit Qwen3.8-Flash-Next's hyper-connections: layer l+1's router input is
its own mixer applied to the residual after layer l's MoE, so the residual-only form mixes
through the wrong weights and is a net loss on a drive at its limit (docs/moe-streaming.md,
"Flash-Next, streamed").
docs/moe-streaming.md now carries the predictor that fits -- l+1's own token-mixer block on the
current residual, before l's MoE output exists, with the recurrent/conv state writes redirected
to scratch -- with the flag, its measurement variables and the explicit note that it is untested
on device. serve gains `--moe-predict off|router|block`, passes it through to the llama.cpp pin
as ONEBIT_MOE_PREDICT beside ONEBIT_MOE_PREFETCH, and refuses a value it does not know.
The graph side lives in the pin (src/onebit-moe-predict.*, one hook in the qwen4exp graph), and
nothing here changes a running configuration: the option does nothing without --moe-slots, which
this build refuses until the HRX streamer lands.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Follows the pin-side change (
1bit-MONSTER/llama.cpp#137): the next-layer routing predictor that fits Qwen3.8-Flash-Next's hyper-connections. Nothing here changes a running configuration —--moe-predictdoes nothing without--moe-slots, which this build refuses until the HRX streamer lands.Why
The prefetch that hides a streamed model's expert reads used the gate-ahead router. On Flash-Next that predictor is wrong by construction: with four 2560-wide residual streams, layer l+1's router input is l+1's own mixer applied to the residual after layer l's MoE, so applying l+1's router to layer l's FFN input mixes through the wrong weights. It was right about two times in three, and every wrong guess is a read from a drive that is already the limit: 133 s per 512-token pass without prefetch, 247 s with depth 1 at 4,608 slots (
docs/moe-streaming.md, "Flash-Next, streamed").What lands
docs/moe-streaming.md, new subsection "The next layer's own block (Flash-Next; untested on device)": what the predictor computes (l+1's PLE injection, its attention or DeltaNet block, its combine, then its FFN mixer and router; ranking only, deeper than the layer's top-k), why an attention successor needs no state suppression and the recurrent/conv/PLE histories do (scratch), the flag and its measurement variables (_DEPTH,_MARGIN,_MIN,_LAYERS,_OUT,_STATS), and the explicit statement that it is untested on device and what is missing (the prefetch consumer, i.e. the streamer). The "Next" list item 3 now points at the built path.docs/serve.md: the synopsis line and a short paragraph under the streaming section, with the same "untested on device" note.app/serve.cpp:--moe-predict off|router|block, refused if the value is unknown, passed through asONEBIT_MOE_PREDICTbesideONEBIT_MOE_PREFETCHinside theONEBIT_MOE_STREAMING_HRXblock (the only place a streamed run reads it).Verification
Docs-only + one option in
serve; the engine is not built here (the HRX toolchain is not part of this host-side run, and no device run was made — that is the next step after the lane opens). The pin-side branch is built and its unit test passes on this box.Device plan (from the private notes, in this order)
ONEBIT_MOE_PREDICT=routervsblock, resident Flash-Next, hit rate of the next layer's experts; falsifier: block not >= 90 %.--moe-slots 4608and9216,--moe-prefetch 1 --moe-predict block: pass time against the 133 s baseline; falsifier: not below it at 4,608 slots (a correct predictor with no drive slack — then gate on resident share).🤖 Generated with Claude Code