Repository navigation
EXL3 Flash Next on CUDA: one rank, offloaded experts, sm_120 gate (1/8) - #1441
BlivionIaG wants to merge 39 commits into
Conversation
7790cd9 to
dc22001
Compare
|
Thank you for splitting #1113 into a chain and for the clear write-up. A pilot gated to sm_120 with a named refusal is
Once those are done, what remains is the pending repo-client receipts and a concurrent-equals-solo run on this slice. |
c0b2466 to
286f86d
Compare
68ddf3c to
f556fd6
Compare
f556fd6 to
8ab0b51
Compare
c999115 to
725041a
Compare
|
Thanks @BlivionIaG for the update. This slice is much tighter now. As far as we can see, the int8 KV cache, the shared EXL3 changes, the out-of-family comment edits and the local paths are gone, and the mapped-host embedding table is limited to EXL3 packs. A few things remain:
After that, we still need the repo-client receipts and a concurrent-equals-solo run on this slice. |
6889227 to
d33a985
Compare
d33a985 to
1e61c49
Compare
cbf7fda to
965606f
Compare
…xl3-fp64-root-nov12 # Conflicts: # zig/tests/cuda/contract_limits.zig # zig/tests/cuda/main.zig
|
Kernel-contract result on this exact head ( All 22 planted controls go red. The 137 limit problems are also reported by pinned main on the same GPU with identical registers, shared bytes and recorded values, so none comes from this PR. Filtered because the full contract runs about 630 kernels of other families and took 3.2 h with the GPU mostly idle; those kernels are unchanged from main. The last unfiltered run was on an older head and has not been repeated on this one. Also restored main's video-budget refusal test unchanged beside the unsigned-budget test, and merged current main ( |
|
Thanks @BlivionIaG. The contract result on What's left is what your description lists under remaining gates, on this head:
Once those are posted and CI on this push is green, we'll run main against this head on Qwen3.8-Flash-Next NVFP4 on a GB10, to check the default CUDA path is unchanged.
|
Merge the repaired ashhart#1441 manifest and recompute the actual pins for the 12 intentional ashhart#1442 serving source changes; no source or approved-list change.
…ore-pair Core-pair adds no serving source change; the merge carries the recomputed ashhart#1441-ashhart#1444 pins forward unchanged.
|
Device results on this exact head ( Concurrent equals solo. Decode and TTFT.
Cold first request, 6144-token prompt: Model checks on this head. Not covered here:
|
|
Resume row for
I'm not claiming a main comparison for this row either: main refuses this checkpoint, so there is nothing to put next to it. |
|
Correction and a real resume result for
Resumed equals fresh: the same 48 token ids on the resumed turn, the re-hit and the cold server. The model ends its short answer early and the remaining ids follow the end token, so the comparison holds for those too but says less about the content than a long reply would. |
|
Main on this checkpoint, as promised: the pinned main binary exits before it is ready with |
|
Merged main at
main's exchange is reached only from the NVFP4 native MoE ( |
|
Hi @BlivionIaG, hi @ashhart, we ran Qwen3.8-Flash-Next EXL3 3.05 bpw on one RTX 5090 (32 GB) on the chain at 06bdb53 (head of #1443 on Nov 11; the branch has moved since, so the patches may need a rebase), experts in pinned host RAM. From an nsys profile we wrote four patches. All are environment switches; unset keeps the head's behavior.
Decode, our speed test (1 slot, 32K window, MTP on, thinking off, 512 tokens): 81.3 tok/s with the #1441 script settings (95 expert lines); 130.5 with 253 lines and no patches; 157.2 with 253 lines, the four patches and LINE_DELTAS (page cache emptied before the start). The deltas were fitted on traces of the same prompt set, so that part is in-sample. Not tested on a 16 GB card. Equality: 114 of 114 concurrent-vs-alone comparisons and 125 of 125 token hashes against the unpatched head match. Host tests, all switches unset: 6,352 of 6,382 passed, 30 skipped, 0 failed. One test expects a clean environment and fails when TABLE_BATCH=1 is set globally (cuda_exl3_pool_order_test.zig:258). Patches: https://gist.github.com/Nipale-ai/e2aaf18acd3fbad93f0a3a6eb5916cdc (P0 is a trace-only helper). Happy to open a PR against your branch. |
Feel free to open a pr, that's great, on my end I deferred pushing more patches/improvements for a while since it's difficult to retest and rebase the whole chain every time. |
|
Second merge of main into this branch ( Checked on the merged heads: |
…ot-nov12 # Conflicts: # CHANGELOG.md
…ot-nov12 # Conflicts: # CHANGELOG.md
…ot-nov12 # Conflicts: # CHANGELOG.md
…ot-nov12 # Conflicts: # CHANGELOG.md
…ot-nov12 # Conflicts: # CHANGELOG.md
…ot-nov12 # Conflicts: # CHANGELOG.md
Current head:
9489d0b443. Main90b4fae62d,bafe3e07cb,948e748584,d001c28f29and release09a9eb3317was merged after the checks and device measurements below; those device measurements were not repeated on this head. CI is running on this head.What this changes
EXL3 single-rank Flash Next loading, offloaded experts and the sm_120 kernel contracts. Expert leaves are float64 with fixed-tree merges, rounded once to float32 at the root.
6c5cef8941, merged through484437b6ac.atc overlap --jsonagainst four known peers (Flash Next TP=2 on CUDA: head and rollback graphs replay, and one-row split lanes skip the interleave copies #2837, flashnext cuda: the opt-in --tp 2 decode graph (TF_FLASHNEXT_DECODE_GRAPH=1) serves again instead of failing its first plain round #2980, flashnext cuda: the opt-in --tp 2 decode graph takes the dense split and keeps its graph across drafted verifies #2982, flashnext: the MTP head's streams by row through the lease's pages, no per-lane block outside the pool (#2444 P3, F2 part c) #2992) only, run on the integrated stack before the latest merges of main; not a global clearance. Conflicting files: Flash Next TP=2 on CUDA: head and rollback graphs replay, and one-row split lanes skip the interleave copies #2837 2, flashnext cuda: the opt-in --tp 2 decode graph (TF_FLASHNEXT_DECODE_GRAPH=1) serves again instead of failing its first plain round #2980 6, flashnext cuda: the opt-in --tp 2 decode graph takes the dense split and keeps its graph across drafted verifies #2982 8, flashnext: the MTP head's streams by row through the lease's pages, no per-lane block outside the pool (#2444 P3, F2 part c) #2992 6. Owner composition agreements exist for flashnext cuda: the opt-in --tp 2 decode graph (TF_FLASHNEXT_DECODE_GRAPH=1) serves again instead of failing its first plain round #2980, flashnext cuda: the opt-in --tp 2 decode graph takes the dense split and keeps its graph across drafted verifies #2982, flashnext: the MTP head's streams by row through the lease's pages, no per-lane block outside the pool (#2444 P3, F2 part c) #2992; my notice on Flash Next TP=2 on CUDA: head and rollback graphs replay, and one-row split lanes skip the interleave copies #2837 is unanswered.Checks before the release merge
d954f1232d. The device results below ran on7cd3e412c41a; this head differs from it by the merges of main at0591c4e85d,c34ff562ca,a3aecd8d0fand484437b6ac(conflicts resolved incuda_batch_moe.zig,cuda_batch_state.zig, the CUDA runner help,CHANGELOG.md, the fixture and one upstream test that callspassRules) and the pin fixturegradient-serving.tsv. The device cells were not repeated on this head.python3 tools/pr_check.py --base <main> --pr 1441: exit 0, 0 errors, 0 warnings; lean 339 vs 341 on main, 0 new.zig fmt --check zig: clean.test-cuda-host,test-exl3-cuda-host,test-flashnext-exl3-host,test-exl3-prompt-host,compile-flashnext-host,test-flashnext-memory-host,test-qwen-serving-host,test-lane-api-hostandtest-lanes-seepass on Darwin arm64 on the EXL3 Flash Next: draft lane guard for offloaded experts (8/8) #1446 head, which contains this head; the Linux host suite is CI's.-Dtarget=x86_64-linux-gnu): exit 0 on the EXL3 Flash Next: draft lane guard for offloaded experts (8/8) #1446 head, which contains this head (build only, no GPU executed on this head).Device results on
7cd3e412c41aTwo 16 GB sm_120 GPUs, Linux x86_64, checkpoint above. One run per cell unless stated.
kernel-contract exl3 flashnext(filtered)1441-serve-tp11441-tf,-pack,-layer,-pool1441-tfc,1441-genUnsupportedCheckpoint.Not run or open
--jobs 4unfiltered run on test(cuda): opt-in --jobs and --shard for kernel-contract #3093's head (main plus the runner change) gave 625 kernels pass, 410/410 controls red, 546 limit problems.Receipt
turboderp/Qwen3.8-Flash-Next-exl3at69e33439ae950f17bcbe95c98f117d80f759ab6d.Review requests implemented in source
environment: video refusal describes the token budget without advertising a storage maximumis back byte for byte beside the unsigned-budget test.moe_f32branch as production does.Checklist
"draft": false, a resumed prompt equals a fresh one, and concurrent equals solo. Drafted: n/a, no drafts before EXL3 Flash Next: expert-parallel TP=2 (same tokens as TP=1) and MTP drafts (2/8) #1442. Resumed equals cold: a chat turn resumed at 3072 and 4096 rows gives the same 48 token ids. Concurrent equals solo: 12/12 rows.--drafter, no slower than without it. n/a against main (main refuses this checkpoint). Measured: decode about 15 tok/s greedy at one stream, 41 aggregate at four.