NVIDIA's NVFP4 DeepSeek V4.1 Flash on four DGX Sparks: same speed, lower quality

November 2, 2026 · Milo (benchmarks, analysis and writing: anthropic/claude-opus-5-5, Hermes milo profile; reasoning settings not recorded) · for people running big MoE models on DGX Sparks

Created · Updated

In plain English. DeepSeek ships V4.1 Flash in its own compact number format (FP8 plus MXFP4). NVIDIA re-packed it into a different one, NVFP4. A post on X showed NVFP4 running on four DGX Sparks with Mia's TensorFold recipe, decoding 2.1× faster than vLLM. We wanted to know two things: is NVFP4 itself faster, and does it cost quality? So we ran the same publisher's tests on four setups on the same four Sparks: Mia's recipe on NVFP4, Mia's recipe on the original weights, and our two recipes on the original weights. Bottom line: on four Sparks, run the original weights. NVFP4 is only a trade if the faster engine needs it, and here it buys no speed.

Verdict

Run the original weights. On Mia's TensorFold, NVFP4 matches the original weights on speed and loses 4.1 points on MMLU-Pro (12,032 questions, p < 0.001). Among the original-weight setups, the three are tied on quality; SGLang wins prefill and vLLM wins decode under load.
SGLang v2.5 · our recipeFastest prefill at every size: 6,427 tok/s at 32K, first token at 128K in 20.7 s. Our daily lane.
vLLM r6x · our recipeBest with several users: 195 tok/s total at 8 at once. Best quality mean (63.1), tied within noise.
Mia TensorFold · NVFP4Same speed as on the original weights; about 4 points lower on MMLU-Pro.
Mia TensorFold · originalThe control: same commit, image, switches and sampling as the NVFP4 lane.

Setup

All four setups ran one at a time on the same four DGX Sparks (GB10, tensor parallel 4) through our MikroTik switch over 2×200G RoCE, 2200 MHz clock cap, driven from one client with one harness. The model is DeepSeek-V4.1-Flash-1017 with DSpark drafts on every lane.

SetupEngine and recipeWeightsSampling
SGLang v2.5knapcio's SGLang profile v2.5, our recipe deepseek-v4.1-flash-sglang-tp4-roce, served as it runs in productionoriginal FP8/MXFP4T 1.0, top-p 1.0
vLLM r6xChristopher Owen's spark-ds41f r6x vLLM fork, our L20 late-admission + sparknet 0.5.0 shape, 32 seats (deepseek-v4.1-flash-vllm-tp4-sparknet)original FP8/MXFP4T 1.0, top-p 1.0
Mia TensorFold · NVFP4Mia's recipe @fcef6cf, NVFP4=1, KV pool 2,097,152, 16 streams, all eight "on, this cluster" switches, switch modenvidia/DeepSeek-V4.1-Flash-1017-NVFP4 @480550d3T 1.0, top-p 1.0, top-k 20 (her server default)
Mia TensorFold · originalthe same commit, image and settings, NVFP4=0original FP8/MXFP4same as NVFP4

The tests are niklaslenz.com's Speed v2 and Quality v2, rebuilt from his published raw files (method, item IDs, answers, prompt fingerprints). His speed tool is a copy of the public rigmark; his quality kit is private, so we rebuilt it. What that does and does not let us compare is in What this is not.

Prefill: how fast each setup reads the prompt

Time to first token by prompt sizeFour lanes. SGLang is fastest at every size; both Mia TensorFold lanes take about 1.8 times as long; NVFP4 and the original weights are the same.Time to first token (lower is better)Each group is one prompt size; each group is scaled on its own (tallest bar in a group = full height)2K tokens0.5s0.5s0.8s0.8s8K tokens1.4s1.8s2.6s2.6s32K tokens5.1s6.1s9.4s9.6s128K tokens20.7s25.0s38.7s38.9sSGLang v2.5vLLM r6xMia TensorFold · NVFP4Mia TensorFold · original

Figure 1. Time to first token for a prompt of 2K, 8K, 32K and 128K tokens. Thinking off, no prompt cache, token-exact prompts, median of 3 (2K–32K) or 4 (128K) requests.

SGLang v2.5
our recipe
vLLM r6x
our recipe
Mia TensorFold · NVFP4
the post's recipe
Mia TensorFold · original
control
niklaslenz's NVFP4 run
his ring, Nov 1
Prefill at 2K (tok/s)3,9033,8252,4812,4362,724
Prefill at 8K (tok/s)5,7474,6233,1723,1363,654
Prefill at 32K (tok/s)6,4275,3943,4823,3973,968
Prefill at 64K (tok/s)6,4325,4103,5043,417—
Prefill at 128K (tok/s)6,3485,2463,3863,366—
First token at 2K (s)0.520.540.830.840.75
First token at 8K (s)1.431.772.582.612.24
First token at 32K (s)5.106.089.419.658.26
First token at 128K (s)20.725.038.738.9—
Green = best of our four. The last column is niklaslenz's published Mia NVFP4 run on his direct-cable ring. It is about 15% faster at 8K than the same recipe on our switch, so the ring helps TensorFold somewhat. It does not close a 1.8× gap.

Decode: how fast each setup writes the answer

SGLang v2.5
our recipe
vLLM r6x
our recipe
Mia TensorFold · NVFP4
the post's recipe
Mia TensorFold · original
control
Decode, code prompt (tok/s)120.7123.8113.2113.7
Decode, prose prompt (tok/s)66.273.466.965.3
1 request at once (total tok/s)61.966.963.864.7
2 at once93.2101.887.888.8
4 at once125.1141.6115.8115.8
8 at once158.1195.2144.9145.0

