1
stars
5
commits
1
linked in READMEs
Aug 25, 2026
updated
Native NVFP4 (W4A16, group-16) requantization of the Qwen3.8-27B DFlash2 block drafter (5 Qwen3-style layers, 1.92B params). Built for the all-NVFP4 vLLM stack: NVFP4 target weights + NVFP4 draft weights + NVFP4 KV cache on SM120 (RTX 5090), verified at 262,144-token context with DFlash2 K=3.
compressed-tensors nvfp4-pack-quantized:
strategy: tensor_group, group_size: 16,
symmetric, dynamic: false, observer: memoryless_minmax,
scale_dtype: torch.float8_e4m3fnweight_packed (uint8, [out, in/2]),
weight_scale (fp8_e4m3fn, [out, in/16]),
weight_global_scale (float32, divisor convention)self_attn.{q,k,v,o}_proj, mlp.{gate,up,down}_proj,
fc (36 matrices total)kernel_projection (grouped convs), candidate_selector,
hidden_projection, normsRound-to-nearest weight-only quantization (no calibration) from the BF16
checkpoint, using the release image's compressed_tensors 0.17.0
(compressors/nvfp4/helpers.pack_fp4_to_uint8). Reproducible with
scripts/build_nvfp4_draft.py (source: vLLM-sm12x DFlash2 release repo).
model.safetensors (1361734592 bytes): db19f8496af66a5b8cc26c682a7c80a754af0fa62929e6b2f14aa14fe97d7126config.json: 106a0e81a35acfbdfcd8d40786216f260a51e12e690ea820e9c05bc5d7ab7045vllm serve <Qwen3.8-27B NVFP4 target> --speculative-config '{"method":"dflash","model":"<this repo>",
' "num_speculative_tokens":3,"kv_cache_dtype":"nvfp4"}' --kv-cache-dtype nvfp4 --max-model-len 262144 --max-num-seqs 8 --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE",
' "cudagraph_capture_sizes":[4,8,12,16,20,24,28,32]}'
Measured on the all-NVFP4 262k profile: 341,765-token NVFP4 KV pool (1.30x of 262k), greedy determinism byte-identical, acceptance mean 2.35 / 44.9% avg, and a 254,658-token request completing end-to-end.

This drafter is the draft half of the all-NVFP4 vLLM stack in seanyourhighness/vllm-sm12x-nvfp4-dflash2: NVFP4 target weights + NVFP4 draft weights + NVFP4 KV cache on a single RTX 5090 (SM120, 32 GB). Most public 5090 recipes pair NVFP4 weights with an FP8 KV cache; keeping the KV cache in NVFP4 as well is what lets an 8 GiB explicit pin hold a 325,139-token pool at 262K max context.
Why quantize the drafter at all? The DFlash2 block drafter is small (1.92B), but at NVFP4 it drops from ~3.6 GiB (BF16) to ~1.3 GiB, and — because it uses the target's own KV cache dtype — every byte saved on the draft model and its state becomes target KV capacity. The quantization is round-to-nearest weight-only (no calibration), and the numerically sensitive parts — the candidate selector, grouped convolutions, and norms — are deliberately kept in BF16 so acceptance length doesn't take a hit.
The full build log — every bug, what it cost, and the measurements behind each fix — is in the article (tweet). Highlights:
Two commands on a 5090 (DGX Spark / GB10 via SPARK=1 ./build.sh, not
yet validated on GB10 hardware):
git clone https://github.com/seanyourhighness/vllm-sm12x-nvfp4-dflash2.git
cd vllm-sm12x-nvfp4-dflash2 && ./start.sh # add --vision for the CPU vision sidecar
start.sh pulls the pinned runtime, downloads the target and this draft
model, boots vLLM, and runs a deterministic canary. If you'd rather wire
this drafter into your own stack, the K=7 production profile is:
vllm serve <Qwen3.8-27B NVFP4 target> \
--speculative-config '{"method":"dflash","model":"YourHighnessLA/Qwen3.8-27B-DFlash2-NVFP4",
"num_speculative_tokens":7,"kv_cache_dtype":"nvfp4"}' \
--kv-cache-dtype nvfp4 --max-model-len 262144 --max-num-seqs 4 \
--compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","cudagraph_capture_sizes":[8,16,24,32]}'
The runtime image is bit-identical to the one running in production, and the 51-file Python-only overlay applies cleanly to pristine vLLM v0.27.1 — so every number above traces to a pinned commit, digest, and model revision. Run it, break it, and tell us what you find.
The drafter shares the target's embeddings and lm_head (it ships neither), matching the upstream DFlash2 design. Apache-2.0, like the original drafter by Inco.
5 commits
1
stars
5
commits
1
linked in READMEs
Aug 25, 2026
updated
Native NVFP4 (W4A16, group-16) requantization of the Qwen3.8-27B DFlash2 block drafter (5 Qwen3-style layers, 1.92B params). Built for the all-NVFP4 vLLM stack: NVFP4 target weights + NVFP4 draft weights + NVFP4 KV cache on SM120 (RTX 5090), verified at 262,144-token context with DFlash2 K=3.
compressed-tensors nvfp4-pack-quantized:
strategy: tensor_group, group_size: 16,
symmetric, dynamic: false, observer: memoryless_minmax,
scale_dtype: torch.float8_e4m3fnweight_packed (uint8, [out, in/2]),
weight_scale (fp8_e4m3fn, [out, in/16]),
weight_global_scale (float32, divisor convention)self_attn.{q,k,v,o}_proj, mlp.{gate,up,down}_proj,
fc (36 matrices total)kernel_projection (grouped convs), candidate_selector,
hidden_projection, normsRound-to-nearest weight-only quantization (no calibration) from the BF16
checkpoint, using the release image's compressed_tensors 0.17.0
(compressors/nvfp4/helpers.pack_fp4_to_uint8). Reproducible with
scripts/build_nvfp4_draft.py (source: vLLM-sm12x DFlash2 release repo).
model.safetensors (1361734592 bytes): db19f8496af66a5b8cc26c682a7c80a754af0fa62929e6b2f14aa14fe97d7126config.json: 106a0e81a35acfbdfcd8d40786216f260a51e12e690ea820e9c05bc5d7ab7045vllm serve <Qwen3.8-27B NVFP4 target> --speculative-config '{"method":"dflash","model":"<this repo>",
' "num_speculative_tokens":3,"kv_cache_dtype":"nvfp4"}' --kv-cache-dtype nvfp4 --max-model-len 262144 --max-num-seqs 8 --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE",
' "cudagraph_capture_sizes":[4,8,12,16,20,24,28,32]}'
Measured on the all-NVFP4 262k profile: 341,765-token NVFP4 KV pool (1.30x of 262k), greedy determinism byte-identical, acceptance mean 2.35 / 44.9% avg, and a 254,658-token request completing end-to-end.

