Which quantisation format to actually run.
A serving stack asks for a number format before it asks for anything else, and the answer moves your monthly bill by a factor of eight. The format with the smallest weights is not always the one that gives you the smallest model.
The short answer
- The rule of thumb
- Weights shrink by exactly the ratio in the name — BF16 / FP16 2 B/param · FP8 1 B/param · 4-bit (AWQ, GPTQ) 0.5 B/param. Nothing else does.
- What it is worth
- Qwen 3 32B needs NVIDIA A100 PCIe at $1,091 a month at full precision, and NVIDIA L4 at $125 at 4-bit. Same model, same context.
- The trap
- The key/value cache does not follow the weights down. At 128k context a 4-bit Llama 3.3 70B is 53 % cache and only 47 % weights.
- Where 4-bit loses outright
- Llama 3.1 8B at 128k needs 23.0 GB in 4-bit against 18.4 GB in FP8 — more memory, for worse quality
Start here
Most of this page is arithmetic, so here is the conclusion first. Four questions settle the format, and they are asked in this order because each one can end the discussion on its own.
Does the model already fit at full precision, with room for your context? Run it at BF16 and stop reading. Quantisation is a way of buying a smaller machine, and you have already bought one that works. There is no prize for compressing a model that fits.
Is your context short and your model large? This is where 4-bit earns its reputation. The weights dominate the memory, and cutting them to a quarter is close to cutting the machine to a quarter.
Is your context long and your model small? Use FP8, on a card that supports it. FP8 halves the cache as well as the weights, and past a certain length that second halving is the one that matters — the table below shows the exact point at which it overtakes 4-bit.
Are you serving one person on one machine? GGUF through Ollama is the least work by a distance, and the throughput you give up is throughput a single reader was never going to use.
Everything after this explains why those four answers are what they are, and gives you the numbers to check them against your own model rather than ours. If you have not yet worked out how much memory your model needs at all, that arithmetic is a separate guide and it comes first.
Three formats, four names
There are only three number formats in common use for serving, and they differ by one thing: how many bytes each parameter costs. Everything else — AWQ, GPTQ, GGUF, bitsandbytes — is a method for producing one of these three, not a fourth format.
| Format | Bytes per weight | Bytes per cache element | What it is for |
|---|---|---|---|
| BF16 / FP16 | 2 | 2 | Reference quality |
| FP8 | 1 | 1 | Near-reference, Hopper and Blackwell |
| 4-bit (AWQ, GPTQ) | 0.5 | 2 | Smallest weights, cache stays FP16 |
Read the two numeric columns as a pair. They are equal on the first two rows and they are not equal on the third, and that single asymmetry is responsible for most of the surprises further down this page.
The four names you will actually meet in a model repository map onto that table as follows.
AWQ and GPTQ
Two routes to the same 4-bit destination. AWQ decides which weights matter by watching activations and protects those; GPTQ compresses layer by layer and corrects the error as it goes. Both produce a checkpoint that vLLM and SGLang load directly, and on any given model the gap between them is smaller than the gap between either one and 16-bit.
GGUF
The llama.cpp family, and what Ollama uses underneath. It is a container rather than a single method: one file holds the weights at any of a dozen precisions, and it will spill layers to system RAM when the card is too small. Unbeatable for one user on one machine, and the weakest of the three under real concurrency.
FP8
Not a checkpoint format so much as a mode. Give a serving stack 16-bit weights and it will cast them to FP8 as it loads, with no separate download and no calibration pass. It is the only one of the four that can also compress the cache, which is why it appears where you would not expect it below.
BF16 and FP16
The weights as the authors released them, and the reference every other row is measured against. Two bytes a parameter, no calibration set, no kernel support to check, no quality argument to have. When it fits, it is the correct answer and the rest of this page is a distraction.
Asking for each of them is one flag. These are the same options the vLLM guide uses at length; the point here is only how short the difference between them is.
# 1. Reference. The weights as published, nothing to prepare.
$ vllm serve meta-llama/Llama-3.3-70B-Instruct --dtype bfloat16
# 2. FP8, quantised while it loads. No second download, no calibration.
# --kv-cache-dtype is the half everyone forgets: it is what
# halves the CACHE as well as the weights.
$ vllm serve meta-llama/Llama-3.3-70B-Instruct \
--quantization fp8 --kv-cache-dtype fp8
# 3. Four-bit AWQ. A DIFFERENT checkpoint, prepared by someone else.
$ vllm serve casperhansen/llama-3.3-70b-instruct-awq \
--quantization awq_marlin
# 4. Four-bit GPTQ. Same idea, different repository and flag.
$ vllm serve TechxGenus/Llama-3.3-70B-Instruct-GPTQ \
--quantization gptq_marlin
The half that does not shrink
Quantising weights to 4 bits does not quantise the key/value cache. AWQ and GPTQ compress weights and only weights; the cache stays at 16 bits unless you separately ask for an FP8 cache, and on a 4-bit checkpoint most people never do. That is the third column of the table above, and it is the reason the arithmetic below does not go the way anyone expects.
The consequence is easiest to see on one model. Below is Llama 3.3 70B, in 4-bit, at each context length the configurator offers — weights against cache.
| Context | Weights | KV cache | Cache share |
|---|---|---|---|
| 4k tokens | 35.0 GB | 1.3 GB | 3 % |
| 8k tokens | 35.0 GB | 2.5 GB | 7 % |
| 32k tokens | 35.0 GB | 10.0 GB | 22 % |
| 128k tokens | 35.0 GB | 40.0 GB | 53 % |
The weights column never moves — that is the whole point of quantising them. The cache column grows linearly with context until, on the last row, it is larger than the model it belongs to.
Push that far enough and 4-bit stops winning at all. FP8 halves both halves; 4-bit quarters one half and leaves the other alone. So for every model there is a context length at which the two cross over, and it arrives sooner the smaller the model is — because a small model has little weight to save and the same cache growth per token.
| Model | 4k | 8k | 32k | 128k |
|---|---|---|---|---|
| Llama 3.1 8B | 5.2 | 5.8 | 9.2 | 23.0 |
| Qwen 3 32B | 19.5 | 20.7 | 27.6 | 55.2 |
| Llama 3.3 70B | 41.7 | 43.1 | 51.7 | 86.3 |
Figures in gigabytes, for the smaller of the two formats, with the loser named underneath. Read left to right and watch the advantage drain out of the 4-bit column as the context grows.
The last row keeps its lead everywhere, because 70 billion parameters is a great deal of weight to save. The middle row ends in a dead heat: at 128k, Qwen 3 32B costs exactly the same in either format, and you would take FP8 for the quality. And the first row crosses over completely at 128k, where 4-bit asks for more memory than FP8 while also being the less faithful of the two. That combination — more memory and worse output — is the single most common quantisation mistake we see, and it is invisible if you only ever look at the size of the weights file.
What your card can actually do
FP8 is a hardware feature before it is a software one. A card whose tensor cores do not speak it will still load an FP8 checkpoint — the stack unpacks the weights to 16 bits on the way to the multiply — but you keep only the download saving and none of the speed, and an FP8 cache is not available to you at all. Four-bit is the opposite: it runs everywhere, because the weights are unpacked to 16 bits before the arithmetic regardless.
| Generation | Cards we rent | FP8 |
|---|---|---|
| Ampere | NVIDIA RTX A6000 48GB, NVIDIA A100 PCIe 40GB, NVIDIA A100 PCIe 80GB, NVIDIA A100 SXM4 80GB | None in hardware — unpacked to 16-bit |
| Ada Lovelace | NVIDIA L4 24GB, NVIDIA RTX 4090 24GB, NVIDIA L40S 48GB | In the tensor cores — weights and cache |
| Hopper | NVIDIA H100 PCIe 80GB, NVIDIA H100 SXM5 80GB, NVIDIA H200 SXM5 141GB | In the tensor cores — weights and cache |
| Blackwell | NVIDIA RTX 5090 32GB, NVIDIA B200 SXM6 180GB | In the tensor cores — weights and cache |
That column describes the silicon, which is not quite the same question as where FP8 is a good idea. The catalogue's own note against the format names Hopper and Blackwell, and that is a statement about the serving stacks rather than the tensor cores: those are the generations on which FP8 kernels and FP8 caches have had the most use and the fewest surprises. Ada Lovelace will run it. Hopper and Blackwell are where we would put a deployment that depends on it.
One more thing worth knowing before you pick a card. Llama 3.3 70B in FP8 at 8k needs 81.9 GB, and an 80 GB card — the NVIDIA A100 PCIe among others — is 1.9 GB short of it. Not short enough to be obvious on a spreadsheet, and quite short enough to fail on the machine. The card that clears it on its own is the next one up, and the configurator will tell you which that is before you pay rather than after.
What it buys in speed
Generating a token means reading the active weights out of memory once. Fewer bytes per weight means fewer bytes to read, which means more tokens a second — and on a single un-batched stream that relationship is very nearly linear, because there is nothing else for the card to be waiting on. This is the same memory-bandwidth ceiling the cost-per-token guide divides by, and it is deliberately conservative. Below it is applied to a model small enough to run on every single-card machine we rent, so that the format and the card can be read off the same table.
| Card | Bandwidth | BF16 / FP16 | FP8 | 4-bit (AWQ, GPTQ) |
|---|---|---|---|---|
| NVIDIA L4 | 300 GB/s | ~ 8 tok/s | ~ 17 tok/s | ~ 34 tok/s |
| NVIDIA RTX A6000 | 768 GB/s | ~ 22 tok/s | ~ 43 tok/s | ~ 86 tok/s |
| NVIDIA L40S | 864 GB/s | ~ 24 tok/s | ~ 49 tok/s | ~ 97 tok/s |
| NVIDIA RTX 4090 | 1008 GB/s | ~ 28 tok/s | ~ 57 tok/s | ~ 113 tok/s |
| NVIDIA A100 PCIe | 1555 GB/s | ~ 44 tok/s | ~ 87 tok/s | ~ 175 tok/s |
| NVIDIA RTX 5090 | 1792 GB/s | ~ 50 tok/s | ~ 101 tok/s | ~ 202 tok/s |
| NVIDIA A100 PCIe | 1935 GB/s | ~ 54 tok/s | ~ 109 tok/s | ~ 218 tok/s |
| NVIDIA H100 PCIe | 2000 GB/s | ~ 56 tok/s | ~ 113 tok/s | ~ 225 tok/s |
Llama 3.1 8B on one card, one stream at a time. Every machine listed holds it in all three formats, so the rows are comparable across as well as down — and the ratio between the three columns is the same on every line, because it is set by the bytes per weight and nothing else.
Two cautions on reading that table. The first is that it describes one request at a time, and almost nobody serves one request at a time: under continuous batching the weights are read once for the whole batch, so the arithmetic rather than the memory becomes the limit and the ratio between the columns narrows. The second is that dequantising costs something. Four-bit weights must be unpacked before they are multiplied, and on a small model at low batch size that unpacking can eat a visible share of what the smaller read bought you. The direction of the table is reliable; the exact multiples are not a promise.
What it costs you
This is the part of the subject where confident numbers should be distrusted, including ours. Quantisation error depends on the model far more than on the method, and the published comparisons disagree with each other because they measure different models on different tasks. What can be said honestly is the shape of it.
FP8 is close enough to be uncontroversial. It is still a floating-point format — an exponent and a mantissa, with fewer bits of each — and not the integer grid a 4-bit checkpoint has to be mapped onto with per-group scales. That is why it degrades so gently, and why it needs no calibration pass. Most teams adopt it without running an evaluation and most of them get away with it.
Four-bit is a real trade, and it lands unevenly. The average benchmark score usually moves very little. What moves is the tail: long chains of reasoning, exact arithmetic, rare languages, strict output formats. A model that still scores well on a multiple-choice suite can start closing JSON incorrectly.
Bigger models absorb it better. Four-bit on a 70B is a routine deployment. Four-bit on an 8B, whose parameters each carry more, is where degradation gets noticed — and, per the table above, where it buys you least.
The calibration data matters more than the letters. AWQ and GPTQ both compress against a sample corpus. A checkpoint calibrated on English prose and used for code will be worse than the method deserves, and no benchmark table will tell you that.
Which leads to the only recommendation on this page that is not arithmetic: run both. You are renting a machine with root on it and no metered anything, so serving the same model twice on two ports and pushing your own hundred prompts through each costs an evening and settles the question for your workload rather than for someone else's. That is a materially better answer than any table, this one included — and it is the reason we would rather show you the formula than a score.
Which machine that means
The reason any of this matters is the invoice. Below is the cheapest machine in our catalogue that holds each model whole at 8k context, in each of the three formats — whole meaning on one card, without splitting it, because a model split across cards brings the interconnect into the question and that is a different guide.
| Model | BF16 / FP16 | FP8 | 4-bit (AWQ, GPTQ) |
|---|---|---|---|
| Llama 3.1 8B | NVIDIA L4 | NVIDIA L4 | NVIDIA L4 |
| Qwen 3 32B | NVIDIA A100 PCIe | NVIDIA RTX A6000 | NVIDIA L4 |
| Llama 3.3 70B | 4 × NVIDIA B200 SXM6 | 4 × NVIDIA H200 SXM5 | NVIDIA RTX A6000 |
At 8k context, on the machines we actually rent. Where a cell names several cards, that is the smallest node the card ships in and not a split model: the biggest cards are sold in fours and eights, so the cheapest way to avoid splitting a 70B at full precision is to buy four of them and use one. That is exactly the bill quantisation exists to avoid.
Two habits make the difference between using that table well and being caught out by it. Size at the context you will actually run, not at the model's maximum — the second table on this page is what happens to people who confuse the two. And check the format against the card before you order, not after: NVIDIA RTX A6000, NVIDIA A100 PCIe and NVIDIA A100 SXM4 cannot give you the FP8 numbers no matter which flag you pass. The configurator reports the memory required and whether it lands on one card, for every node and every format, before anything is paid. If what you are weighing is renting at all against paying an API by the token, that break-even is worked out separately, and quantisation moves it a long way in the hardware's favour.
Check the format and the machine together.
The configurator reports what your model needs at each precision, and which nodes hold it on a single card, before you pay anything.
Other guides
- Sizing · 10 min
Running a mixture-of-experts model
Total parameters decide the machine, active parameters decide the speed. What DeepSeek V3 and Qwen 3 235B need in VRAM, and which node to rent for them.
Read the guide - Cost · 6 min
When monthly rental beats per-hour
The break-even worked out on real numbers, the three costs an hourly price hides until the invoice, and the idle-time trap that triples an estimate.
Read the guide - Cost · 9 min
Self-hosting against a per-token API
The break-even between paying an API per token and renting a GPU, worked out on our own prices and throughput — and the four things the arithmetic leaves out.
Read the guide