Contents TandemLLM Docs
v0.11.0
Star58

Part III, How the engine works

19Nemotron 3.5 Bolt and Super VL

NVIDIA’s Nemotron 3.5 Bolt 74B-A9B is a NemotronH hybrid: 88 layers, 40 of them Mamba2, 40 mixture-of-experts and 8 attention layers without positional encoding. A token runs 9 of up to 496 experts a layer. It is the fourth model TandemLLM serves; its support ships in release 0.10.0. On one DGX Spark the engine decodes it at 43.3 tok/s from our 2.0 EXL3 pack and at 27.8 tok/s from NVIDIA’s IQ2 GGUF, and with NVIDIA’s LiLiCorr drafter and the lookup at 65.7 tok/s on prose and 102.8 on code (measured, 2026-10-16, the mean of 3 runs). TandemLLM serves Bolt’s text; its RADIO image tower is not served yet. Release 0.11.0 adds the larger Nemotron 3.5 Super VL 120B-A12B (Section 19.5). docs/nemotron-h.md is the same material for the repository, with every check and run.

19.1 The model

Table 19.1 Nemotron 3.5 Bolt beside Nemotron 3.5 Lightning, the test model the engine was built on.
partBolt 74B-A9BLightning 30B-A3B
layers88: 40 Mamba2, 40 MoE, 8 attention52: 23 Mamba2, 23 MoE, 6 attention
hidden4,0962,688
Mamba2128 heads of 64, state 128, 8 groups64 heads of 64, state 128, 8 groups
attention32 query and 2 KV heads of 128, no positional encodingthe same
MoE240 to 496 experts a layer, 9 a token, relu^2^2, a 1,024-wide latent, one shared expert of 5,376128 experts, 6 a token, a shared expert of 3,712
draft layernone (NVIDIA’s LiLiCorr drafter instead)one MTP block pair
context262,144 tokens262,144 tokens

engine/models/nemotron_h/config.py builds one layer table from hybrid_override_pattern, layers_block_type or block_configs (per-block expert count, top k and width) and from the Omni wrapper’s llm_config; it stops on a field it does not know. Bolt’s KV is 8,192 bytes a token (8 attention layers), 2 GiB at the whole context; each Mamba2 layer keeps its SSM state (fp32) and its convolution’s last three inputs.

19.2 Profiles

Table 19.2 The Bolt profiles, measured 2026-10-15: the download, the weights on the device at load, against the BF16 checkpoint’s logits on 8 wikitext-2 rows of 1,024 tokens the KL divergence and the top-1 agreement, and plain decode through the server for one request, 512 greedy tokens, thinking off (tok/s, the mean of 3 runs on this release, 2026-10-16).
profilediskweightsKLtop-1plain
nemotron-bolt-exl3-2.023.48 GB20.22 GiB0.17084.1 %43.3
nemotron-bolt-exl3-2.527.61 GB24.07 GiB0.09487.3 %42.1
nemotron-bolt-exl3-3.031.75 GB27.92 GiB0.06189.7 %41.7
nemotron-bolt-exl3-3.535.88 GB32.01 GiB0.04491.1 %40.6
nemotron-bolt-exl3-4.040.01 GB36.18 GiB0.03492.7 %40.5
nemotron-bolt-exl3-5.049.13 GB44.42 GiB0.01694.8 %34.1
nemotron-bolt-exl3-6.058.37 GB53.00 GiB0.008796.2 %29.2
nemotron-bolt-iq222.04 GB22.19 GiB0.25979.6 %27.8

The EXL3 packs are converted from NVIDIA’s BF16 checkpoint by exllamav3 1.6.2 with a patch for Bolt’s layer table, head at 6 bits; each is a public repository 0xBakeer/TandemLLM-Nemotron-3.5-Bolt-74B-A9B-EXL3-<bpw>, pinned by commit. The 2.0 pack keeps its Mamba2, attention, latent and shared-expert projections at 4 bits and its routed experts at 2; it is the default, better and faster than NVIDIA’s 2-bit GGUF. nemotron-bolt-iq2 reads NVIDIA’s GGUF as stored: IQ2_XXS experts, NVFP4 Mamba2 projections with their per-tensor scales, Q8_0 head and attention; against llama.cpp on the same file its top token agrees at 97.75 % of 1,024 chat positions, every difference a near tie. The 2.5 to 6.0 profiles have no StairCut price file yet, so the cut learns its prices online.

19.3 One row path and exact rollback

The decode step and every row of a verify block run the same kernels a row at a time: every projection on 16-row tiles, the Mamba2 convolution over the row’s own window, the SSM update walked in fp32 from the committed state along the row’s path, attention over fixed key chunks, the router and the relu^2^2 experts with an ordered combine. A verify block walks each SSM once a head, so a layer’s 4 MB state is read once a block. A verify block writes nothing but its KV rows; the commit walks each state along the kept path with the decode step’s own kernel. So a verify row has the decode step’s bits, and a rollback is exact. The load-time self-check verifies a recorded 24-token decode as one block, every row and the committed states bit for bit, before speculation turns on.

The EXL3 projections run on tools/fn_kernels.dense_rows: each row’s input is rotated once, then one CTA decodes the trellis tiles of a 128-column block once for a group of 16 rows, with each row’s K slices, warp order and output rotation those of the one-row dense call, so every output byte is its byte. An 8-row verify block of the 2.0 pack takes 33.8 ms instead of 74.7 with one CTA a row. The expert bank groups a block’s pairs of one expert, so a group reads that expert once.

19.4 LiLiCorr