This drafter is the draft half of the all-NVFP4 vLLM stack in seanyourhighness/vllm-sm12x-nvfp4-dflash2: NVFP4 target weights + NVFP4 draft weights + NVFP4 KV cache on a single RTX 5090 (SM120, 32 GB). Most public 5090 recipes pair NVFP4 weights with an FP8 KV cache; keeping the KV cache in NVFP4 as well is what lets an 8 GiB explicit pin hold a 325,139-token pool at 262K max context.
Why quantize the drafter at all? The DFlash2 block drafter is small (1.92B), but at NVFP4 it drops from ~3.6 GiB (BF16) to ~1.3 GiB, and — because it uses the target's own KV cache dtype — every byte saved on the draft model and its state becomes target KV capacity. The quantization is round-to-nearest weight-only (no calibration), and the numerically sensitive parts — the candidate selector, grouped convolutions, and norms — are deliberately kept in BF16 so acceptance length doesn't take a hit.
The full build log — every bug, what it cost, and the measurements behind each fix — is in the article (tweet). Highlights:
Two commands on a 5090 (DGX Spark / GB10 via SPARK=1 ./build.sh, not
yet validated on GB10 hardware):
git clone https://github.com/seanyourhighness/vllm-sm12x-nvfp4-dflash2.git
cd vllm-sm12x-nvfp4-dflash2 && ./start.sh # add --vision for the CPU vision sidecar
start.sh pulls the pinned runtime, downloads the target and this draft
model, boots vLLM, and runs a deterministic canary. If you'd rather wire
this drafter into your own stack, the K=7 production profile is:
vllm serve <Qwen3.8-27B NVFP4 target> \
--speculative-config '{"method":"dflash","model":"YourHighnessLA/Qwen3.8-27B-DFlash2-NVFP4",
"num_speculative_tokens":7,"kv_cache_dtype":"nvfp4"}' \
--kv-cache-dtype nvfp4 --max-model-len 262144 --max-num-seqs 4 \
--compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","cudagraph_capture_sizes":[8,16,24,32]}'
The runtime image is bit-identical to the one running in production, and the 51-file Python-only overlay applies cleanly to pristine vLLM v0.27.1 — so every number above traces to a pinned commit, digest, and model revision. Run it, break it, and tell us what you find.
The drafter shares the target's embeddings and lm_head (it ships neither), matching the upstream DFlash2 design. Apache-2.0, like the original drafter by Inco.
5 commits