NVFP4 vs 2:4 sparse: where the other half of the petaflop went
A DGX Spark is sold as 1 petaFLOP. A serving panel on two of them reads 5 % of 323 TFLOP/s. Both numbers are correct, and the distance between them is almost entirely structural — not a misconfiguration, and not something 2:4 sparsity would close.
Every measurement below comes from one instrumented two-node TP=2 deployment serving a 512-expert MoE checkpoint in NVFP4, over 3.16 hours of real traffic.
The ladder, top to bottom
NVIDIA’s headline is FP4 with 2:4 structured sparsity. Dense FP4 is exactly half of it. A real GEMM kernel reaches about two-thirds of that. And a 512-expert MoE reaches a sixth of what the kernel does.
The roofline is the whole argument
A GB10 pairs ~323 TFLOP/s of NVFP4 with 273 GB/s of memory bandwidth. Divide them and you get the ridge point: 1184 FLOP per byte. A workload below that line is memory-bound and cannot reach peak compute no matter what the tensor cores can do.
This serving workload measures 112 FLOP/byte mixed, and about 26 in pure decode.
What 2:4 actually is
In every group of four weights along the reduction dimension, two are forced to zero. The tensor core skips them — but it has to be told which two, so each kept value carries a 2-bit index. That metadata is why the storage saving is not a half.
The byte saving is about a quarter, not a half
NVFP4 already spends 4 bits on the value plus an FP8 block scale every 16 weights — 4.5 bits per weight, or 0.5625 bytes. Going 2:4 halves the values but adds the index, so the realistic landing zone is around 3.25 bits.
Where a decode step actually spends itself
One decode step on this deployment reads about 34 GB of expert weights per GPU — 512 experts across 48 layers at 0.5625 bytes a weight, halved by the tensor-parallel split. Against that it does a few tenths of a TFLOP of arithmetic.
Concurrency, not sparsity, is the lever
The expert read is a fixed cost per step, and which experts get touched depends on how many tokens are in flight. One stream wakes about 50 of 512 experts; thirty-two streams wake all of them. The weight bill saturates while the token count keeps climbing — which is why the compute share rises with load and nothing else moves it.
Where 2:4 does pay
The technique is not useless — it is aimed at a regime this workload is not in.
| Workload | 2:4 helps? | Why |
|---|---|---|
| Training / pre-training | yes, modest | Compute-bound by construction; up to 1.2× measured on GPT-2 pre-training |
| Vision / encoder inference at large batch | yes | Big dense GEMMs, genuinely compute-bound, cheap to retrain |
| INT8 TensorRT inference (non-LLM) | yes | NVIDIA’s documented workflow, and the one with a speedup track record |
| LLM prefill / large-batch prompt processing | marginal | The one compute-dense LLM phase — but a Qwen3-4B pruned to verified hardware-valid 2:4 measured ~0 % speedup on TensorRT-LLM |
| LLM decode (batch 1–32) | no | Memory-bound; doubles a ceiling you use 2–6 % of, saves ~28 % of bytes at best |
| MoE, any size | research only | No shipping kernel exists anywhere |
The fourth row is the one to sit with. That is NVIDIA’s own optimiser, NVIDIA’s own runtime, a Qwen model, weights confirmed as genuine 2:4 — and nothing came out.
Where it is supported in software
| Layer | 2:4 status |
|---|---|
| NVIDIA silicon | yes — sparse MMA since Ampere; FP8 from Hopper; FP4 from Blackwell |
cuSPARSELt / torch.sparse semi-structured | yes — primitives present and importable |
| TensorRT (vision, INT8) | yes — the documented success case |
| ModelOpt pruning → TensorRT-LLM | on paper — pruning and recovery exist; see the ~0 % result above |
| vLLM | removed — PR #36799 deleted the Sparse24 integration and its kernels |
| LLM Compressor | removed — 2of4 dropped “due to lack of hardware support and user interest” |
| FlashInfer MoE path | never existed — no 2:4 or semi-structured grouped GEMM |
The producer and the consumer were both withdrawn. Upgrading the engine makes this worse, not better.
Why it cannot run on this cluster
Three independent blockers, any one of them sufficient.
What worked instead
The same instinct — find the biggest byte term in a step and shrink it — paid better than sparsity would have, with no pruning and no retraining. Profiling put the output head at 27 % of every decode step: a 1.18 GiB bf16 matrix that speculative decoding reads about 5.4 times per step. Storing that one tensor as NVFP4 took it to 0.33 GiB.
The sparsity that does pay is already running
Static weight sparsity is the one kind this model does not use. It already runs three dynamic kinds, chosen per token at runtime, and each is worth more on a bandwidth-bound box than a fixed 2-of-4 pattern.
A note on the numbers
The TFLOP/s and GB/s figures here are the serving engine’s analytic estimates, computed per step from the model’s shapes — not hardware counters. For this particular checkpoint they are inflated: the estimator assumes 48 dense-attention layers where the model actually has 12 sparse-attention layers and 36 linear-attention ones, so it over-counts both the arithmetic and the KV traffic several-fold.
That cuts in the argument’s favour. The true compute share is lower than the 5.7 % quoted, and the true arithmetic intensity is further from the ridge — so the case against 2:4 on this workload is stronger than the measured figures make it look, not weaker. The corrected figures — ≈ 7 FLOP/byte in decode, ~37 of 6,144 CUDA cores multiplying — are in 95 % busy, 1–7 % multiplying: why a sparse MoE leaves GPU compute idle.
When to reach for 2:4
- Reach for it — you are training, or serving a dense vision/encoder model at large batch on Ampere-or-later, and you can afford a prune-plus-recover cycle.
- Don’t — you are serving an LLM, above all an MoE, above all in decode. The ceiling it raises is not the one you are hitting.
- Instead — profile one step, find the largest byte term, and shrink that. Then batch harder, because on a bandwidth-bound box concurrency is the only free amortisation there is.
TL;DR: NVIDIA’s petaFLOP is FP4 with 2:4 sparsity; dense is half, a real kernel is a third, and a 512-expert MoE gets a sixth of that. The workload sits at 26–112 FLOP/byte against a 1184 FLOP/byte ridge, so the sparse half of the headline was never reachable — and 2:4 would buy ~28 % of bytes, not 2× of anything. It also cannot run: the checkpoint is dense, the engine deleted sparsity support, no 2:4 MoE kernel exists, and no sparse build of this model family was ever published.
Sources
- GB10 really does hit ~1 PFLOP NVFP4 (2:4 sparse) — NVIDIA Developer Forums
- Reproducing DGX Spark (GB10) FP4 1 PFLOPS with the CUTLASS profiler — NVIDIA Developer Forums
- ModelOpt structured 2:4 weight sparsity showing no speed improvement vs dense — NVIDIA/Model-Optimizer issue #1974
- [Sparse24][Deprecation] Remove Sparse24 CT integration and kernels — vLLM PR #36799
- Compression schemes — LLM Compressor docs
- neuralmagic/Sparse-Llama-3.1-8B-2of4 — Hugging Face
- Accelerating Transformer Pre-training with 2:4 Sparsity — arXiv
- Samoyeds: Accelerating MoE Models with Structured Sparsity — arXiv
- Accelerating Inference with Sparsity Using Ampere and TensorRT — NVIDIA
- GeForce RTX 5090 specifications — NVIDIA