Qwen3-Coder-30B-A3B-NVFP4

NVFP4 quantization of Qwen3-Coder-30B-A3B-Instruct. 61.08 GB down to 18.11 GB (3.37x), and on a single B200 it is faster than FP8 at every concurrency level measured, with no detectable loss on HumanEval.

This is the third member of a three-way release built on the same base model. Its siblings are Qwen3-Coder-30B-A3B-W4A16 and Qwen3-Coder-30B-A3B-Prune3-W4A16. The three together make the point of the release: NVFP4 and W4A16 are both four bit formats, and they land on opposite sides of FP8. W4A16 stores 4-bit weights and dequantizes them at compute time, so it buys memory and pays compute. NVFP4 quantizes activations as well as weights and runs natively on the Blackwell FP4 tensor cores, so on that hardware it buys memory and speed at the same time.

Quantization recipe

Quantized with llm-compressor using GPTQ with scheme=NVFP4. The MoE router is kept at high precision by excluding it from quantization with the pattern re:.*mlp.gate$, so only the expert weights and activations go to FP4. Calibration used 1024 samples at 2048 sequence length. On-disk format is compressed-tensors, quantization method nvfp4-pack-quantized.

The four-way comparison

All four arms below are the same model, Qwen3-Coder-30B-A3B-Instruct, served with vLLM 0.27.1 on a single B200 (tkai-dev-compute-b200, driver 580.65.06), with VLLM_USE_DEEP_GEMM=0 and VLLM_ATTENTION_BACKEND=TRITON_ATTN. Workload: unique prompt per request, input 1746 tokens actual (2048 token target), output 256 tokens, ignore_eos, temperature 0, streaming, 3 repetitions per concurrency level. The arms ran serially on the same node to hold whatever background load existed constant across them. Measured 2026-08-13.

Output throughput (tokens per second)

concurrency bf16 (61.08 GB) fp8 (31.20 GB) w4a16 (16.70 GB) nvfp4 (18.11 GB) nvfp4 / fp8 nvfp4 / w4a16
1 300.6 257.6 215.9 303.3 1.18x 1.41x
8 1707.1 1491.5 1311.2 1962.2 1.32x 1.50x
32 4454.2 3978.8 3013.3 5099.2 1.28x 1.69x
64 6448.2 6054.7 4292.4 7608.3 1.26x 1.77x
128 8586.2 8130.3 5427.7 9941.8 1.22x 1.83x
256 5982.5 6002.4 4584.5 6422.6 1.07x 1.40x
512 6858.7 6302.0 4103.3 6925.4 1.10x 1.69x

NVFP4 beats FP8 at every concurrency measured, from 1.07x at concurrency 256 up to 1.32x at concurrency 8. It beats W4A16 by a wider margin throughout, 1.40x to 1.83x. Throughput rolls over between concurrency 128 and 256 for all four arms, so the 256 and 512 rows are past the saturation point and their ratios compress toward 1.0. Read concurrency 128 as the peak-efficiency reading, not the ceiling.

Energy efficiency (tokens per joule)

concurrency bf16 fp8 w4a16 nvfp4
1 0.61 0.65 0.58 0.85
8 2.71 2.95 2.67 4.21
32 5.45 5.82 4.65 8.35
64 7.05 7.83 6.17 10.85
128 8.93 9.48 7.07 12.82
256 8.36 8.70 6.83 10.92
512 8.20 7.64 5.27 10.24

At concurrency 128 the efficiency gap is wider than the throughput gap: NVFP4 reaches 12.82 tokens per joule against FP8's 9.48, a 1.35x advantage.

Code quality: HumanEval pass@1 (n=164)

model pass@1 stderr
bf16 0.9207 0.0212
fp8 0.9146 0.0219
w4a16 0.9268 0.0204
nvfp4 (this model) 0.9024 0.0232

The spread across all four arms is 2.44 percentage points, smaller than a single arm's own stderr of about 2.17 points. NVFP4 against the bf16 baseline gives z = -0.58, not a significant difference. NVFP4 is numerically the lowest score of the four, and that is reported as measured rather than rounded away. The honest claim this test supports is no detectable loss relative to bf16, nothing stronger. It does not show NVFP4 matching or beating the others, only that a 164-question sample cannot separate any of the four.

