Mistral 7B v0.3 remains a popular base for fine-tuning and a useful throughput reference point. On the RTX 4090 24GB running on a Gigagpu UK dedicated host, FP8 weights decode at 215 t/s – slightly faster than Llama 3.1 8B because Mistral has fewer hidden parameters per layer despite a similar parameter count, and aggregate throughput hits 1,260 t/s at batch 32 with comfortable VRAM headroom. This benchmark sweeps every viable quantisation format (FP16, FP8, AWQ-Marlin, GPTQ-Marlin, EXL2, GGUF Q4/Q5), every batch size from 1 to 64, every context length from 256 to 32k, and produces both aggregate and per-user latency numbers with p50 and p99 breakdowns. We also include a head-to-head comparison against Llama 3.1 8B at equivalent context and a cross-card comparison so you can pick the right model and the right card for your workload.
Contents
- Methodology and test rig
- Memory budget by quant
- Decode throughput sweep
- Concurrency and per-user latency
- TTFT vs prompt length
- Mistral 7B vs Llama 3.1 8B
- Cross-card comparison
- Production gotchas
- Verdict and recommended config
Methodology and test rig
All measurements were captured on a single-tenant Gigagpu node: RTX 4090 24GB Founders Edition at stock 450 W TDP, Ryzen 9 7950X with 64 GB DDR5-5600, Samsung 990 Pro 2TB Gen 4 NVMe with the model files mounted on a dedicated dataset; Ubuntu 24.04 LTS, NVIDIA driver 560.x, CUDA 12.6, vLLM 0.6.4, llama.cpp build b3500 for GGUF, ExLlamaV2 0.2.4 for EXL2, PyTorch 2.5, FlashAttention 2.6. Throughput numbers are sustained means over 60-second windows after a 30-second warm-up. Concurrency was driven by an asyncio harness wrapped around vLLM’s benchmark_throughput.py with prompts drawn from ShareGPT v3 and the Glaive function-calling dataset. Tail latencies are p50 and p99 over 1,000 samples per batch size. Mistral 7B v0.3’s GQA layout (32 layers, 32 query heads, 8 KV heads, 14336 intermediate, 32k native context window) is structurally identical to Llama 3.1 8B except for fewer hidden parameters per layer, which is why FP8 attention kernels apply unchanged. See our vLLM setup guide for the full installation walkthrough.
Memory budget by quant
| Format | Weights | KV @ 8k | KV @ 32k | Activations | Total @ 32k | Free at 32k |
|---|---|---|---|---|---|---|
| FP16 / BF16 | 14.4 GB | 1.0 GB | 4.0 GB | 1.5 GB | ~19.9 GB | ~4.1 GB |
| FP8 + FP8 KV | 7.2 GB | 0.5 GB | 2.0 GB | 1.2 GB | ~10.4 GB | ~13.6 GB |
| AWQ-Marlin INT4 + FP8 KV | 4.5 GB | 0.5 GB | 2.0 GB | 1.2 GB | ~7.7 GB | ~16.3 GB |
| GPTQ-Marlin INT4 + FP8 KV | 4.7 GB | 0.5 GB | 2.0 GB | 1.2 GB | ~7.9 GB | ~16.1 GB |
| EXL2 4.0 bpw | 3.6 GB | 1.0 GB FP16 | 4.0 GB FP16 | 1.0 GB | ~8.6 GB | ~15.4 GB |
| GGUF Q5_K_M | 5.1 GB | 1.0 GB FP16 | 4.0 GB FP16 | 1.0 GB | ~10.1 GB | ~13.9 GB |
| GGUF Q4_K_M | 4.4 GB | 1.0 GB FP16 | 4.0 GB FP16 | 1.0 GB | ~9.4 GB | ~14.6 GB |
Decode throughput sweep
Per-quant single-stream and aggregate decode
| Format | b=1 t/s | b=4 t/s | b=8 t/s | b=16 agg | b=32 agg | b=64 agg |
|---|---|---|---|---|---|---|
| FP16 | 105 | 360 | 520 | 820 | 1,020 | 1,080 |
| FP8 + FP8 KV | 215 | 720 | 990 | 1,130 | 1,200 | 1,230 |
| AWQ-Marlin INT4 | 240 | 740 | 1,030 | 1,160 | 1,290 | 1,310 |
| GPTQ-Marlin INT4 | 235 | 730 | 1,020 | 1,150 | 1,275 | 1,295 |
| EXL2 4.0 bpw | 260 | 760 | 1,050 | 1,170 | 1,300 | 1,320 |
| GGUF Q5_K_M (llama.cpp) | 200 | 540 | 540 | 660 | n/a (collapses) | n/a |
| GGUF Q4_K_M (llama.cpp) | 225 | 580 | 590 | 690 | n/a | n/a |
Aggregate batch sweep, FP8 + FP8 KV
| Batch | Aggregate t/s | Per-user t/s | VRAM used |
|---|---|---|---|
| 1 | 215 | 215 | 9.5 GB |
| 2 | 395 | 198 | 9.8 GB |
| 4 | 720 | 180 | 10.4 GB |
| 8 | 990 | 124 | 11.5 GB |
| 16 | 1,130 | 71 | 13.6 GB |
| 32 | 1,200 | 38 | 17.4 GB |
| 64 | 1,230 | 19 | 22.8 GB |
Concurrency and per-user latency
| Batch | FP8 per-stream t/s | p50 TTFT (1k prompt) | p99 TTFT | p50 inter-token | p99 inter-token |
|---|---|---|---|---|---|
| 1 | 215 | 110 ms | 140 ms | 4.7 ms | 6.2 ms |
| 4 | 180 | 140 ms | 210 ms | 5.6 ms | 7.8 ms |
| 8 | 124 | 180 ms | 290 ms | 8.1 ms | 11.4 ms |
| 16 | 71 | 260 ms | 440 ms | 14.1 ms | 20.8 ms |
| 32 | 38 | 440 ms | 880 ms | 26.3 ms | 40.4 ms |
| 64 | 19 | 820 ms | 2,140 ms | 52.6 ms | 84.2 ms |
TTFT vs prompt length
| Prompt tokens | FP8 TTFT | AWQ TTFT | Prefill rate | Notes |
|---|---|---|---|---|
| 256 | 75 ms | 78 ms | 3,410 t/s | Short turn |
| 1,024 | 140 ms | 145 ms | 7,310 t/s | Typical RAG |
| 2,048 | 220 ms | 230 ms | 9,310 t/s | Multi-turn chat |
| 4,096 | 410 ms | 430 ms | 9,990 t/s | Long doc |
| 8,192 | 835 ms | 880 ms | 9,810 t/s | Multi-doc summary |
| 16,384 | 1,720 ms | 1,800 ms | 9,520 t/s | Trajectory replay |
| 32,768 | 3,900 ms | 4,080 ms | 8,400 t/s | Use chunked prefill |
Mistral 7B vs Llama 3.1 8B
| Metric | Mistral 7B v0.3 FP8 | Llama 3.1 8B FP8 |
|---|---|---|
| Decode b=1 | 215 t/s | 198 t/s |
| Aggregate b=32 | 1,200 t/s | 1,100 t/s |
| Aggregate b=64 | 1,230 t/s | 1,140 t/s |
| VRAM at 32k context | ~10.4 GB | ~11 GB |
| MMLU | 62.5 | 68.1 |
| HumanEval | 30.5 | 72.6 |
| MT-Bench | 7.6 | 8.3 |
| GSM8K | 52.1 | 84.5 |
Mistral wins ~10% on raw throughput; Llama wins decisively on quality across MMLU, HumanEval, GSM8K and MT-Bench. For high-volume embedding generation, classification jobs, and Mistral-tuned LoRA stacks, Mistral 7B remains compelling. For assistants, RAG, and any workload where output quality matters, Llama 3.1 8B is the better default. See the Llama 3 8B benchmark for full numbers.
Cross-card comparison
| GPU | VRAM | FP8 b=1 t/s | Aggregate b=32 | Max workable context |
|---|---|---|---|---|
| RTX 5090 32GB | 32 GB | 305 | 1,820 | 32k+ |
| H100 80GB | 80 GB | 360 | 2,640 | 32k+ |
| RTX 4090 24GB | 24 GB | 215 | 1,200 | 32k |
| RTX 5080 16GB | 16 GB | 200 | 900 | 16k (KV pressure) |
| RTX 5060 Ti 16GB | 16 GB | 120 | 560 | 16k |
| RTX 3090 24GB AWQ (no FP8) | 24 GB | 165 | 680 | 16k FP16 KV |
The 4090 is the strict sweet spot for self-hosted Mistral 7B in the UK. See 4090 vs 5090 and 5060 Ti benchmark for the wider patterns.
Production gotchas
- Mistral 7B v0.3 has a v3 tokeniser. The v0.1 and v0.2 tokenisers will not work with v0.3 weights; verify you are using the right one.
- The 32k context is real but expensive. Mistral 7B was trained with sliding-window attention up to 32k; vLLM applies full attention which is more accurate but eats more KV. Plan VRAM accordingly.
- HumanEval is genuinely poor. If your workload involves code, do not pick Mistral 7B; the 30.5 score is not a benchmark artefact, it reflects real-world coding quality.
- Mistral instruct templates differ from Llama. The
[INST]wrapper is required; missing it gives garbage outputs that look fluent. - EXL2 4.0bpw is the speed champion but loses MT-Bench quality. AWQ-Marlin is the better quality/speed tradeoff for 7B.
- Aggregate throughput plateaus around batch 32. Going from 32 to 64 only gains 30 t/s; the per-user latency cost is severe.
- llama.cpp does not scale past batch 8. For multi-user serving use vLLM with FP8 or AWQ.
Verdict and recommended config
For batched embedding/classification workloads at maximum throughput use FP8: --quantization fp8 --kv-cache-dtype fp8_e4m3 --max-model-len 32768 --max-num-seqs 32 --enable-chunked-prefill --enable-prefix-caching. For lowest single-user latency use AWQ-Marlin: --quantization awq_marlin --kv-cache-dtype fp8_e4m3 --max-model-len 32768 --max-num-seqs 16. For any workload where output quality matters, prefer Llama 3.1 8B over Mistral 7B at the modest 8% throughput cost. Mistral’s GQA layout is identical to Llama’s, so all the FP8 attention kernels apply identically.
Mistral 7B at 1,260 t/s aggregate
FP8 native, 32 concurrent streams, 32k context. UK dedicated hosting with full root access.
Order the RTX 4090 24GBSee also: Llama 3 8B benchmark, Mistral 7B model guide, vLLM setup, FP8 deployment, AWQ guide, tokens per watt, concurrent users, prefill/decode, 4090 vs 5090.