Chapter 3.55 of 8 in this part

Quantization

Halving the precision does not halve the checkpoint. Measured on published INT4 weights, a 72B model comes out 14.4% larger than the arithmetic says and a 7B model 46.3% larger — because one block never quantizes. The same asymmetry runs through the quality loss, and it points the technique at the opposite end of the model range from where most people apply it.

9 min read·revised 2026-08-09

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

  1. 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.
  2. Check the dtype map for a full-precision residue. If a repository reports F16 or BF16 alongside I32, that block is your floor. Compute vocab × hidden × 2 and see whether it accounts for it.
  3. 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.
  4. 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.
  5. Take INT8 almost anywhere; take INT4 on large models. Under 1.1% on the three larger models against 4–14% for INT4 below 7B.
  6. 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.

Sources & methodcaptured 2026-08-09

Sources, captured 2026-08-09. Checkpoint sizes are the summed byte counts of the .safetensors shards reported by Hugging Face's model API (?blobs=true) for each repository — real files on a real CDN, not estimates: Qwen/Qwen2.5-72B-Instruct (37 shards, 145,412,519,312 bytes), -AWQ (11 shards, 41,595,756,104), -GPTQ-Int4 (11 shards, 41,621,048,632), -GPTQ-Int8 (20 shards, 77,128,453,816), and the 7B equivalents; FP8 figures are from RedHatAI/Qwen2.5-72B-Instruct-FP8-dynamic and -7B-, whose neuralmagic/ mirrors return byte-identical totals. Dtype maps (I32/F16/F8_E4M3 parameter counts) are the same API's safetensors.parameters field. Architecture constants — vocabulary 152,064, hidden 8,192 and 3,584 — are the config.json values used in VRAM sizing. Quality figures are Qwen's own published quantization benchmark (average of MMLU, C-Eval and IFEval). That table is for Qwen2, while the checkpoints sized above are Qwen2.5 — the vendor has not published the equivalent table for 2.5, and rather than substitute a near-match I have kept the generation labelled in the table and drawn no cross-generation conclusion. Peak FLOPS are NVIDIA's H100 specification table, whose FP8 and INT8 rows both read 3,958 under a "* With sparsity" footnote. Computed by me and verified in a separate pass: every predicted size, every over-prediction percentage, the embedding arithmetic and its exact reconciliation against the F16 block, the full-precision block shares, every free-space and concurrency count, every dollars-per-concurrent-request-hour figure, the 6.80× A40-versus-H100 ratio, the nine-versus-seven planning error, and all quality deltas. Inherited assumptions from VRAM sizing: vendor "GB" labels treated as GiB, activations unmodelled, no paged attention — so concurrency counts remain upper bounds. KV cache is assumed FP16 at all weight precisions. Cache quantization is a separate lever with its own quality cost and is not measured here. No inference-speed measurement appears in this chapter — the throughput half of the trade is bandwidth arithmetic and peak-FLOPS specification, not a benchmark I ran, and benchmarking tokens per second per dollar is where measured serving throughput belongs. The asymmetry framing and the diagnostic are mine.

Want this done on your account rather than by you?

The handbook is the method, written out in full so you can run it yourself — that is the point of publishing it. If you would rather someone else did the first pass, the teardown is free and you keep the findings either way.