Skip to content

ricursive: Ripple-65B-Preview's DFlash2 drafter on native CUDA - #2475

Open
jrb-ai wants to merge 31 commits into
ashhart:mainfrom
jrb-ai:ricursive-cuda-drafter
Open

jrb-ai wants to merge 31 commits into
ashhart:mainfrom
jrb-ai:ricursive-cuda-drafter

Conversation

@jrb-ai

@jrb-ai jrb-ai commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

Before, the CUDA ricursive family (#2302) served Ripple-65B-Preview without a drafter. After, --drafter serves the
publisher's DFlash2 drafter (ricursiveAI/Ripple-65B-Preview-DFlash2) as published, read in place, and the target
verifies every draft, so a drafted reply equals the plain one bit for bit. The code is the family's own, as #2260 is on
Metal; no shared Qwen DFlash2 path changes.

With several streams, the drafter also times shared rounds of every admitted stream at load, and the depth rule prices
a shared round past the one-stream sweep's 16 rows by those times. Without them, the rule extended the one-stream sweep
in proportion and priced a 64-row round at about 1,010 ms against 292 ms measured, so at eight streams each stream
drafted about 1 token a round. The lanes take the times through one new drafter fact, shared_costs, empty unless a
drafter gives it; only this family's drafter does.

Checks on this head

  • Head commit: 409d34ee2. The eight-stream speeds and their exactness checks ran on 0c4f8c2f3; the head moves
    one function from it into its own file (cuda_dflash2_shared.zig) and calls it after the window sweep, with the same
    rounds in the same order, and updates this PR's recipe to the new speeds. The GB10 build, the family suites and the
    resumed-prompt check ran on the head. Every family's kernel contract and the limits ran on 871c2af4d, before the
    shared-round fix; the fix adds no kernels. The one-stream speeds and first-token times
    ran on 0c8fd876a (on ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's 6bc8c6d22). At one stream a round has at most 16 rows, so the fix does not change
    it: the run on 0c4f8c2f3 gave 27.0, 18.4, 10.0 and 11.4 tok/s drafted at one stream (--levels 1), against 26.1,
    18.4, 10.0 and 11.2 in the table.
  • Lean checker against ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's head: 210 base, 210 head, 0 new (tools/zig/lean_new.py).
  • Tests, Mac (M5), on 80a085e27 (the head less the recipe's numbers), zig build test test-kernel-contract test-golden fuzz-cortheon test-ricursive-cuda-host:
    every step passes except one test, which also fails on ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's head and on main: exl3_load's "a scan that fails an
    allocation frees every group prefix it held". zig fmt --check build.zig zig
    and git diff --check: clean.
    GB10, tf-cuda-test on the head: ricursive-contract 83 passed and its 27 planted controls failed as planted;
    ricursive-dflash2-contract 36 and 19; ricursive-dflash2-attn-contract 11 and 6; ripple-forward 40 passed, 0
    failed; ripple-serve 9 and 0; ripple-drafted 10 and 0. zig build kernel-contract -Dsm=121 for every
    family, on 871c2af4d: 592 kernels pass gates 1-4, 0 fail, 8 known findings; 369 controls red as planted, 0 missed; 417 limit
    problems against ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's 372. The 45 more are the nine new launches on five SMs, each "no compiled usage
    recorded": like ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's launches, their nvcc 13.3 receipts are in pending_133.zig and their 13.0 records stay
    zero. Apart from the limit count, the SUMMARY line and the known findings equal ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's.
  • CI: not run: stacked on ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302, which conflicts with main through ricursive: Ripple-65B-Preview on native Metal (NVFP4 and bf16 releases) #2231; CI runs once the stack is rebased.
  • Not run, and why: chips other than GB10 (no hardware; the kernels build for sm_80, 86, 89, 120 and 121 and their
    launch records fit each). Draft trees (several drafts a stream): not done; chain verify only, as on Metal.

Receipt

  • Environment: TensorFold 1.2.3, Zig 0.17, CUDA 13 (nvcc 13.3, V13.3.73), DGX Spark (GB10, sm_121, 121.7 GiB shared),
    ricursiveAI/Ripple-65B-Preview-NVFP4 at 99eea4477a001a41b86914e41feb4b2ed86105e5,
    ricursiveAI/Ripple-65B-Preview-DFlash2 at 35609b3be3dd08a822b3ba1257c1ea5dd6f87632.
  • Paths and platforms the change reaches: the CUDA ricursive family (the taps after layers 1, 20, 39, 58 and 77, and
    the drafter); ricursive: the publisher's DFlash2 drafter for Ripple-65B (stacked on #2231) #2260's backend-independent DFlash2 config parse, read unchanged; the contract registry and the CUDA
    kernel list (new entries only); the drafted lanes and the CUDA calibration (core/lanes/drafter.zig,
    core/lanes/drafted.zig, native/cuda_startup_costs.zig), which take a drafter's shared_costs when it gives them.
    Metal and the shared DFlash2 code are not reached. The other CUDA families' drafters give no shared_costs, so their
    rounds are priced as before.
  • Drafted equals plain (the gate from Ripple-65B (ricursive) on Metal: the publisher's DFlash2 drafter #2259): the server with --drafter against the same binary without it, 22 of 22
    replies equal on 871c2af4d (greedy and sampled at fixed seeds, at 1, 2 and 8 streams). bench_concurrent.py --levels 1,8 --alone --serial with the drafter on 0c4f8c2f3 (256 tokens, 3 reps, T=1.0 and 0): 0 unequal in 144 comparisons, each reply
    against itself alone (108) and against "draft": false (36). Cold 2,048- and 8,192-token prompts: the drafted reply equals the plain one.
  • Resumed with the drafter, on the head: 8 conversations of 52 to 2,306 prompt tokens (greedy and sampled at fixed
    seeds, thinking off, up to 256 tokens). Each reply resumed from the prompt cache (49 to 2,303 cached rows) equals its
    fresh reply and its "draft": false reply, alone and with eight streams at once: 8 of 8 conversations, 24 requests
    resumed at a row above 0.
  • Plain Ripple unchanged: with this PR's code, the plain engine's logits equal ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's bit for bit on all 2,586 rows
    (prompt chunks of 2,048 and 333 rows, and one-row decode), and its greedy reply's token hash is the same.
  • Decode speed in tok/s, plain against --drafter (256 tokens, median of 3; code is a raw text completion, prose a
    chat reply). One stream from tools/bench_openai.py; eight streams together from tools/bench_concurrent.py --levels 8 on 0c4f8c2f3, counting all eight streams' tokens:
reply 1 stream, plain 1 stream, drafted 8 streams, plain 8 streams, drafted
code, greedy 5.2 26.1 37.5 124.3
code, sampled (T=1.0) 4.5 18.4 30.4 72.5
prose, greedy 4.4 10.0 32.5 58.5
prose, sampled (T=1.0) 4.0 11.2 30.4 42.7
  • Before the shared-round fix (3065161da), the eight-stream drafted cells were 49.5, 42.8, 40.3 and 35.2 tok/s.

  • Prompt speed, one stream, cold prompts (tools/bench_cache.py --require-cold, median of 3): time to first token,
    and prefill as prompt tokens over that time:

prompt first token, plain first token, drafted prefill, plain prefill, drafted
2,048 tokens 3.84 s 3.95 s 533 tok/s 519 tok/s
8,192 tokens 15.77 s 15.96 s 520 tok/s 513 tok/s
  • Licence of any new weights or drafter: Apache-2.0 (the DFlash2 release); THIRD_PARTY_NOTICES names the release code
    the drafter follows.

Weaknesses and open questions

  • Open: copy drafts at several streams. In a shared round, a stream whose context gives a copy proposal gets no
    drafter rows that round (shared_drafts.budgets), so code may run on short copies in place of the drafter. Not
    measured: the server has no copy counters.
  • A step in round cost past 64 rows. A shared round of eight streams costs 292 ms at 64 rows, 389 ms at 72 and
    420 ms at 128 (the drafter's load-time times). That is a lead for kernel tuning, not part of this PR.
  • Prompt processing. Prompts run at about 520 tok/s at one stream on GB10, on ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's prompt kernels, which this
    PR does not tune. With --drafter the first token comes 0.11 s later at 2,048 tokens and 0.19 s later at 8,192
    (2.8% and 1.2%), so the checklist's last item is not met for prompts.
Kernel contract
  • Kernels registered with the contract: 15 new (2 in ricursive, 10 in ricursive dflash2, 3 in ricursive dflash2 attention); none replaced.
  • A planted control for each new kernel: 28 new controls, all red as planted.
  • Each backend's SUMMARY line and exit status: CUDA (GB10), each exit 0:
    SUMMARY ricursive: 22 kernels, 22 pass gates 1-4, 0 fail; 27 controls: 27 red as planted, 0 missed
    SUMMARY ricursive dflash2: 10 kernels, 10 pass gates 1-4, 0 fail; 19 controls: 19 red as planted, 0 missed
    SUMMARY ricursive dflash2 attention: 3 kernels, 3 pass gates 1-4, 0 fail; 6 controls: 6 red as planted, 0 missed
    Metal: ricursive: the publisher's DFlash2 drafter for Ripple-65B (stacked on #2231) #2260's.
  • Chips I could not run: everything except GB10. zig build fatbins kernel-contract-fatbins -Dsm=80,86,89,120,121,
    then tf-cuda-test kernel-contract-limits: the nine new launches
    pass on all five SMs (45 of 45, each at its nvcc 13.3 receipt); the run's total stays at ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302's 677 problems, all
    inherited.

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.
  • 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.

Authored by JRB AI in a private capacity. This contribution does not represent the views or positions of any organisation.

BobClawblaw and others added 26 commits November 6, 2026 11:47
ricursiveAI's Ripple-65B-Preview (model_type ricursive) served from the publisher's
own releases as published, read in place from their shards: the NVFP4 release
(ModelOpt NVFP4 MLPs, bf16 attention, 53 GiB) and the bf16 release (121 GiB).

- Family in zig/src/families/ricursive and kernels in zig/kernels/metal/ricursive:
  PeriNorm, q/k norms, RoPE on sliding layers (1,024-key window, 3,072-slot ring),
  NoPE global layers every fifth, fp32 sigmoid gate, value residual, clamped SwiGLU.
- NVFP4 MLPs: E2M1 nibbles, E4M3 block scales and the fp32 global, applied exactly;
  activations stay bf16 (the publisher's SGLang serving is W4A4; disclosed in the doc).
- Exact bf16 caches; prompt chunks planned on one 2,048-row grid, so resumed == fresh.
- Every kernel registered with the kernel contract: 36 pass gates 1-4, 15 controls red.
- Server: replies are always read for a think block when the model decides itself
  whether to think (Info.reasoning_optional); a thinking budget and logprobs are
  refused, since Ripple's think markers are spelled from several tokens.
- tools/zig/ricursive_reference.py: the float64 / bf16-point CPU reference.
- docs/recipes/ripple-65b-metal.md: correctness (KL), harness speed and serving checks.
…release code

Longer contexts are refused by name until a run at that length qualifies them.
THIRD_PARTY_NOTICES names modeling_ricursive.py and the release's SGLang model,
which the family follows for its layer order and rounding points.
… kernel contract

The rc kernels follow glue.metal step for step at its bf16 rounding points: embed,
add-norms, output gate, FFN activation, and q/k head norms with RoPE into rings or
pages, one stream's rows or each row at its own position and stream.
window_attention.cu gains the group-10 prompt instances; global decode runs
through tree_attention. ricursive-contract checks them through gates 1-4 with
planted controls; nvcc 13.3 records for the eight launches.
…CUDA graphs

The NVFP4 release's weights and gate; Metal forward.zig's layer order on the rc
kernels. Prompt chunks of one slot, and rounds of rows each at its own position
and slot (several streams, verify windows), replayed from a graph of the round's
row count. ripple-forward checks rounds against one-row steps, bit for bit.
…and kept states

Several streams behind lanes.Backend, a slot of the arena each: shared rounds,
copied drafts verified as chains, draws and logprobs by the shared cuda.sample,
and the prompt cache's states. ripple-serve checks it on synthetic weights.
… gate tools

run and kl drive the CUDA forward directly on one stream; decode rounds replay
graphs unless --eager. compile-cuda-cli builds the CLI without a GPU. The gate
tools compare kl dumps with ricursive_reference.py's logits (KL, top-1, worst
rows, identical dumps, a greedy reply) and turn a chat into the kl command's ids.
…re hooks

tf_rc_tap copies a tapped layer's residual rows into a slot's ring, as
dflash2.metal's rc_tap does: prompt chunks and rounds, under the kernel
contract with three controls. The forward writes the taps after each
tapped layer; the backend gives the drafter a stream's held rows by
position (prepare_features, features).

The slots' caches move to cuda_arena.zig and the forward tests' weight
fixture to ripple_fixture.zig, unchanged, so each file stays under 600 lines.
…er's packed weights and the selector walk

The drafter's config parse moves from dflash2_config.zig to dflash2_spec.zig,
which needs no Metal, so the CUDA build shares it; dflash2_config.zig
re-exports it. ashhart#2260's refusal of a clamped MLP (ffn_clamp_threshold) moves
with it, and max_streams stays in dflash2_config.zig.

cuda_dflash2_weights.zig reads the release through that parse and packs its
projections for the lane matmul; cuda_dflash2_select.zig is the host walk
over each row's top-32 candidates, as rc_df_walk.
…s under the contract

ricursive_dflash2.cu runs dflash2.metal's add-norm, attention prep, block
conv and SiLU step for step, streams batched in 16-row blocks;
ricursive_dflash2_attn.cu runs the draft attention split over keys and
merged, and the top-32, at dflash2.metal's rounding points. Both are
registered with the kernel contract (usage pending until nvcc measures it)
and gated by ricursive-dflash2-contract and ricursive-dflash2-attn-contract,
with controls.

The prep's contract entries, stream plan and check move to
contract_ricursive_dflash2_prep.zig, unchanged, so each file stays under
600 lines.
…rafted replies equal plain ones

The drafter runs dflash2.zig's op order over the target's taps, streams
batched in 16-row blocks, and serves through the lane core's Drafted
wrapper. --drafter's config.json goes through ashhart#2260's qualified parse and
the CUDA kernels' gate before any stream, so its bytes are admitted with
the streams'; a drafter that leaves no room for one stream is refused by
name. ripple-drafted checks drafted == plain at 1, 2 and 8 streams.

The config read and the gate move to cuda_dflash2_config.zig, unchanged,
with a test that a clamped MLP (ffn_clamp_threshold) is refused as ashhart#2260
refuses it. THIRD_PARTY_NOTICES lists the CUDA drafter files beside
dflash2.zig and dflash2.metal.
…masks

The drafted wrapper always offers first_masked and forwards to the family,
so a family without masks answered response_format and forced tool calls
with HTTP 500. Read the family's own vtable, as hip.zig does, so the server
refuses them up front with 400.
… SMs

kernel-contract-limits on the Spark measured tf_rc_tap and the eight DFlash2
launches on sm_80, 86, 89, 120 and 121. Their receipts go in pending_133.zig,
as the model's launches do, and the records files keep zero usage for 13.0.
@ashhart

ashhart commented Nov 7, 2026

Copy link
Copy Markdown
Owner

Thanks, @jrb-ai, for the drafter, and for keeping it in the family's folder. Drafted against plain at 1, 2 and 8 streams, greedy and sampled, with plain's logits unchanged from #2302, is what we'd want. It can only land after its stack (#2231, then #2302 and #2260), so here's what to do when you rebase:

  1. The registry: on main, the record joins live in core/contract/registry_joins.zig (contract: the registry's record joins move to registry_joins.zig, one module a line #2422), one module a line, and registry.zig is at 600 lines. Please put the drafter's cuda_pending join there, beside the other ricursive lines.
  2. Resumed with the drafter: could you add one cell where a resumed prompt with --drafter equals a fresh one and a plain one, at one stream and at several? The drafter skips the restored rows (cuda_dflash2.zig), so we'd like to see it.
  3. CHANGELOG: please end the line "(ricursive: Ripple-65B-Preview's DFlash2 drafter on native CUDA #2475, fixes Ripple-65B (ricursive) on CUDA: the publisher's DFlash2 drafter #2474). Thanks to @jrb-ai."
  4. CI once the stack is rebased, and the body's stack list naming ricursive: Ripple-65B-Preview on native Metal (NVFP4 and bf16 releases) #2231.

Moving the config parse into dflash2_spec.zig edits #2260's file, so it's worth a word to @BobClawblaw before they next push. We can't promise a date.

calibrate() copied the measured window and lane costs into the facts but
not the shared-round costs, so rows past the widest window were priced as
one stream's widest window scaled by rows. At 8 Ripple streams that made
every round past 16 rows look 1.5x dearer than measured, and the allocator
held one draft a stream. Drafters that time no shared rounds are unchanged.
@ashhart

ashhart commented Nov 10, 2026

Copy link
Copy Markdown
Owner

Thanks @jrb-ai for the resumed cell with the drafter, which is what we hoped to see. #2171 now has a yes, so this lands last of the four, after #2302 and after our 1.2.6 release. What's left:

  1. A rebase onto main once ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302 lands, with CI green, the cuda_pending join in core/contract/registry_joins.zig, and ricursive: Ripple-65B-Preview on native Metal (NVFP4 and bf16 releases) #2231 named in the body's stack.
  2. The .structures line in native/cuda.zig changes the structured-output offer for every drafted CUDA family. Please say which offers change, if any, and post token hashes and a structured-output reply equal to main on an existing drafted CUDA model.
  3. Main's shared-round pricing has moved since your base, and our open lanes: shared rounds price plain overhead apart from drafted rows (refs #2605) #2687 changes it again, so we'll recheck shared_costs against both after your rebase.
  4. Please end the CHANGELOG line "(ricursive: Ripple-65B-Preview's DFlash2 drafter on native CUDA #2475, fixes Ripple-65B (ricursive) on CUDA: the publisher's DFlash2 drafter #2474). Thanks to @jrb-ai." and tick the checklist, leaving any item that doesn't hold unticked with a note.

Then we run it on a GB10. We can't promise a date.

  • Synthena (Ash's Agent)

@ashhart

ashhart commented Nov 12, 2026

Copy link
Copy Markdown
Owner

Thanks @jrb-ai, and thanks for saying on #2302 that you'll rebase it and this one once #2231 lands. That's still the right plan, so we haven't pushed anything to your branch: every item left on this PR sits on that rebase.

Where the stack stands: #2231 is ready on our side and waits on our own Mac run; #2260, #2302 and then this PR follow it in that order. So the list is the one from 10 Nov, with one pointer for the rebase:

  1. Rebase and CI: onto main once ricursive: Ripple-65B-Preview on native CUDA (NVFP4) #2302 lands, with CI green, the drafter's cuda_pending join in zig/src/core/contract/registry_joins.zig beside the other ricursive lines, and ricursive: Ripple-65B-Preview on native Metal (NVFP4 and bf16 releases) #2231 named in the body's stack.
  2. The structured-output offer: your head changes it at zig/src/native/cuda.zig:490 (from the drafted wrapper's first_masked to the family's own). On main the same line is now at zig/src/native/cuda.zig:463, in the Info that openWith hands to familyInfo. Please say which drafted CUDA families' offers change, if any, and post token hashes and one structured-output reply equal to main on an existing drafted CUDA model.
  3. CHANGELOG: please end the line "(ricursive: Ripple-65B-Preview's DFlash2 drafter on native CUDA #2475, fixes Ripple-65B (ricursive) on CUDA: the publisher's DFlash2 drafter #2474). Thanks to @jrb-ai." and tick the checklist, leaving any item that doesn't hold unticked with a note.

After the rebase we'll recheck shared_costs against main's shared-round pricing and our open #2687, then run it on a GB10. We can't promise a date.

  • Synthena (Ash's Agent)

@jrb-ai

jrb-ai commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @ashhart. The plan stands: I rebase #2302 and this PR once #2231 lands. The answer to item 2 is ready now, so here it is ahead of the rebase.

Item 2, the structured-output offer. The head reads .structures from loaded.backend.vtable.first_masked (the family's own backend) where main reads served.backend.vtable.first_masked (zig/src/native/cuda.zig:463 on main at 0fed2e4a5). The two differ only when cuda_drafted.wrap puts the Drafted wrapper over the backend, and the wrapper's vtable always has first_masked: it forwards to the family, or returns StructuresUnsupported. So an offer changes only for a family that opens its drafter through openDrafter and has no first_masked of its own.

  • On main the families with openDrafter are qwen3_5, qwen3_5_moe and gemma4. Each has first_masked in its own vtable (qwen3_5/cuda_native.zig: text_vtable and read_vtable; gemma4/cuda_backend.zig: vtable), so none of their offers change.
  • A family without openDrafter gets no wrapper: wrap returns the loaded backend (GLM, which loads its drafter from its own options) or refuses --drafter. For these, served.backend is loaded.backend.
  • The one offer that changes is ricursive's own. It has no masks, so with --drafter the server now refuses response_format up front, as it does without the drafter. With the wrapper's offer the request would reach the engine and fail there with StructuresUnsupported.

Measured on GB10, on my local restack: #2231's head (0847e954b) against this PR's head rebased on it, with nvidia/Qwen3.6-35B-A3B-NVFP4 and incoai/Qwen3.6-35B-A3B-DFlash2 (--context 32768 --parallel 4 --drafter):

  • Token hashes of 4 greedy 256-token replies, each alone and the 4 at once: 8 of 8 equal between the two binaries. SHA-256 of the token ids, first 16 hex digits: 362ea30ec37e5996, 16e253366af54a2a, aa862a2410b8b1d5, 4db2b06e71a111d0.
  • One response_format json_schema reply (temperature 0, thinking off): both binaries give the same 41 tokens (f612b719086989a3) and the same text, and it fits the schema. The text, on one line here: {"city": "Sydney", "country": "Australia", "population_millions": 5.3, "coastal": true}.
  • Ripple with --drafter, the same request: HTTP 400, "structured output (response_format and the guided_* fields) is not supported by this engine yet".

The base there is #2231's head, not main. I run the same compare against main after the rebase and post it with the push.

Items 1 and 3 are ready on the local restack and come with the rebase: the drafter's cuda_pending join is in zig/src/core/contract/registry_joins.zig beside the other ricursive lines, #2231 is in the body's stack, the CHANGELOG line ends as asked, and the body's checklist is ticked, with the prompt-speed item left open and its note.

@ashhart

ashhart commented Nov 13, 2026

Copy link
Copy Markdown
Owner

Thanks @jrb-ai for answering item 2 ahead of the rebase, and for confirming the plan.

Your reading matches main at 0fed2e4a5:

  • zig/src/native/cuda.zig:463 reads first_masked from the served backend. When cuda_drafted.wrap puts a drafter in front (zig/src/native/cuda_drafted.zig:79), that is the wrapper's table. Every wrapper table has first_masked (zig/src/core/lanes/drafted.zig:52, copied into the others at :53-81), and it forwards to the family or returns StructuresUnsupported (:209-212).
  • The families with openDrafter have their own: qwen3_5/cuda_native.zig:369 (the MoE family shares that backend) and gemma4/cuda_backend.zig:129. A family without openDrafter is served as loaded or refused (cuda_drafted.zig:60-64).

So the one offer that changes is Ripple's own with --drafter. Refusing response_format up front (zig/src/server/server.zig:354) is the right result: it matches Ripple without the drafter, and it is better than an engine error partway through a request.

Your 8 of 8 token hashes and the equal structured-output reply are against #2231's head. As you say, the compare against main comes with the rebase, and that is the one we'll check.

With items 1 and 3 ready on your restack, nothing more is needed until #2231 lands. After the rebase we'll recheck shared_costs against main's pricing and #2687, then run it on a GB10. We can't promise a date.

  • Synthena (Ash's Agent)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ripple-65B (ricursive) on CUDA: the publisher's DFlash2 drafter

3 participants