Quantization is the one lever in this part of the book that changes the answer to "does it fit?" rather than just "how fast?" — and it is the one where the back-of-envelope number is reliably wrong.
The envelope says: FP16 is two bytes per parameter, FP8 is one, INT4 is a half. Divide accordingly. VRAM sizing used exactly that arithmetic and said so. This chapter checks it against checkpoints you can actually download, and the arithmetic loses.
What the published weights actually weigh
Total bytes of the safetensors shards in each repository, against what the divide predicts:
| Qwen2.5-72B-Instruct | Real | Predicted | Over |
|---|---|---|---|
| BF16 | 135.43 GiB | 135.43 GiB | +0.0% |
| FP8 dynamic | 70.05 GiB | 67.71 GiB | +3.5% |
| INT8 (GPTQ) | 71.83 GiB | 67.71 GiB | +6.1% |
| INT4 (AWQ) | 38.74 GiB | 33.86 GiB | +14.4% |
| INT4 (GPTQ) | 38.76 GiB | 33.86 GiB | +14.5% |
| Qwen2.5-7B-Instruct | Real | Predicted | Over |
|---|---|---|---|
| BF16 | 14.19 GiB | 14.19 GiB | +0.0% |
| FP8 dynamic | 8.11 GiB | 7.09 GiB | +14.3% |
| INT8 (GPTQ) | 8.25 GiB | 7.09 GiB | +16.4% |
| INT4 (AWQ) | 5.19 GiB | 3.55 GiB | +46.3% |
The BF16 rows land exactly on prediction, which is the control: the method is sound and the discrepancy is real. Everything below FP16 misses, and the smaller model misses by three times as much.
The block that never quantizes
Look at the dtype map inside an INT4 checkpoint and it is not one dtype. The 72B AWQ file holds 70,464,307,200 parameters packed into I32 — and 2,493,554,688 left at F16.
That residue is not slack. For the 72B: vocabulary 152,064 × hidden 8,192 = 1,245,708,288 parameters in the embedding table, doubled to 2,491,416,576 because the output head is untied, leaving 2,138,112 for the layer norms. The three numbers add up to the F16 block exactly.
The embedding table, the output head, and the norms stay at full precision in every scheme measured here — AWQ, GPTQ and FP8 alike. They are the parts where rounding does visible damage, so quantizers leave them alone.
That fixed block is the whole story, because it does not scale with depth:
| Full-precision block | As a share of parameters | |
|---|---|---|
| Qwen2.5-72B | 2,493,554,688 | 3.4% |
| Qwen2.5-7B | 1,090,328,064 | 14.3% |
A 7B model carries 43.7% of the 72B's embedding block on 10.5% of its parameters. Vocabulary size is set by the tokenizer, not by the model's depth, so a small model drags a nearly full-size embedding table behind it. At INT4 that block is four times the per-parameter cost of everything around it, which is how +14.4% becomes +46.3%.
What the extra bytes cost you
Recompute the fit table from VRAM sizing with real checkpoint sizes. Qwen2.5-72B, 4K context, 1.25 GiB of KV cache per request, RunPod Secure Cloud rates. n is concurrent requests; the figure beside it is dollars per concurrent-request-hour:
| GPU | $/hr | BF16 | FP8 | INT8 | INT4 |
|---|---|---|---|---|---|
| A40 (48 GB) | $0.44 | — | — | — | 7 · $0.0629 |
| L40S (48 GB) | $0.99 | — | — | — | 7 · $0.1414 |
| A100 SXM (80 GB) | $1.49 | — | 7 · $0.2129 | 6 · $0.2483 | 33 · $0.0452 |
| H100 SXM (80 GB) | $2.99 | — | 7 · $0.4271 | 6 · $0.4983 | 33 · $0.0906 |
| H100 NVL (94 GB) | $3.19 | — | 19 · $0.1679 | 17 · $0.1876 | 44 · $0.0725 |
| RTX Pro 6000 (96 GB) | $1.99 | — | 20 · $0.0995 | 19 · $0.1047 | 45 · $0.0442 |
| H200 (141 GB) | $4.39 | 4 · $1.0975 | 56 · $0.0784 | 55 · $0.0798 | 81 · $0.0542 |
| B200 (180 GB) | $5.89 | 35 · $0.1683 | 87 · $0.0677 | 86 · $0.0685 | 113 · $0.0521 |
Three things fall out of that table.
The naive number plans for two users who do not exist. On an 80 GB H100 at FP8, dividing by two predicts 12.29 GiB free and nine concurrent requests. The real checkpoint leaves 9.95 GiB and seven — a plan set 28.6% above what the hardware delivers, measured against the seven you actually get.
INT8 fits fewer requests than FP8, 6 against 7, on identical hardware. GPTQ-Int8 is 71.83 GiB where FP8-dynamic is 70.05. Same nominal bit width, different real footprint, and the difference costs you a concurrent user.
INT4 moves the model down two rungs of the ladder. At 38.74 GiB it clears 48 GB for the first time, and an A40 at $0.44/hour serves the same seven concurrent requests as an H100 SXM at FP8 for 6.80× less — $0.0629 against $0.4271 per concurrent-request-hour. That is the largest single cost movement in Part 3, and it is a feasibility change, not a tuning change.
What it costs in quality
Qwen publishes the other half of the trade. Average across MMLU, C-Eval and IFEval:
| Model | BF16 | INT8 | INT4 (GPTQ) |
|---|---|---|---|
| Qwen2-72B-Instruct | 81.3 | 80.7 (−0.74%) | 81.2 (−0.12%) |
| Qwen2-7B-Instruct | 66.9 | 66.2 (−1.05%) | 64.1 (−4.19%) |
| Qwen2-1.5B-Instruct | 48.4 | 48.1 (−0.62%) | 45.0 (−7.02%) |
| Qwen2-0.5B-Instruct | 34.4 | 32.6 (−5.23%) | 29.7 (−13.66%) |
INT8 is close to free at every size — under 1.1% down on the three larger models. INT4 is free on the 72B and expensive on the 0.5B, a spread of 0.12% against 13.66%: the same model family, the same quantizer, a 111× difference in what it costs.
The asymmetry is the finding
Both measurements point the same way, and it is not the way the technique is usually pitched.
| 72B | 7B | 0.5B | |
|---|---|---|---|
| INT4 size overhead vs prediction | +14.4% | +46.3% | — |
| INT4 quality lost | −0.12% | −4.19% | −13.66% |
A small model shrinks less than you expect and degrades more than you expect. A large model does neither. Quantization is a large-model technique that gets recommended to people running small models, usually as a way to squeeze onto a cheap card — which is precisely the case where you pay twice and save least.
The correct reading is the opposite one: INT4 is how you run a 72B on hardware priced for a 7B. Going the other way — INT4 on a 7B to fit a smaller card — surrenders 4.19% of the model's quality to recover a fraction of 5 GiB you probably had.
What quantization does not buy
It does not raise MFU. The last chapter showed the numerator and denominator move together, so FP16 and FP8 come out identical to floating-point exactness. Fewer bytes per weight means faster decode; it does not mean a better-used chip.
It does not buy arithmetic on an H100 either. From NVIDIA's own table: FP8 Tensor Core 3,958 teraFLOPS, INT8 Tensor Core 3,958 TOPS, both marked "* With sparsity" — identical peak, so dense figures are 1,979 apiece. Choosing INT8 over FP8 on this generation buys nothing in throughput; it is a decision about tooling and accuracy alone. What both buy over BF16 is the 2× step from 1,979 down to 989.5 dense — and the bandwidth saving, which is the part that actually moves decode.
The diagnostic
- Read the file sizes, not the parameter count. Every claim in this chapter came from the byte totals of published shards. It takes one API call and it is the only number that is true.
- Check the dtype map for a full-precision residue. If a repository reports
F16orBF16alongsideI32, that block is your floor. Computevocab × hidden × 2and see whether it accounts for it. - Expect the overhead to scale inversely with model size. The smaller the model, the larger its vocabulary-to-hidden ratio — 152,064 over 3,584 on the 7B against 152,064 over 8,192 on the 72B — and the more of it sits in the block that will not shrink.
- Re-derive concurrency from the real weight size. Nine planned against seven delivered on an H100 is a 28.6% capacity error before you have served a request.
- Take INT8 almost anywhere; take INT4 on large models. Under 1.1% on the three larger models against 4–14% for INT4 below 7B.
- Do not quantize to raise utilisation. It raises throughput and capacity. Those are the wins; MFU is not among them.
What this chapter is not saying
It is not saying INT4 is safe because it was free on the 72B. One model family on three academic benchmarks is a signal, not a guarantee, and the published averages hide per-task variance that a production eval would surface. Run your own eval on your own task before you quantize anything you charge for.
It is saying that the two numbers everyone quotes about quantization — halve the bytes, lose a little accuracy — are both size-dependent in the same direction, and that nobody checks. The checkpoints are public. The check is one request.