Repository navigation
Conversation
aa3d9f6 to
ca5e9c6
Compare
ca5e9c6 to
608d85d
Compare
|
Thanks @swbiggart, this is a small, well-aimed change, and the receipt is easy to follow. What I checked:
Asks:
Your GB10 receipt stops at four streams, and 8 streams and sampled requests ran on one RTX start each. Once these are in and CI is green, we'll run main against this branch on two GB10s at 1, 4 and 8 streams, greedy and sampled, with token hashes.
|
608d85d to
b3f49c0
Compare
|
Thanks for the review.
|
…s first 50 ms, then blocks
b3f49c0 to
a8c5046
Compare
|
Rebased onto main |
|
Thanks @swbiggart. The rebase keeps #2977's ledger entry, and the per-rank CPU measurements, including 60 idle seconds, close the remaining author asks. This now waits on one final main/branch run that we'll schedule on two GB10s: 1, 4 and 8 streams, greedy and sampled, with token hashes and CPU time. No action needed from you. We'll preserve both sets of wire tests and re-pin the combined file when this and #2978 land.
|
What this changes
At
--tp 2, a Flash Next rank with no control-link frame yet waited in a blockingpollof up to 1 s and woke latewhen the frame came; now a link wait polls with a 50 µs timeout for its first 50 ms, then blocks as before. Drafted
rounds are mostly such waits, so ranks now pick up the next header sooner. Replies are bit-identical; on two GB10s
drafted decode is 1.4-1.5% faster at one stream and 3.7-4.7% faster at four.
ab78aef90). Commits:6715e3fc7(the change, its test, the serving pin) anda8c504622(changelog and ledger).
atc overlap --json(ATC 0.9.6, 2026-11-11, onabb0ea372, before the rebase):complete: false, so I read all250 open pull requests' file lists. None touches
cuda_rank_wire.zig; 100 shareCHANGELOG.md,docs/optimization-ledger.md(server: --profile fast refuses as not planned (#1660) #2794, Flash Next on Metal: the scale index is the default; prompt gathers and grouped experts read it, routed arrays are released #2805, Windows: source-build the 5090 preview as tensorfold.exe #2809) orzig/tests/fixtures/gradient-serving.tsv(GLM-5.3-Flash on CUDA: a decode window's DSA select on many CTAs #2722, CUDA (GB10): a second carveout source, spark-attic's atticd, opt-in #2762, CUDA (GB10): Flash Next KV in the display carveout, opt-in #2763,cuda: tf_qmm_prefill_many works out its copy addresses once, before the K loop #2825, other rows). Trial merges against the old main and head: 26 clean, 52 already conflicted with main, 22 only
at the
CHANGELOG.mdUnreleased heading the branch then re-opened (DeepSeek-V4.1: read the pack's weight spans past the page cache (core/direct_io) #1924, CUDA: #1764's BF16 prompt tile for Qwen ModelOpt, Nemotron and Dory, plus two exact Qwen prompt kernels (#1762) #2008, Vulkan: qmm_q4_tile_rows computes four rows and two columns of a prompt chunk per thread, 3.6% to 33% less run time on an M1 with the same logits (stacked on #2016) #2017, gemma4 Metal: Gemma 4 E4B (NVIDIA Nemotron 3.5 Bolt E4B) on M1 to M4, per-layer inputs and shared KV #2273, ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302, ricursive: Ripple-65B-Preview's DFlash2 drafter on native CUDA #2475,ricursive: load Ripple's EXL3 packs through main's shared EXL3 code #2514, ricursive: serve Ripple-65B on two GB10s with up to 1M tokens of context #2522, ricursive: speed up Ripple-65B on two GB10s #2523, dsv41 lookup: add TF_DSV41_COPY_DRAFTER ranked band matching, doubling and yield gating #2638, hip flashnext: a shared round's streams draft in one head pass a step #2696, qwen27: slot 0 keeps its rewind point through the warm pass #2723, hip flashnext: verify windows run their DeltaNet from the round's plan, with no state snapshot a row #2728, hip flashnext: an eight-row verify window, so a lone stream's copies land up to seven tokens a round #2730, XPU: Qwen3.8-27B attention merge with 16 subgroups per head, bit-identical #2799, server: the last --compact-at wins (auto then a fraction kept auto) #2883, server: serve --config FILE.toml reads flags from a file #2885, llama on Metal: Qwen2 checkpoints, Bimo-7B-CyberAgent's bf16 release with its q, k and v biases and YaRN at HF's rounding points #2890, xpu: a sampled Qwen3.8-27B row draws from a top-k kept on the card #2895, core: Admit and Ledger move to engine_admission.zig, unchanged #2896, server: --execution-witness serves a read-scoped snapshot of what runs, or why it is unknown #2901, native: the CUDA kept-state identity is written once through any hasher, its keys unchanged #2903): keep
both lines. Re-run:
atc overlap --jsonat 2026-11-12 14:07 UTC on head608d85d30; everyconflictsentry is named in this section, or adds no conflict beyond those it already has with main (1), or conflicts only inCHANGELOG.md's## Unreleasedlines, as this section describes (7); each checked withgit merge-tree.Checks on this head
a8c504622c5c1f7231ce501fbee0c4ddd569678af0d8c8d50,eab305db0,4f8317dac,000b534a2,3885dceb2,0fed2e4a5andab78aef90,which moved only
CHANGELOG.mdlines and, ontoab78aef90, put this ledger row beside flashnext cuda: at --tp 2 a prompt pass reduce-scatters its routed experts' slots by rows and gathers their sums #2977's (main's Flash Next changes in that span, among them flashnext: refuse a malformed TF_FLASHNEXT_* setting by name before device work #2585 ineab305db0, which readsTF_FLASHNEXT_*settings,b0a3d76ba, which moves the n-gram gather's host workers, and flashnext cuda: at --tp 2 a prompt pass reduce-scatters its routed experts' slots by rows and gathers their sums #2977's expert exchange, touch none of these files), so every receipt stands.python3 tools/zig/lean_check.py), baseab78aef90and head: 341 and 341, the same lines, 0 new.pr_check.py --base upstream/main: 0 errors, 1 advisory warning (no PR number).git diff --check upstream/main...HEADandzig fmt --check build.zig zig: pass on this head;zig build: pass ona21bfddc2, this code before the changelog-only rebases onto000b534a2,3885dceb2and0fed2e4a5.zig build test-cuda-host: pass on this head, Linux x86_64 in the CUDA 13.3.1 image (noerror:lines; run without--summary, so no Build Summary line; with iton
abb0ea372: 790/792 passed, 2 skipped); a plantedexpect(false)in the new test fails it.zig build test test-golden -Dcpu=apple_m1, run on85f61cf0f, this code oneab305db0before thechangelog-only rebase:
837/839 steps succeeded (1 failed); 7588/7662 tests passed (73 skipped, 1 failed). Thefailure,
dashboard_test, is inherited: maineab305db0fails the same test on the same Mac (837/839 steps succeeded (1 failed); 13041/13152 tests passed (110 skipped, 1 failed)).zig build test-gradient-serving: pass on this head.cuda_rank_wiretest (on Linux it bounds context switches), three aarch64 runs each on a GB10: main'swait, no short polls, and short polls that never end each fail 3/3; this change passes 3/3. Windows skips it.tf-cuda-test flashnext-rankon the RTX pair,abb0ea372:sum,eof,missingpass;timeoutfails as onmain (a test bug fixed separately).
6c5cef894against this change on it, two GB10s, three 4-stream drafted cells and 60 idle seconds: in the review reply of 2026-11-13. Per cell 0.5 s less on rank 0 and 0.1 s less on rank 1; idle unchanged.--context 65536leaves no room to reply.--tp 2only).Receipt
Main against branch: 2 x GB10 (200G RoCE), alternated starts (fresh loads). Decode: median of 3 greedy
256-token requests; streams:
bench_concurrent.py --levels 1,4 --alone --serial, median of3 reps.
2 x RTX PRO 6000 Blackwell Max-Q, one start each, supporting only (chat / code):
Boxes it reaches: Flash Next on CUDA at
--tp 2, both ranks.New switch? Default, accepted values, profile row: none.
Environment, with the TensorFold commit, Zig and backend toolchain, machine and GPU, checkpoint and revision: GB10
decode main
7d97cc656against043741fb9(this change); GB10 prompt and RTX main93a2e93ecagainst68758c594andabb0ea372(this branch). Zig 0.17.0, CUDA 13.3.1, NCCL 2.32.3. GB10: sm_121, 121.7 GiB, Ubuntu24.04.4, drivers 580.178.04 and 580.159.03. RTX: sm_120, driver 595.99.02.
nvidia/Qwen3.8-Flash-Next-NVFP4fc694b54fb0174e0913e6adf86691ef85a4ead47, MTP drafts,--context 65536 --prompt-cache-gib 0.Paths and platforms the change reaches, which I ran and which I could not: the CUDA
--tp 2rank link (ppollonLinux,
poll(1 ms)elsewhere); ran: both pairs above.Exactness, from
tools/bench_concurrent.py --alone --serialortoken_shaagainst"draft": false: every GB10decode request has the reference hash (chat
764da77fbd3f, code4e759dbd859c) and every prefill size one hash(
deae16afb5e0,e6b6ea31c756,a2dd25c04692);failed 0,alone3/3 and 12/12,serial1/1 in every cell.RTX: the same hashes on both,
alone24/24 at 8 streams,serialequal, greedy and sampled.Main against this branch, same machine and checkpoint, posted before asking for a run on our machines (or why you can't):
above; raw JSON and tools: https://gist.github.com/swbiggart/520ab76ed681a684e2f774054c17d41e
Decode speed before and after, from
tools/bench_openai.py: GB10 cells: its stream client via a thin driver;bench_openai.pygreedy on RTX: chat 70.0 / 69.5, code 74.6 / 76.6.Prompt speed before and after: cold,
cached_tokens0, alternated GB10 starts, prompt tok/s: 2,048 1,122.8 ->1,125.8 (+0.3%), 8,192 1,152.3 -> 1,153.6 (+0.1%), 32,768 1,148.0 -> 1,147.6 (-0.0%).
bench_cache.py --require-coldqualified on both RTX starts.Licence of any new weights or drafter, or "n/a": n/a.
Checklist
The title and description match the head commit, including the receipt and the stack.
New tests fail before the change, pass after it, and skip cleanly without their dependency.
Comments and docstrings are one line. No measurements or history in the source.
No personal data, machine names, internal hosts or local paths in the diff or its commits. No AI attribution lines.
Every token still goes through the lane rounds. No serial path, and nothing that needs drafts off.
Drafted output equals
"draft": false, a resumed prompt equals a fresh one, and concurrent equals solo. (Resumed prompts not checked.)No precision traded for speed. If the bits change, the description says which sums change and why.
Decode and prompt processing are no slower than main at one stream and the widest admitted; with
--drafter, no slower than without it, greedy and sampled (8 streams and sampled: one RTX start; 64k not run)