GPUFits

FP8, NVFP4, or GGUF Quants: Datacenter Formats vs llama.cpp Formats

updated 2026-09-10 · verified 2026-09-10

When you go to download a model, you meet two parallel universes: official checkpoints labeled FP8 or NVFP4 on Hugging Face, and a wall of GGUF files in the bartowski repos. Both are “low precision,” but they target different hardware, different software stacks, and different workloads. The cost of picking the wrong universe isn’t quality — it’s that nothing runs at all.

Two formats, two ecosystems

GGUF is llama.cpp’s container format. Its quantization schemes (Q4_K_M, Q8_0, and friends) are integer quantization: weights are stored as low-bit integers plus scaling factors, then dequantized back to FP16/BF16 before the matrix math runs. The design goal is portability — one file runs on CPU, CUDA, Metal, or Vulkan, and Ollama, LM Studio, and llama.cpp all load it directly.

FP8 / NVFP4 are NVIDIA’s datacenter-lineage floating-point formats. Their purpose is to let Tensor Cores do the matrix math directly in low precision — no dequantization, the compute itself happens at 8 or 4 bits. They ship as ordinary safetensors checkpoints (NVIDIA publishes FP8/NVFP4 variants of popular models; DeepSeek-V3/R1 ship native FP8 weights) and load through serving frameworks like vLLM, TensorRT-LLM, and SGLang.

The one-line distinction: GGUF saves bytes moved; FP8/NVFP4 save the computation itself.

FP8: 8-bit floats from Hopper onward

FP8 comes in two flavors: E4M3 (4 exponent bits, 3 mantissa bits, used for weights and activations) and E5M2 (wider dynamic range, used for gradients). Each weight is exactly 8 bits, paired with per-tensor or per-block scaling factors.

The hardware gate is explicit: fourth-generation Tensor Cores — Ada (RTX 40 series) and Hopper (H100) and later — run FP8 matrix math natively. Ampere (RTX 30 series, A100) and older have no such instruction: an FP8 checkpoint there gets converted back to FP16 at load time. The file stays small, but there’s zero speed benefit and you lose GGUF’s ecosystem convenience.

DeepSeek-V3 pushed FP8 into the spotlight: its 671B weights were trained and released natively in FP8, making “datacenter models default to FP8” a practical reality — training saves compute, inference saves VRAM, and one checkpoint serves both.

NVFP4: 4-bit floats, Blackwell only

NVFP4 arrived with Blackwell (RTX 50 series, B200/GB200). Each weight uses E2M1 (2 exponent bits, 1 mantissa bit), every 16 weights share one FP8 (E4M3) scaling factor, plus one FP32 factor per tensor. That works out to roughly 4.5 bits per weight.

This “small blocks plus high-precision scales” structure is exactly why it beats legacy 4-bit formats: GGUF’s Q4_K_M uses integers with super-block scales, NVFP4 uses micro-floats with FP8 scales — same idea, different arithmetic. Per NVIDIA’s own figures, NVFP4 cuts memory by about 3.5× versus FP16 and 1.8× versus FP8, and when paired with QAT (quantization-aware training) the accuracy loss stays small — NVIDIA’s NVFP4 pretraining experiments (a 12B hybrid model at 10T tokens) report training loss and downstream accuracy close to the BF16 baseline.

The hardware gate is hard: FP4 matrix math exists only on Blackwell’s fifth-generation Tensor Cores. RTX 40 and older cards cannot accelerate NVFP4 natively.

Size and VRAM: both formats on one table

Both ecosystems plug into the same VRAM formula this site uses: weights = params (billions) × bits per weight ÷ 8, plus KV cache and ~1.5GB runtime overhead. Using FP8 = 8.0 bits, NVFP4 ≈ 4.5 bits, and measured GGUF rates (Q8_0 = 8.51, Q4_K_M = 4.9):

ModelFP8Q8_0 (GGUF)NVFP4Q4_K_M (GGUF)
Llama-3.1-8B (8.03B)8.0 GB8.5 GB4.5 GB4.9 GB
Qwen3-32B (32.8B)32.8 GB34.9 GB18.5 GB20.1 GB
Llama-3.3-70B (70.6B)70.6 GB75.1 GB39.7 GB43.2 GB

Full requirements after adding KV cache (8K context, fp16) and 1.5GB overhead, and where each lands (comfortable = need ≤ 80% of usable VRAM, tight = ≤ 100%):

SetupTotal VRAMWhere it lands
8B FP810.6 GBtight on 12GB, comfortable on 16GB (RTX 4070 Ti S)
8B NVFP47.1 GBcomfortable on 12GB (but only Blackwell accelerates it)
32B NVFP422.1 GBtight on 24GB, comfortable on RTX 5090 32GB
32B FP836.4 GBtight on a 48GB card (A6000)
70B NVFP443.9 GBtight on 48GB, comfortable on 2×32GB or 80GB
70B FP874.8 GBtight on H100/A100 80GB

Note the last row: a 70B model at FP8 still demands an 80GB-class GPU. FP8’s point is not “run big models on small cards” — it’s throughput on datacenter hardware. What actually moves the consumer hardware threshold is the 4-bit tier — whether it’s called NVFP4 or Q4_K_M, the size is nearly identical (39.7 vs 43.2 GB); what differs is how fast it runs, and on what.

Quality: the decisive variable is QAT, not the format