Bolt has no MTP head. NVIDIA’s drafter for it is LiLiCorr (0.96 GB, NVFP4), ported from vLLM’s and llama.cpp’s implementations to engine/drafters/lilicorr.py. The engine keeps the residual rows entering six of Bolt’s layers in a ring a sequence; the drafter reads them, runs a block of 8 positions through five layers of sliding-window attention with sink logits and a dynamic convolution, and walks a candidate lattice to 7 tokens, all as one CUDA graph. It drafts beside the lookup in the EXL3 profiles, and StairCut cuts every block; the IQ2 profile drafts with the lookup alone, since with LiLiCorr beside it StairCut kept plain steps on this build (cause not isolated). Every drafted token is verified, so the text is the plain decode’s. On 8 chat prompts its accepted length is 4.55 tokens a block, against 4.57 for llama.cpp with the same drafter (measured).

Table 19.3 One request, 512 greedy tokens, thinking off, tok/s and in brackets tokens a block, measured 2026-10-16 on nemotron-bolt-exl3-2.0, the mean of 3 runs; llama.cpp with LiLiCorr on NVIDIA’s GGUF for comparison (its prose and chat texts differ from its plain run’s).
askplainLiLiCorr + lookupllama.cpp + LiLiCorr
prose43.465.7 (3.0)49.3
code43.4102.8 (4.9)92.2
chat43.369.4 (3.1)62.0
edit43.2180.5 (13.6)92.5
copy43.0244.7 (15.8)132.0

Three requests at once with LiLiCorr and the lookup run at 72.1 tok/s in total, every text its request’s alone. Of 20 server requests, 16 equal the plain answers and 4 equal them up to the reasoning budget’s forced close, which lands at the end of a verified block (Chapter 12).

19.5 Super VL 120B-A12B

Nemotron 3.5 Super VL 120B-A12B has Bolt’s layout at a larger size: 88 layers (40 Mamba2, 40 mixture-of-experts, 8 attention), 512 experts a layer with 22 a token and one shared expert, and one MTP block. The checkpoint reads 1,048,576 tokens of context; the profiles serve 262,144. It is the fifth model TandemLLM serves, from release 0.11.0, text only.

Three profiles run it. Two are our EXL3 packs, converted from NVIDIA’s BF16 checkpoint (revision 97e00975) by exllamav3 1.6.2 with a patch for Super VL’s layout; each is a public repository 0xBakeer/TandemLLM-Nemotron-3.5-Super-VL-120B-A12B-EXL3-<bpw>, pinned by commit. The third reads NVIDIA’s NVFP4 release as stored: ModelOpt NVFP4 for the routed and shared experts, FP8 with a tensor scale for the Mamba2 and attention projections and the head (tools/nvfp4_relu2.py). A decode token reads 10.1 GB of that release.

Table 19.4 The Super VL profiles, measured 2026-10-16: the download, the weights at load, the KL divergence and top-1 agreement against the BF16 checkpoint’s logits on 8 wikitext-2 rows of 1,024 tokens, and decode through the server for one request, 512 greedy tokens, thinking off (tok/s, the mean of 3 runs): plain, and with LiLiCorr and the lookup on prose / code / edit asks.
profilediskweightsKLtop-1plainLiLiCorr
nemotron-super-vl-exl3-4.065.0 GB58.35 GiB0.04992.9 %31.133.1 / 53.6 / 101.0
nemotron-super-vl-exl3-2.036.84 GB31.24 GiB0.32582.1 %36.535.6 / 46.3 / 125.1
nemotron-super-vl-nvfp475.06 GB66.63 GiB0.04193.4 %19.623.9 / 39.9 / 73.5

The 4.0 pack has every projection at 4 bits, head 6; it is the default, within 0.008 KL of NVIDIA’s NVFP4 and 1.6 times as fast plain. The 2.0 pack keeps the routed experts at 2 bits and every other projection at 4. It is 17 % faster plain, but its KL is more than six times the 4.0 pack’s, nearly twice what the same recipe gave on Bolt; it is for a box where 4.0 does not fit.

Super VL’s LiLiCorr drafter carries its own NVFP4 head over the target’s vocabulary and reads five taps with a window of 8,192. Its accepted length is 4.65 tokens a block on the 4.0 pack (4 prompts of 192 tokens, thinking on). The price files carry a spec prior, the 8-row chain plus the draft over 0.75 of that length, so StairCut drafts from the first request. Every drafted text equals the plain run’s.

vLLM (nightly-3f1bcfd8, NVIDIA’s flags for the Spark) on NVIDIA’s NVFP4 release decodes at 19.4 tok/s plain and at 29.9 / 52.7 / 72.4 on prose / code / edit with LiLiCorr; its greedy text changes from run to run, plain included, since those flags round the Mamba cache at random. It reads prompts 4 to 5 times as fast (2,158 to 2,521 tok/s against 476 to 589), and it batches requests at once, where TandemLLM’s drafted slots take turns.

19.6 What is not done

  • Bolt’s image tower: the GGUF’s mmproj file and the packs’ BF16 tower are not loaded.
  • A CUDA GEMV for the IQ2_XXS shared experts: measured at 32.7 tok/s against 27.9, not in this release, so the IQ2 profile decodes and drafts slower than it could.
  • StairCut price files for the 2.5 to 6.0 packs. On the 4.0 pack StairCut keeps plain steps with LiLiCorr in this release (40.3 to 40.5 tok/s on every ask against 40.5 plain); the cause is not isolated, and the other packs have no LiLiCorr rows.
  • Super VL: grouped expert prefill (prompts read 4 to 5 times slower than vLLM), a joint verify for requests at once, the vision tower and the MTP head as a draft head.
  • Any task benchmark, and the benchmark row of Chapter 15.