FP8 vs INT4 Quantization: Production Quality vs Cost 2026
Photo by Markus Spiske on Unsplash
Quick Answer: For production LLM serving in 2026, use FP8 for quality-sensitive workloads (perplexity loss <0.5%, MMLU drop <1%) and INT4 for cost-sensitive workloads (2x memory savings, 40-60% higher throughput). FP8 with H100 achieves ~95-97% of FP16 quality while halving VRAM. INT4 (AWQ/GPTQ) delivers 80-85% throughput of FP8 but at half the VRAM cost. The right choice depends on your model size, hardware, and quality requirements — for most production use cases, FP8 is the new default.
| Format | Bits | VRAM vs FP16 | Quality Loss | Best For | GPU Support |
|---|
| FP16 | 16 | Baseline | None | Development, evaluation | All |
| FP8 (E4M3/E5M2) | 8 | ~50% | <1% | Production serving | H100/H200/B200, RTX 5090 |
| INT8 | 8 | ~50% | 1-2% | CPU inference, older GPUs | Most GPUs (via quantization) |
| INT4 (AWQ/GPTQ) | 4 | ~25% | 2-5% | Consumer GPUs, edge | All GPUs (post-processing) |
| INT4 (GGUF Q4_K_M) | 4.5 | ~28% | 3-5% | Local inference, CPU | CPU + GPU (mixed) |
| NF4 (QLoRA) | 4 | ~25% | 3-4% | Fine-tuning on consumer GPU | All GPUs |
| INT3 (GGUF Q3_K_M) | 3.5 | ~22% | 5-8% | Ultra-budget 70B on 24GB VRAM | CPU + GPU (mixed) |
FP8 is the 2026 production standard. With Blackwell and Hopper native support, FP8 delivers near-FP16 quality at half the memory. INT4 remains essential for consumer GPU inference (RTX 3090/4090/5090) where memory is the bottleneck.
Quality Benchmarks: FP8 vs INT4 vs INT8 vs FP16
Perplexity (Lower Is Better) — Llama 3.1 70B
| Format | WikiText-2 | C4 | The Pile | vs FP16 |
|---|
| FP16 | 3.45 | 4.12 | 3.89 | Baseline |
| FP8 (E4M3) | 3.48 (+0.03) | 4.15 (+0.03) | 3.93 (+0.04) | ✅ Negligible |
| INT8 (SmoothQuant) | 3.52 (+0.07) | 4.21 (+0.09) | 3.98 (+0.09) | ✅ Minimal |
| INT4 (AWQ 4-bit) | 3.72 (+0.27) | 4.45 (+0.33) | 4.20 (+0.31) | ⚠️ Noticeable |
| INT4 (GPTQ 4-bit) | 3.78 (+0.33) | 4.52 (+0.40) | 4.28 (+0.39) | ⚠️ Noticeable |
| GGUF Q4_K_M | 3.70 (+0.25) | 4.42 (+0.30) | 4.18 (+0.29) | ⚠️ Noticeable |
| GGUF Q3_K_M | 3.95 (+0.50) | 4.70 (+0.58) | 4.45 (+0.56) | ⚠️ Degraded |
Benchmark Scores (70B Models)
| Format | MMLU | HumanEval | GSM8K | TruthfulQA |
|---|
| FP16 | 82.3% | 72.0% | 85.5% | 63.2% |
| FP8 | 81.9% (-0.4) | 71.5% (-0.5) | 84.8% (-0.7) | 62.8% (-0.4) |
| INT8 | 81.2% (-1.1) | 70.1% (-1.9) | 83.5% (-2.0) | 62.0% (-1.2) |
| INT4 (AWQ) | 79.5% (-2.8) | 67.8% (-4.2) | 81.0% (-4.5) | 60.5% (-2.7) |
| INT4 (GPTQ) | 78.8% (-3.5) | 66.5% (-5.5) | 80.2% (-5.3) | 59.8% (-3.4) |
| Q4_K_M | 79.8% (-2.5) | 68.5% (-3.5) | 81.5% (-4.0) | 61.0% (-2.2) |
| Q3_K_M | 76.5% (-5.8) | 63.0% (-9.0) | 77.0% (-8.5) | 58.5% (-4.7) |
Key Quality Insights
| Observation | Implication |
|---|
| FP8 loss is <1% on all benchmarks | FP8 is production-ready for any use case |
| INT4 AWQ loses 2-5% on reasoning tasks | Avoid INT4 for code generation and math |
| HumanEval (coding) is most sensitive to quantization | Use FP8 or INT8 for code models |
| Q3_K_M loses 5-9% on reasoning | Only suitable for creative writing, chat |
| Smaller models degrade more | 8B at INT4 loses more % than 70B at INT4 |
Rule of thumb: If you can hear the quality difference, use FP8. If you can't fit the model at FP8, use INT4 AWQ (best quality among 4-bit methods). Never use Q3 for code or math.
Hardware Support: What Runs What
Native Hardware Support
| GPU | FP8 Native | INT8 Tensor Core | INT4 Tensor Core |
|---|
| H100/H200 | ✅ Full speed (1.3 PFLOPS) | ✅ | ✅ (via INT8) |
| B100/B200 | ✅ Full speed (2x H100) | ✅ | ✅ (via INT8) |
| RTX 5090 (Blackwell) | ✅ Native FP8/FP4 | ✅ | ✅ FP4 native |
| RTX 4090 (Ada) | ❌ (no native) | ✅ | ✅ |
| RTX 3090 (Ampere) | ❌ | ✅ | ✅ (slower) |
| A100 | ❌ (no native) | ✅ | ✅ |
| Older/CPU | ❌ | ❌ | ❌ (GGUF only) |
What Runs Where
| Format | H100 | RTX 5090 | RTX 4090 | M4 Ultra | Notes |
|---|
| FP8 (native) | ✅ Fastest | ✅ Fast | ❌ | ❌ | H100=1.3 PFLOPS FP8 |
| FP8 (simulated) | ✅ | ✅ | ⚠️ Slow | ❌ | No speedup on non-native |
| INT8 (Tensor Core) | ✅ | ✅ | ✅ | ❌ | Fast on all NVIDIA |
| INT4 AWQ (GPU) | ⚠️ Via INT8 | ✅ | ✅ | ❌ | Requires CUDA |
| INT4 GGUF (GPU + CPU) | ❌ Not needed | ✅ | ✅ | ✅ | Cross-platform |
| FP4 (Blackwell) | ❌ | ✅ Native | ❌ | ❌ | 5090-only, early days |
FP8 Deep Dive: The Production Standard
Why FP8 Wins for Production
FP8 was designed specifically for LLM inference on Hopper and Blackwell architectures. It offers:
- 2x memory density vs FP16 (fit 70B in 80GB H100 instead of needing 2x)
- Near-lossless quality — 0.5-1% benchmark degradation
- Native H100 support — runs at 1.3 PFLOPS (vs 990 TFLOPS for FP16)
- Simplified pipeline — no calibration dataset needed (unlike INT4)
| Format | Exponent Bits | Mantissa Bits | Range | Precision | Best For |
|---|
| E4M3 | 4 | 3 | ±15 | Higher | Model weights, activations |
| E5M2 | 5 | 2 | ±30K | Lower | Gradients (training) |
For inference, E4M3 is used for both weights and activations.
H100 FP8 Throughput
| Model | FP16 Throughput | FP8 Throughput | Improvement |
|---|
| Llama 3.1 70B (batch=1) | 42 tok/s | 55 tok/s | +31% |
| Llama 3.1 70B (batch=32) | 380 tok/s | 650 tok/s | +71% |
| Llama 3.1 8B (batch=1) | 210 tok/s | 305 tok/s | +45% |
| Llama 3.1 8B (batch=256) | 4,200 tok/s | 8,100 tok/s | +93% |
Photo by Google DeepMind on Pexels
INT4 Deep Dive: Maximum Efficiency
INT4 Methods Compared
| Method | Quality | Speed | Calibration | Hardware | Best For |
|---|
| AWQ | 🥇 Best | 🥇 Fastest | 128 samples | CUDA GPU | Production 4-bit |
| GPTQ | 🥈 Good | 🥇 Fastest | 128 samples | CUDA GPU | Older standard |
| GGUF Q4_K_M | 🥈 Good | 🥉 Slower | None | CPU + GPU | Local/consumer |
| BitsAndBytes 4-bit | 🥉 OK | 🥉 Slowest | None | CUDA GPU | Fine-tuning (QLoRA) |
| FP4 (Blackwell) | ⚠️ Early | 🥇 Native | None | RTX 5090 only | Experimental |
AWQ: The Gold Standard for INT4
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-3.1-8B"
quant_path = "llama-3.1-8b-awq-4bit"
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM",
}
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
INT4 VRAM Savings
| Model | FP16 | FP8 | INT4 AWQ | INT4 GGUF |
|---|
| 7B | 14 GB | 7 GB | 4 GB | 4 GB |
| 13B | 26 GB | 13 GB | 7 GB | 7 GB |
| 30B | 60 GB | 30 GB | 15 GB | 15 GB |
| 70B | 140 GB | 70 GB | 35 GB | 35 GB |
| 120B | 240 GB | 120 GB | 60 GB | 60 GB |
INT8: The Middle Ground
INT8 via SmoothQuant is worth considering if your hardware doesn't support FP8 but you need better quality than INT4.
| Factor | INT8 (SmoothQuant) | FP8 (Native) | INT4 (AWQ) |
|---|
| Quality loss | 1-2% | <1% | 2-5% |
| VRAM vs FP16 | 50% | 50% | 25% |
| Speed vs FP16 | 1.5-2x | 1.3-2x | 2-3x |
| Hardware req | CUDA compute 7.0+ | H100/RTX 5090 | CUDA compute 7.5+ |
| Calibration needed | ✅ Yes | ❌ No | ✅ 128 samples |
When to use INT8 instead of FP8:
- You're on A100/H100 but want slightly better quality than FP8 (unlikely need)
- You're on RTX 4090 (no FP8 support) and quality matters more than speed
- You need INT8 for a specific deployment pipeline requirement
Quantization Decision Workflow
┌─────────────────────┐
│ What hardware do │
│ you have? │
└──────────┬──────────┘
│
┌───────────┴───────────┐
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ H100/B200 │ │ Consumer │
│ (FP8 OK) │ │ GPU (No FP8)│
└───────┬───────┘ └───────┬───────┘
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ Does model │ │ Does model │
│ fit in 80GB? │ │ fit in VRAM? │
│ (FP8 = 50%) │ │ (FP16) │
└───────┬───────┘ └───────┬───────┘
│ │
┌──────────┴──────────┐ ┌──────┴──────┐
│ │ │ │
┌────▼────┐ ┌────▼┐ ┌─▼─┐ ┌──────▼──────┐
│ Yes │ │ No │ │Fits│ │ Doesn't fit │
└────┬────┘ └──┬──┘ └──┬─┘ └──────┬──────┘
│ │ │ │
┌────▼────┐ ┌────▼───┐ │ ┌─────────▼───────┐
│ FP8 │ │ AWQ │ │ │ AWQ (INT4) or │
│default │ │(INT4) │ │ │ GGUF Q4_K_M │
└─────────┘ └───────┘ │ └─────────────────┘
│
┌───────▼─────────┐
│ Quality critical?│
│ (code, math, │
│ medical) │
└───────┬─────────┘
│
┌─────────────┴─────────────┐
│ │
┌───▼────┐ ┌──────▼──────┐
│ AWQ │ │ GGUF Q4 or │
│ (INT4) │ │ AWQ fine │
└────────┘ └─────────────┘
Decision Rules
| Scenario | Recommended Format | Why |
|---|
| H100 + fits FP8 | FP8 | Best quality, no calibration needed |
| H100 + doesn't fit FP8 | FP8 + smaller model | Never sacrifice model size for quantization |
| RTX 5090 + fits FP8 | FP8 (Blackwell native) | Best quality on consumer GPU |
| RTX 4090 + quality critical | INT8 (SmoothQuant) | Best quality without FP8 hardware |
| RTX 3090/4090 + need speed | AWQ 4-bit | Good balance of quality and speed |
| Local inference (CPU/GPU mix) | GGUF Q4_K_M | Most compatible, good speed |
| 70B on 24GB (RTX 4090) | GGUF Q3_K_M | Only way to fit |
| Fine-tuning on consumer GPU | NF4 (QLoRA) | Only 4-bit format designed for training |
| Coding model | FP8 or INT8 | Code degrades badly at INT4 |
| Chat/creative writing | AWQ 4-bit or Q4_K_M | Acceptable quality loss |
Cost Per Token (H100, 70B Model)
| Format | Tokens/Sec | $/Hr (H100) | Cost/M Tokens |
|---|
| FP16 | 42 | $3.00 | $0.0198 |
| FP8 | 65 | $3.00 | $0.0128 |
| INT8 | 55 | $3.00 | $0.0152 |
| INT4 (AWQ) | 72 | $3.00 | $0.0116 |
Consumer GPU (RTX 4090, 70B Model)
| Format | Tokens/Sec | Notes |
|---|
| Q3_K_M | 11 | Only option on 24GB |
| Q4_K_M | 9 (with offload) | Doesn't fully fit |
| AWQ 4-bit | — | Needs 32GB minimum |
Consumer GPU (RTX 5090, 70B Model)
| Format | Tokens/Sec | Notes |
|---|
| Q3_K_M | 15 | All layers on GPU |
| Q4_K_M | 12 | Partial offload |
| FP8 (native) | 20 | Blackwell native FP8 |
| AWQ 4-bit | 18 | Inferior quality to FP8 |
Key Takeaways
- Use FP8 (E4M3) for production LLM serving on H100/B200/RTX 5090—it delivers ~95-97% of FP16 quality with 2x memory savings and native hardware acceleration (1.3 PFLOPS on H100), requiring no calibration datasets.
- Deploy INT4 (AWQ/GPTQ) only for cost-sensitive or memory-constrained scenarios (e.g., consumer GPUs like RTX 4090/3090), as it sacrifices 2-5% quality (notably on coding/math tasks) but halves VRAM vs FP8 and boosts throughput 40-60%.
- Avoid INT4 for quality-critical workloads (e.g., code generation, medical, or reasoning-heavy tasks)—FP8’s <1% quality loss (vs 2-5% for INT4) justifies its use even when VRAM permits larger models.
- For local inference on mixed CPU/GPU setups (e.g., 24GB VRAM), use GGUF Q4_K_M (or Q3_K_M for 70B models) as the only viable option, accepting 3-5% quality degradation for compatibility.
- On H100, FP8 and INT4 cost per token differ by <15%, but FP8’s superior quality makes it the default choice—reserve INT4 for throughput-optimized or VRAM-limited deployments (e.g., 70B on 24GB GPUs).
- Never use Q3_K_M for code/math tasks—its 5-9% quality loss (vs FP16) is unacceptable for reasoning-heavy applications, though it may suffice for creative writing or chat.
Comments
Sign in to join the conversation
No comments yet. Be the first to share your thoughts!