People searching “qat vs q8” are really asking: can 4-bit avoid losing to 8-bit? The answer: at the same 4 bits, QAT and PTQ are different worlds.

  • PTQ (post-training quantization) takes a trained model and compresses it. All of GGUF and most third-party FP8 checkpoints are PTQ. A 4-bit PTQ model (Q4_K_M class) is fine for everyday chat but measurably worse than 8-bit on math and long reasoning chains.
  • QAT (quantization-aware training) injects quantization noise into the forward pass during training or continued training, so the model learns to live with low precision. It costs enormously (only model labs or NVIDIA-scale teams can afford it) but preserves far more fidelity at the same 4 bits. Meta’s small Llama 3.2 models and NVIDIA’s official NVFP4 checkpoints both take this route.

The practical corollary: an official QAT’d NVFP4 checkpoint usually beats a community PTQ Q4_K_M in quality; conversely, without QAT, don’t expect any 4-bit format to catch Q8. The format sets the size and the hardware; the training method sets the quality ceiling.

Speed: GGUF saves bandwidth, FP8/NVFP4 save compute too

Token-by-token generation (decode) is always bandwidth-bound, and both format families are treated equally there. This site’s speed formula theoretical tok/s = bandwidth × 0.75 ÷ weight GB read per token applies to both (theoretical estimates — frameworks, drivers, and CPU overhead move reality by roughly ±30%):

HardwareModel and formatBytes per tokenTheoretical speed
RTX 4090 (1008 GB/s)8B FP88.0 GB~95 tok/s
RTX 40908B Q4_K_M4.9 GB~154 tok/s
RTX 5090 (1792 GB/s)70B NVFP439.7 GB~34 tok/s
H100 (3350 GB/s)70B FP870.6 GB~36 tok/s

The real gap shows up in prefill (prompt processing), which is compute-bound. GGUF integer weights must be dequantized first, and the Tensor Cores still execute FP16 instructions — prefill gets no acceleration. FP8/NVFP4 matrix math runs directly on low-precision Tensor Cores, and prefill throughput can improve severalfold. That’s exactly why multi-user serving (where most tokens are prefill) needs FP8/NVFP4 — and why single-user chat can safely ignore them.

How to choose: hardware first, workload second

Your situationRecommendation
Consumer GPU + llama.cpp/Ollama/LM StudioGGUF Q4_K_M, done (see our Q4 vs Q8 guide)
RTX 40 series + vLLM servingFP8 checkpoints (native acceleration), optionally FP8 KV cache
RTX 50 series / B200 + vLLM or TensorRT-LLMOfficial NVFP4 + QAT checkpoints first; fall back to GGUF Q4_K_M if none exist
Long context is the priorityKeep the format, enable q8/FP8 KV cache first (see the KV cache guide)
Reproducing paper numbers, fine-tune baselinesOriginal FP16/BF16 weights — neither quantization family

Common misconceptions

  • “FP8 files are smaller, so it’s more advanced.” FP8 is 8 bits — the same size class as Q8_0 and over 70% bigger than Q4. Its advantage is the compute path, not compression.
  • “NVFP4 is a new GGUF tier.” It isn’t. NVFP4 lives outside the GGUF ecosystem — it’s a native Blackwell data type loaded by vLLM/TensorRT-LLM. If a download page offers an NVFP4 variant, first confirm you have Blackwell hardware and a serving framework.
  • “All 4-bit is the same.” NVFP4’s micro-float scaling structure and QAT training put it in a different quality class from legacy integer Q4. At the same bit width, the training method matters more than the format.
  • “With FP8 weights, the KV cache takes care of itself.” Weight quantization and KV cache are independent variables. At 128K context, Llama-3.1-8B’s fp16 KV cache alone is ~17GB — more than double its FP8 weights. You still need to enable FP8/q8 KV explicitly.

The one-line summary

Personal local use: GGUF Q4_K_M — it runs everywhere. Serving on Ada/Hopper: FP8. Blackwell with an official QAT checkpoint: NVFP4. Not sure whether your card fits a given format? Plug the format’s bits-per-weight into our VRAM calculator, or check your card directly with the GPU checker — every VRAM figure in this article comes from the same formulas behind them.

FAQ

Is FP8 the same thing as Q8_0?

Nearly identical in size (both ~8 bits per weight) but mechanically different. Q8_0 is integer quantization: weights are dequantized back to FP16 before the math runs. FP8 is a floating-point format that supported GPUs multiply natively on Tensor Cores — no dequant step, and it accelerates prefill too.

Can an RTX 4090 run NVFP4?

Not natively. FP4 matrix math requires Blackwell's fifth-generation Tensor Cores (RTX 50 series, B200). A 4090 can only emulate it in software with no acceleration, so GGUF Q4_K_M is the better answer there. The 4090 does natively support FP8.

Can a QAT-quantized 4-bit model really match Q8 quality?

It can get close. Quantization-aware training teaches the model to live with low precision during training, so the same 4 bits preserve far more fidelity than post-training quantization. That's why official NVFP4 checkpoints ship with QAT. But QAT changes quality, not size — the file is still 4-bit small.

Do I need FP8 or NVFP4 for personal local inference?

Usually no. Single-user inference is bound by VRAM capacity and bandwidth, and GGUF Q4_K_M runs on any hardware with a mature ecosystem. FP8/NVFP4 pay off in multi-user serving (prefill throughput) and on datacenter or Blackwell hardware running vLLM.

Is FP8 KV cache the same as FP8 weights?

No — they're independent switches. vLLM and TensorRT-LLM support FP8 KV cache, which halves the context working memory, equivalent to q8 KV in llama.cpp. You can enable FP8 KV even while keeping weights at FP16.

Sources