How Much GPU VRAM Do You Need to Run an LLM?
A model needs roughly 2 GB of GPU memory per billion parameters at 16-bit precision, plus room for the KV cache and runtime overhead. An 8B model fits on one 24 GB card for a single short chat. A 70B model at 16-bit needs about 140 GB for the weights alone, which means at least two 80 GB GPUs for the weights and more once you add cache and overhead, or a quantized version.
That rule of thumb gets you close. This guide breaks the real number into three parts, so you can size a GPU for your own model, context length and number of users:
VRAM ≈ weights + KV cache + overhead
Figures are as of October 2026.
1. Model weights: parameters times bytes
Weights are the biggest and most predictable part. Multiply the parameter count by the bytes each parameter takes at your chosen precision:
weights (GB) = parameters (billions) × bytes per parameter
Precision | Bytes per parameter | 8B model | 70B model |
|---|---|---|---|
FP32 | 4 | 32 GB | 280 GB |
FP16 / BF16 | 2 | 16 GB | 140 GB |
FP8 / INT8 | 1 | 8 GB | 70 GB |
4-bit (GPTQ, AWQ, GGUF Q4) | about 0.5–0.6 | about 4–5 GB | about 35–42 GB |
Inference almost never uses FP32. BF16 is the usual default, and 8-bit or 4-bit quantization trades a little quality for a much smaller footprint. 4-bit formats sit slightly above 0.5 bytes because they also store scaling values.
Mixture-of-experts (MoE) models need care. Only a few experts run per token, but all of them must sit in memory. Size an MoE model by its total parameters, not its active ones: a model with 671B total and 37B active parameters still needs memory for 671B.
2. KV cache: context length times users
The KV cache stores attention keys and values for every token in every active conversation. It grows with context length and with the number of requests running at once, so it is the part people forget:
KV cache (bytes) = 2 × layers × KV heads × head dim × bytes per value × tokens × concurrent sequences
The layer, KV-head and head-dimension values are in the model's config.json (num_hidden_layers, num_key_value_heads, and either head_dim or hidden_size divided by num_attention_heads). The leading 2 counts one key and one value.
Two worked examples at 16-bit cache precision. The Llama 3.3 70B figures match its published config: 80 layers, 8 KV heads, head dimension 128.
Model | Layers | KV heads | Head dim | Per token | 8K tokens | 32K tokens | 128K tokens |
|---|---|---|---|---|---|---|---|
Llama 3.1 8B | 32 | 8 | 128 | 0.13 MB | 1.1 GB | 4.3 GB | 17.2 GB |
Llama 3.3 70B | 80 | 8 | 128 | 0.33 MB | 2.7 GB | 10.7 GB | 42.9 GB |
Those figures are for one conversation. Ten users each holding 8K tokens on the 70B model need about 27 GB of cache on top of the weights. Long roleplay chats and agent sessions are where this adds up fastest.
An 8-bit KV cache halves these numbers, at a small cost in quality on some models. The formula also assumes standard attention with grouped KV heads. Models that compress the cache, such as those using multi-head latent attention (DeepSeek's, for example) or sliding-window attention, need far less, so read their config before you apply it.
3. Overhead, and two full examples
The CUDA context, activations and the serving framework's buffers take the rest. A common rule of thumb is 10–20% on top of weights plus cache, and never less than 1–2 GB per GPU. Prompt-heavy workloads push toward the top of that range. Both examples below use 15%.
There is also a limit on how much of the card you can use. vLLM, for example, lets its engine use 90% of GPU memory by default (gpu_memory_utilization=0.9), and that budget covers weights, KV cache and activations together. It fills whatever is left after weights with cache, so a running server that shows the GPU almost full is normal. For sizing, the test is simple: your total has to fit inside 90% of the card's memory.
Example A: Llama 3.1 8B, 8K context, 4 concurrent chats
Part | BF16 | 8-bit weights |
|---|---|---|
Weights | 16 GB | 8 GB |
KV cache (4 × 1.1 GB) | 4.3 GB | 4.3 GB |
Overhead (about 15%) | about 3 GB | about 2 GB |
Total | about 23 GB | about 14 GB |
In BF16 this does not fit a 24 GB card at the default setting, because 90% of 24 GB is about 21.6 GB. It fits comfortably on a 48 GB card (about 43 GB usable). With 8-bit weights the total drops to about 14 GB, which fits a 24 GB card with about 7 GB to spare for more users.
Example B: Llama 3.3 70B, 8K context, 10 concurrent chats
Part | BF16 | FP8 | 4-bit |
|---|---|---|---|
Weights | 140 GB | 70 GB | about 40 GB |
KV cache (10 × 2.7 GB) | 27 GB | 27 GB | 27 GB |
Overhead (about 15%) | about 25 GB | about 15 GB | about 10 GB |
Total | about 192 GB | about 112 GB | about 77 GB |
- BF16 (about 192 GB): two 141 GB GPUs (about 254 GB usable) or four 80 GB GPUs (about 259 GB usable). Three 80 GB GPUs would have enough memory, but tensor parallelism needs a GPU count that divides the model's attention heads. vLLM stops with the error "Total number of attention heads must be divisible by tensor parallel size" otherwise. Llama 3.3 70B has 64 heads, so use 2, 4 or 8 GPUs, not 3.
- FP8 (about 112 GB): two 80 GB GPUs (about 144 GB usable) are enough.
- 4-bit (about 77 GB): this does not fit one 80 GB GPU, which has about 72 GB usable. Serve fewer users, or switch the KV cache to 8-bit, which halves the cache to about 13 GB and brings the total to about 61 GB. A 141 GB GPU leaves plenty of room either way.
Splitting a model across GPUs adds a little overhead on each card, so keep some headroom.
4. Which GPU fits which model
This table applies the formulas above to common data-center GPUs. The ceilings are rough, not benchmarks. They assume 90% of the card is usable, 15% overhead, 8K context and about four concurrent users, and they are for dense models. Treat them as a starting point, then run the numbers for your own model.
GPU | Memory | Rough ceiling in BF16 | Rough ceiling at 4-bit |
|---|---|---|---|
L40S | 48 GB | about 14B | about 30B with a few users; 70B does not fit with a usable cache |
A100 80GB / H100 | 80 GB | about 24B | 70B with up to about eight users |
H200 | 141 GB | about 45B; 70B fits at FP8 with about ten users | 70B with long contexts |
B200 | 180 GB | about 60B | 70B with many users and long contexts |
B300 | 288 GB | about 100B | about 200B |
8 × H100 | 640 GB | about 200B | a 671B-class MoE (about 370 GB of weights) |
Memory sizes for the H200, B200 and B300 come from NVIDIA's HGX documentation.
Three checks before you pick:
- Long context or many users? Add the KV cache for your real context length and concurrency. On a busy server it can match the weights.
- One GPU or several? A model that fits on one GPU is simpler and avoids cross-GPU traffic. Split across GPUs only when it doesn't fit, and use a GPU count that divides the model's attention heads.
- Quality at lower precision? Quantization trades some quality for memory. Test FP8 and 4-bit on your own prompts and compare them with BF16 before relying on either.
5. Running it on Nebula Block
You only need to size a GPU if you host the model yourself. Nebula Block has two ways to run a model, and the first one skips sizing entirely.
Option | Best for | Who sizes the GPU |
|---|---|---|
Calling an open model from the catalog through an OpenAI-compatible API, with no servers to provision | Nebula Block | |
GPU Cloud instances (VM or container) | Your own or fine-tuned model, a custom serving stack, experiments | You, using this guide |
GPU Cloud bare metal (offered on H100) | Workloads that want dedicated hardware with no hypervisor | You, using this guide |
For serverless, check the model catalog first. If your model is already there, you don't need a GPU at all.
For GPU instances, work out your total in sections 1 to 3, then choose a configuration whose usable memory (90% of the total across its GPUs) covers it with about 10% headroom. A few facts from the docs help with that:
- Hardware and regions. Nebula Block rents B300, B200, H200, H100, A100, L40/L40S and RTX GPUs, in configurations from a single GPU up to 8-GPU nodes (10 in some regions), across Canada, the United States, Finland, France and Norway.
- Checking what's in stock. The Deploy page in the console and the List Products API show current availability. The API returns the GPU model and
gpu_countfor each configuration, so match them against the memory sizes in section 4. Checkis_availablerather thanstock. - Access and limits. GPU instances need Tier 3, which is a $10 deposit. An hourly spending limit caps how much you can run at once, so multi-GPU nodes can need a higher limit than a new account starts with.
- Billing. Instances are billed hourly for as long as they exist, and stopping an instance does not stop billing. Delete instances you are finished with.
Conclusion
Start with 2 GB per billion parameters in BF16, then add the KV cache for your real context length and user count, plus about 15% overhead. Check the total against 90% of the card's memory, not 100%. If it doesn't fit, quantize to FP8 or 4-bit, serve fewer users or move to a bigger card, and use a GPU count that divides the model's attention heads when you split it. If the model is already in a serverless catalog, you may not need to size anything at all.
Learn more at
- Email: contact@nebulablock.com
- Website: nebulablock.com
- Docs: docs.nebulablock.com
- Book a call: nebulablock.com/contact