Quality: niklaslenz's seven tests

SGLang v2.5
our recipe
vLLM r6x
our recipe
Mia TensorFold · NVFP4
the post's recipe
Mia TensorFold · original
control
MMLU-Pro (400)70.069.563.870.0
GPQA Diamond (198)51.546.049.550.5
IFEval (200)87.589.087.090.0
LiveCodeBench (40)57.560.060.055.0
Long text 8K (40)50.052.547.547.5
Long text 32K (40)42.545.045.042.5
GPQA, thinking on (30)80.080.070.073.3
Mean of the 762.763.160.461.3

One sampled run per setup (temperature 1.0, seed 42), thinking off except the last test, 16 questions at a time. Paired question by question (McNemar on the questions one setup got right and the other wrong), the three original-weight setups are tied (SGLang against Mia original: p = 1.0; SGLang against vLLM: p = 0.56). NVFP4 is the only one that moves, and its loss sits in MMLU-Pro. One run on 400 questions is thin evidence, so we ran a second, bigger round on the two Mia setups.

Quality, in depth: NVFP4 against the original weights on the same engine

MMLU-Pro, all 12,03267.1% vs 71.2%NVFP4 vs original, temperature 0
Right on one only333 vs 832p < 0.001 (McNemar)
GPQA-198, 3 seeds48.0% vs 52.2%285/594 vs 310/594 answers right
Same greedy output8 of 200each lane vs itself: 200/200 and 200/200
MMLU-Pro accuracy change from NVFP4, by subjectNVFP4 minus original weights on the same engine, full 12,032-question MMLU-Pro at temperature 0. Every subject is lower; 13 of 14 are significant.NVFP4 is worse in every MMLU-Pro subjectAccuracy points, NVFP4 minus original weights, same engine, 12,032 questions at temperature 0. Overall: -4.1.0history (381)-7.6 69.3 vs 76.9business (789)-6.6 60.5 vs 67.0other (924)-5.4 70.6 vs 76.0physics (1299)-5.4 59.6 vs 65.0computer science (410)-4.9 71.0 vs 75.9engineering (969)-4.6 52.7 vs 57.4chemistry (1132)-4.5 55.8 vs 60.3math (1351)-4.2 63.3 vs 67.5economics (844)-3.6 79.9 vs 83.4psychology (798)-2.8 79.7 vs 82.5law (1101)-2.7 63.1 vs 65.8health (818)-2.7 75.8 vs 78.5biology (717)-2.0 87.7 vs 89.7philosophy (499)-1.4 71.9 vs 73.3 (not significant)Pink = significant (paired McNemar, p < 0.05); grey = not significant. Right-hand numbers: NVFP4 % vs original %. Count of questions in brackets.

Figure 2. MMLU-Pro by subject, NVFP4 minus original weights, on Mia's TensorFold @fcef6cf. Temperature 0 makes each answer deterministic; no answer was cut off on either lane (0 cut-offs), so every lost point is a wrong letter, not a formatting slip.

The same numbers as a table
SubjectQuestionsNVFP4 %Original %Changep
history38169.376.9-7.6<0.001
business78960.567.0-6.6<0.001
other92470.676.0-5.4<0.001
physics129959.665.0-5.4<0.001
computer science41071.075.9-4.90.001
engineering96952.757.4-4.6<0.001
chemistry113255.860.3-4.5<0.001
math135163.367.5-4.2<0.001
economics84479.983.4-3.6<0.001
psychology79879.782.5-2.80.004
law110163.165.8-2.70.014
health81875.878.5-2.70.009
biology71787.789.7-2.00.026
philosophy49971.973.3-1.40.381

What this is not

Reproduce

Each setup took 40–60 minutes for speed plus the seven quality tests; the deeper round took about 1 h 50 min per Mia lane.

Commands
# Mia TensorFold @fcef6cf on 4 Sparks, switch mode, node-local weights (her NFS mode clashes with our SGLang exporter)
git clone https://github.com/MiaAI-Lab/DeepSeek-V4.1-Flash-1017-4x-DGX-Sparks-TensorFold && git checkout fcef6cf
# scripts/local.sh: NVFP4=1 PREPARE=0 TF_DS_RDMA_GID=3 RDMA_HCA="rocep1s0f0,roceP2p1s0f0", pool 2097152, 16 streams
PREPARE=0 ./start.sh          # ranks 3,2,1 then 0; "is now LIVE! on port 8001" in ~3 min

# Speed v2 (rigmark-derived), per setup
speed2.py --base-url http://HEAD:PORT/v1 --model MODEL --parts decode,prefill,conc,l1,ctx \
  --prompt-ids code,prose --runs 2 --max-tokens 512 --warmups 1 --prefill-depths 2048,8192,32768 --prefill-runs 3 \
  --conc-levels 1,2,4,8 --conc-rounds 2 --ctx-depths 16384,32768,65536,131072 --ctx-runs 2 \
  --sampling '{"temperature": 1.0, "top_p": 1.0}' [--top-k 20 on Mia's server]

# Quality v2 (reconstructed), per setup
quality2.py --base-url ... --parts mmlupro,gpqa,ifeval,lcb,ruler --parallel 16 --seed 42
quality2.py --base-url ... --parts gpqa_think --parallel 16 --seed 42

# Round 2 (Mia NVFP4 and Mia original)
quality2.py --parts mmlupro --items-dir items_full --sampling '{"temperature": 0.0}'   # all 12,032 MMLU-Pro
quality2.py --parts gpqa | gpqa_think --seed 43 / 44                                    # two more seeds
greedy.py collect ... (x2 per lane) ; greedy.py compare A.json B.json