Harness: lm-eval 0.4.12, task humaneval_instruct, --apply_chat_template, --gen_kwargs continue_final_message=True,add_generation_prompt=False, HF_ALLOW_CODE_EVAL=1, served through local-chat-completions against the same vLLM 0.27.1 instance used for the throughput sweep. Both the env var and the gen_kwargs are load bearing: without the env var the task fails to import, and without the gen_kwargs every arm, including the bf16 control, scores 0.0, which is how a misconfiguration was caught during this run. As a sanity check on the harness itself, the bf16 baseline here (0.9207) was compared against a bf16 run of the same eval from a 2026-08-06 ledger (0.9267): 0.60 percentage points apart, inside normal run-to-run noise for a 164-question sample.

Kernel path: verified, not assumed

Earlier NVFP4 numbers in this repo were read off logs after the run, never asserted at run time. For this comparison the harness records the MoE backend name and a fallback-warning flag for each arm and only accepts a throughput number once that check passes.

arm MoE backend selected fallback warning native FP4 path
bf16 not applicable no no
fp8 not applicable no no
w4a16 not applicable no no
nvfp4 FLASHINFER_TRTLLM no yes

Only the nvfp4 arm reports an FP4 kernel path, and it is the native one: FLASHINFER_TRTLLM, zero fallback warnings, on sm100 (Blackwell). The other three arms legitimately skip the FP4 gate, since they are not FP4 formats. This is the check every NVFP4-versus-something claim needs and usually does not carry: proof that the number came from the FP4 tensor cores and not from an emulated path.

Hardware requirement: Blackwell only

NVFP4 needs the FP4 tensor cores present on Blackwell (B200, and consumer Blackwell parts) and on nothing older. On H200 or H100 (Hopper), vLLM has no native FP4 path and falls back to weight-only Marlin emulation, measured separately at 0.85x of the equivalent FP8 throughput on that hardware. This checkpoint will load and run on Hopper, but it will not deliver the numbers on this card there. For Hopper deployments, W4A16 is the more appropriate 4-bit format.

Serving with vLLM

Requires vLLM 0.27.1 or newer on a Blackwell GPU (sm100), such as a B200. The checkpoint is compressed-tensors format and vLLM reads the NVFP4 quantization config directly from it:

vllm serve ThakiCloud/Qwen3-Coder-30B-A3B-NVFP4 \
  --quantization compressed-tensors

Confirm the native path is in use by checking the startup logs for the FLASHINFER_TRTLLM MoE backend selection and the absence of any FP4 fallback warning. A fallback warning means either the GPU is not Blackwell or vLLM could not select the native kernel, and the throughput numbers above will not apply.

Caveats

  • One model family, one GPU generation, one workload shape (1746 input tokens, 256 output tokens). No claim is made outside that shape.
  • The node contention snapshot only sees the GPU exposed to this pod, so it records our own device and cannot prove the other seven GPUs on the node were idle. Running the four arms serially on the same node keeps whatever background load existed constant across them, which does not eliminate the concern but does hold it fixed.
  • Throughput rolls over between concurrency 128 and 256 for every arm; the 256 and 512 rows are past saturation and their ratios compress toward 1.0.
  • HumanEval at n=164 cannot statistically separate any of the four arms. Read the quality result as "no detectable loss," not as "better" or "equal."
  • NVFP4 is Blackwell-only. It falls back to Marlin emulation on Hopper (H200, H100), measured at 0.85x, and none of the throughput or energy numbers above transfer to that hardware.

Provenance

Quantized by ThakiCloud with llm-compressor. Base model Qwen/Qwen3-Coder-30B-A3B-Instruct is Apache-2.0 and not gated; this derivative inherits that license. Quantization recipe and calibration configuration are in recipe.yaml in this repo. Full measurement ledger: whitepapers/data/ledger/2026-08-13-nvfp4-vs-fp8-coder-fourway.json in the ThakiCloud/ai-platform-strategy internal repo, with raw per-arm throughput and HumanEval data under whitepapers/data/ledger/raw/2026-08-13-nvfp4-vs-fp8-coder/.

Downloads last month
-
Safetensors
Model size
31B params
Tensor type
BF16
·
U8
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for ThakiCloud/Qwen3-Coder-30B-A3B-NVFP4

Quantized
(163)
this model