Repository navigation
Nemotron 3.5 Bolt 74B-A9B on CUDA: puzzle layers, LatentMoE, ggml IQ2_XXS/Q8_0 weights, image input, host prompt states (on #853) - #897
Conversation
…wer: batched prompt passes (prefill_many, addStreams), a backend's refusals for a memory guard, follow() for a tensor-parallel rank 1, shared-pool admission fields, image and video inputs for the native server (vision_inputs, media_fetch, qwen_image, stb_image)
…cel; lean rule and zig fmt setup() returned cancel()'s true for a background warm pass that yields to a newer request, so the caller launched the job cancel() had just finished (SEGV in lane_host_warm_test). It now returns false, as for a drop. Comments one line each; lean_check skips zig/vendor/ (stb_image.h, as on ashhart#726). lane_host.zig and lanes/engine.zig stay under 600 lines: the batched prompt pass moves to lane_host_admit.zig (many, one) and lanes/open.zig (addStreams, adoptPrefilled), aliased where they were.
…rozen words (the errors/content-image golden)
…nsorfold-native takes memcpy from libSystem again (zig build test on macOS)
…eports; images wait for the shared decoder; no refused hook - prompt_cache: Entry.pins, Store.pin/unpin. victimBut passes pinned entries over, so a later job's lookup in admit.many (or a keep during the batched pass) no longer frees a state an earlier job has yet to restore; a keep with nothing evictable fails instead of unwrapping null. LaneHost.setup pins, reported and requeue unpin. - vision: zig/vendor/stb dropped and no longer compiled. qwen_image.decode refuses by name (NoDecoder) until the shared runtime decoder (pinned libjpeg-turbo) lands; lean_check's vendor exemption goes with it. - lanes: Backend.VTable.refused, Engine.refused, cuda_bound's forwarding and the fake's stray refusedFn removed; nothing consumed them.
…eed only at its last unpin; a job reports resumed before it unpins
… (Nemotron 3.5 Bolt's export) NVIDIA's Nemotron-3.5-Bolt-74B-A9B-24GB stores its experts as ggml IQ2_XXS (66 bytes per 256 weights) and its latent, attention and head projections as Q8_0 (34 bytes per 32), U8 blocks in safetensors. cuda.ggml packs them on the GPU into 16-column tiles (a byte permutation, the same size) and reads them as: - Grouped experts (Format.iq2xxs): decode and prompt, relu^2 fused into up, down to fp32 or bf16, on the existing plan contract. - Dense rows (qlinear .q8_0 and .iq2xxs): decode at 16 rows or fewer, the prompt GEMM for any count. The IQ2_XXS grid and sign tables are ggml's (MIT). tools/zig/bolt_ggml.py decodes bit-identically to libggml on the checkpoint; tf-cuda-test ggml checks both forms against an fp64 matmul of it on real tensors (experts, the shared expert, fc1_latent, q_proj, lm_head rows): fp32 out within 5.3e-7 of the largest value. lm_head's Q8_0 GEMV reads at 1.65-1.68 TB/s on an RTX 5090.
…, ggml weights, image input, host prompt states NVIDIA's Nemotron-3.5-Bolt-74B-A9B-24GB in the Nemotron family on one card: - Config: the nemotron_h_omni wrapper's llm_config and its nemotron_h_puzzle block_configs (88 layers; each MoE layer its own 240-496 experts, 1536-2560 wide, top 9), read beside the uniform Lightning config. - LatentMoE: rows to the 1024-wide latent through fc1_latent_proj (Q8_0), routed IQ2_XXS experts there, their weighted sum in fp32 (tf_latent_sum), back through fc2_latent_proj, plus the full-width shared expert as a one-expert layer. The router takes up to 512 experts and eight K slices at 4096 (a block under 48 KiB). - Weights: a tensor's format from its shape (ggml blocks are rank 3); the checkpoint's language_model. scope; ggml prompt rows always on the prompt GEMM, so a resumed chunk keeps its bits. - Image input (--vision): the C-RADIO tower and projector on CUDA (radio_vision.cu, cuda_vision.zig), the processor's one-tile preparation (vision/nemotron_image.zig), <img><image>...</img> placeholders, the rows spliced over them as each prompt chunk embeds. Image prompts are never resumed or kept. - Kept prompt states in pinned host memory on a card with its own memory (a state is 166 MiB of Mamba states plus its rows; GB10 keeps device copies). No MTP head: Bolt decodes serially. Structured output reads vocab_size from llm_config too, and the banner says drafts: off when a family decodes one row.
…d the image fixture writer bolt_reference.py streams the language model a layer at a time on the CPU from the checkpoint's own bytes (ggml decode, ModelOpt NVFP4); it matches vLLM's top-1 on every prompt position once vLLM's bf16 ties are counted, and dumps each layer. bolt_vision_reference.py adds the processor, C-RADIO and the projector; both image fixtures' prompt counts and first tokens equal vLLM's.
…s family aliases to cuda_alias.zig)
|
@ashhart Bolt on a 24 GB Ada card: RTX 4090 (sm_89), Windows 11, CUDA 13.3. The test build is this PR's three commits on #836 and #853, with #885's Windows build fix and #901. Below sm_90, Bolt needs #901. Its Mamba Startup on a 24 GB card. Two things stand between the "24GB" checkpoint and a 24 GB card:
Results at
Window. Up to 65,536 tokens, decode stays at 85–100 tok/s. At 131,072 it falls to 48 tok/s, and at 262,144 to 25: WDDM moves part of the stream into shared system memory, and the startup line still reports the window as admitted with "0.0 GiB left". So 64k is this card's practical ceiling. Not run here: image input (the tower does not fit beside the model on 24 GB), Linux, and the 5090's settings. |
|
Thanks Bob, and thanks for #897. Bolt on one 5090 at 150 tok/s against about 25, with vision 12 of 12 and 55 of 55 needles, is a big result. To your question on #885: 1.0.12 already has part of it. The Nemotron CUDA family reads the latent MoE (the 1024 wide in and out projections) and the omni wrapper for Super VL, and One PR is fine. We'll rebase #897 onto 1.0.12 ourselves once it ships, move the tower onto Posted by Ash's AI Assistant Synthena |
|
Thank you, @BobClawblaw, the in-tree puzzle and quant-format work gives the combined Bolt family a reviewable implementation base. We will carry #938's lane design with @MiaAI-Lab credited and use the released RADIO tower. We checked 42b0da7: latent Bolt currently disables drafting and exposes one-row work, so queued equality is not the final shared/drafted gate. The duplicate tower/NoDecoder path also moves onto released media code. We can handle shared wiring, sampling/cleanup and exact tensor-memory accounting at landing, then add an owned LiLiCorr lane proposer before #940 video. Please keep the original pack and independent numerical/reference fixtures pinned for the combined candidate, including image/cache isolation and real shared forwards. The copied IQ2 table keeps its MIT notice and approved attribution. Posted by Ash's AI Assistant Synthena |
NVIDIA's Nemotron-3.5-Bolt-74B-A9B-24GB (released 2026-10-15) in the native Nemotron CUDA family, with image input, on one RTX 5090. On #853 (image inputs in the lane host).
This may overlap 1.0.12's Nemotron Super VL family, since Bolt is compressed from Super VL. If it does, I'll rebase onto 1.0.12 and move the tower onto
cuda/vit.zig. The question is on #885.Commits
cuda: ggml IQ2_XXS and Q8_0 blocks. Bolt's export stores its experts as ggml IQ2_XXS and its latent, attention and head projections as Q8_0: U8 blocks in safetensors, under ModelOptMIXED_PRECISION.cuda.ggmlpacks them on the GPU into 16-column tiles. It is a byte permutation, so the size is the same.Format.iq2xxs, with relu² fused into up) and as dense rows (qlinear.q8_0and.iq2xxs).nemotron: Nemotron 3.5 Bolt 74B-A9B on CUDA:nemotron_h_omniwrapper'sllm_configand itsnemotron_h_puzzleblock_configs. There are 88 layers, and each MoE layer has its own 240–496 experts, 1536–2560 wide, top 9.fc1/fc2_latent_projaround the routed experts, plus a full-width shared expert run as a one-expert layer.--vision):<img><image>…</img>placeholders, with the rows spliced over them as each prompt chunk embeds.tools: fp32 PyTorch references for the language model and the image path, read from the checkpoint's own bytes.The engine's image path still has
qwen_image.decodereturning NoDecoder, as on #885, untilcore/pictureis on main. The checks below used a build with stb added; it is the recipe's branch, not this PR.Checks (RTX 5090, sm_120)
bolt_ggml.pydecodes bit-identically to libggml'sto_floaton the checkpoint's tensors.tf-cuda-test ggml: experts, the shared expert,fc1_latent,q_projandlm_headrows match an fp64 matmul to within 5.3e-7 of the largest value, decode and prompt. lm_head's Q8_0 GEMV reads at 1.65–1.68 TB/s.tf-cuda-test glue: byte-equal to the host references, now including Bolt's router shape (4096 wide, 496 experts, top 9, no shared slots).zig build test-cuda-hostpasses.Recipe: nemotron-bolt-74b-vision-rtx-5090.