Repository navigation
Conversation
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.
Owner
Author
|
Stopped: the train this one was stacked on did not land whole; its PRs go back to the queue. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.