Repository navigation
serve: --moe-predict off|router|block, and the block predictor in the docs - #551
Conversation
… 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>
d6212b4 to
b27c692
Compare
PR Reviewer Guide 🔍(Review updated until commit af54be8)Here are some key observations to aid the review process:
|
|
Review (orchestrator): serve flag passthrough + docs, pairs with fork #137; draft until that one's device numbers are in, then both merge with the pin. |
|
Persistent review updated to latest commit b27c692 |
1 similar comment
|
Persistent review updated to latest commit b27c692 |
|
Triage: needs work — not the code, the claim under it. What the diff is (3 files, +61/-3): The flag is inert against every pin we have. Nothing in the pin reads the variable: and The consumer is llama.cpp #137 ( So: either (a) wait for #137 to be rebased onto the fork branch, merged and bumped into a pin before this docs text goes in, or (b) land this as an explicitly forward-declared stub and change that sentence to "not in the pin yet — engine #551 / llama.cpp #137". The arg parsing, validation and |
|
Persistent review updated to latest commit d6d0eed |
|
Persistent review updated to latest commit a782ed6 |
|
Persistent review updated to latest commit af54be8 |
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