Skip to content

train 1114012949: #2767 #2768 (CI only) - #3283

Closed
ashhart wants to merge 17 commits into
mainfrom
lead/train-1114012949
Closed

ashhart wants to merge 17 commits into
mainfrom
lead/train-1114012949

Conversation

@ashhart

@ashhart ashhart commented Nov 14, 2026

Copy link
Copy Markdown
Owner

CI for a landing train: #2767 #2768 stacked on main in that order. Nothing merges from this PR: each PR above lands on its own once this tip is green, and this PR is then closed.

Bizuayeu and others added 17 commits November 14, 2026 00:09
With the profiler on, prompt_pair.pairedAt and prompt_solo.at return false
(the e.prompt_profs[3] != null term in cuda_prompt_pair.zig and
cuda_prompt_solo.zig), so every prompt step is a single chunk. The
environment table did not say so, and a profile could be read as the
served shape.
#2894 reads NVFP4_NZ5 checkpoints on CUDA. The row lists the one that uses it, after Jammed XSFP4, with its serve at TP=2 and its card's closeness, and the GLM recipe's opening names it beside Jammed XSFP4.
…logprobs past ~100 tokens no longer hangs

Spread.post queued one ncclBroadcast per row per rank in one NCCL group; at TP=3 a
128-row prompt-logprob pass (381 broadcasts) never left ncclGroupEnd. Each rank's
columns are already one [rows][span] block: broadcast it once into a staging buffer
and place it into the full rows with one cuMemcpy2DAsync. Same bytes, world
broadcasts whatever the rows.

Fixes #1559
Prepare prompt scoring buffers before rank room is measured and pin one broadcast per rank at every gather height.

Refs #1559.
…dow_rows and the fake driver answers the integrated-GPU check

Main raised GLM's window_rows from 8 to 32, so the expected staging is vocab x 2 bytes x window_rows rather than the
8-row figure, and main's DeviceBuffer.download now asks cuda/download_stage.zig whether the GPU is integrated: the
test's fake driver answers cuCtxGetDevice and cuDeviceGetAttribute as a discrete GPU, so its downloads copy directly
as before. The PR's code is unchanged.
dots.mocr's image tower rotates its queries and keys by the patch's
row and column with FP32 cosines and sines, and adds the patch
embedding's bias after the projection has already rounded to BF16.
Two CUDA kernels now do this in Transformers' rounding: the 2-D
rotary in place over the q|k|v rows, and the patch bias as
bf16(y + b). Each has a planted control (BF16 cosines and sines; one
rounding of the FP32 sum) and a contract against an FP64 reference
at up to 19,520 rows and positions to 3,393, with every BF16 input
pattern and tie for the bias. Their launch records come from nvcc
13.0 images for the five SMs, which 13.2 and 13.3 compile the same.
The comment beside the dots_mocr entry in the CUDA kernel list named
only the text q|k|v bias and RoPE, though dots_mocr.cu now also
builds the vision tower's 2-D rotary and patch bias launches, so the
comment names all three.
The dense engine read text prompts only, so a recipe with an image
tower had nowhere to put its rows. A recipe may now declare a Tower,
checked at compile time against the contract in recipe.zig; each
lane owns a buffer of the request's image tokens, the first one at
open and the others at attach, and these bytes join every stream's
bytes and fixed part so the page planner shrinks an automatic count.
The lane encodes its images in order when it begins, with a cancel
check before each, and each prompt chunk copies the image rows that
it cuts over its embedding rows. Native(R) is now one shared core
with two variants: the text-only one keeps the old decl set
exactly, and the tower one adds the vision options, field and bytes
that the host reads. Host tests drive the tower variant with a fake
tower, also through the host's own offer and options code, and pin
that the image span refusal names --vision-image-tokens, the flag
the CLI accepts.
Only the words of DenseTowerWidth were tested, so dropping the width
check in openTower would pass the host suite. openTower is now
public, and a host test opens the fake tower against a decoder one
row wider and expects the refusal, closing the tower first if it
opens, then opens it at the decoder's width and without --vision.
No test drove a chunk that cuts an image through the backend, so a
chunk that passed no injects or a forward pass that skipped the
splice would stay green. The fake device now records its
device-to-device copies, and a host test runs two chunks cut inside
an image on a quiet recipe (no layer work): each must copy that
image's rows from the lane's feature rows to the chunk's embedding
rows, at the right row, offset and length.
The engine sizes each lane's feature rows by the request's image
tokens and copies image.tokens rows an image from them, so the Tower
contract now says that encode writes exactly image.tokens rows of
the tower's width at out.
Three trailing comments in images_test.zig ran past 120 columns;
each now sits on its own line above the code it describes.
@ashhart

ashhart commented Nov 14, 2026

Copy link
Copy Markdown
Owner Author

Stopped: the train this one was stacked on did not land whole; its PRs go back to the queue.

@ashhart ashhart closed this Nov 14, 2026
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.

4 participants