Runbooks/LLM Inference RunbookTrack C · Shrinking the footprintRAG Runbook →0%
  1. 00 Start
  2. /
  3. 01 Tokens
  4. 02 Anatomy
  5. 03 Journey
  6. /
  7. 04 Hardware
  8. 05 Phases
  9. 06 KV cache
  10. /
  11. 07 Attention
  12. 08 Position
  13. 09 Precision
  14. 10 Cache ops
  15. /
  16. 11 Many GPUs
  17. 12 Engines
  18. 13 Decode loop
  19. /
  20. 14 Planning
  21. 15 Production
LLM Inference Runbook · Document 09 of 15 · Track C — Shrinking the footprint

Track C · Document 09 · Shrinking the footprint

Precision and Weight Quantisation

What the bits in a float actually buy, why the nominal bit width is never the real one, and which of five methods to reach for on which hardware.

Reads in about 25 minutes · 6 figures, one a live sizing calculator · 7 interview questions · prints to clean A4

What is in this document

  1. What a number format actually is
  2. What quantisation actually does
  3. The methods, one at a time
  4. What happens when the model runs
  5. Choosing, and measuring the damage
  6. Interview questions
  7. FAQ
  8. Cheat sheet

1 · What a number format actually is

Quantisation is usually explained without explaining what a float is, which turns the whole topic into memorisation. Two minutes here makes the rest obvious.

A floating-point number spends its bits on two things: range, how big or small the value can be, and precision, how finely it can be distinguished from its neighbours. Every format is a different split.

WHERE THE BITS GO · SIGN, EXPONENT (RANGE), MANTISSA (PRECISION) sign exponent — how big it can be mantissa — how precise it is unused / integer fp3232 bits823tf3219 bits810fp1616 bits510bf1616 bits87fp8 e4m38 bits43fp8 e5m28 bits52int88 bits8int44 bits4 Read the fp16 and bf16 rows together. Same sixteen bits, split differently: bf16 keeps fp32’s full range and gives up precision. That trade is far more forgiving during training, which is why published checkpoints are bf16 and why bf16 is the baseline everything else is compared against.

The two things bits buy are range and precision, and every format here is a different split between them. Quantisation is the same question asked once more: having given up precision, how do you spend what is left?

Why bf16 won, in one paragraph

fp16 has five exponent bits, which caps the largest representable value at about 65,500. During training, activations and gradients routinely exceed that, so fp16 needs loss scaling and careful handling. bf16 spends the same sixteen bits differently: eight exponent bits, the same as fp32, so the same enormous range — and only seven mantissa bits, so much less precision.

That turns out to be the right trade, because neural networks tolerate imprecision far better than they tolerate overflow. Which is why almost every published checkpoint ships in bf16, and why bf16 is the baseline every quantisation result is measured against.

The analogy

Two ways of writing down a measurement on a form with sixteen boxes. One scheme uses most of the boxes for decimal places — brilliant for anything between 0.001 and 100, and unable to write down a million at all. The other reserves boxes for an exponent — it can write anything from a trillionth to a trillion, but only to three significant figures. For measuring the same kind of thing over and over, the first is better. For measuring things whose magnitude you cannot predict, the second is the only one that works. Training is the second case.

2 · What quantisation actually does

Each weight is normally stored in sixteen bits. Quantisation stores it in eight, or four, or fewer. You obviously lose precision. The whole craft is in losing as little useful information as possible — and the mechanism that makes it work at all is the block scale.

WHY 4-BIT WEIGHTS WORK AT ALL · IT IS ENTIRELY ABOUT THE SCALE FACTOR you can only record heights using a ruler with 16 marks. Stretch it from 0 to 3 metres and everybody in a normal group rounds to the same value 0 m 3 m everyone lands between the same two marks. Useless. but look at the actual group first: they are all between 1.5 and 1.9 m. Fit the same 16 marks across just that band 1.5 m 1.9 m each person is now recorded quite accurately — same 16 marks, useful resolution the narrow band is a block — typically 32, 64 or 128 weights that sit together the note saying “1.5 to 1.9” is the scale factor, stored alongside it And here is the catch nobody mentions. That scale is stored too. A 16-bit scale and a 4-bit zero-point per 128 weights adds 0.16 bits to every weight — so “4-bit” is really 4.16, and mixed-precision recipes push it to 4.9. SMALLER BLOCKS, BETTER QUALITY, MORE OVERHEAD A block of 32 tracks the local range more tightly than a block of 128, and costs four times the scale overhead. That is the whole tuning dial in block quantisation, and it is why group_size is a flag you will see. 128 is the usual default and a reasonable place to leave it.
  1. With only 16 marks stretched from 0 to 3 metres, everybody in a normal group rounds to the same value. Useless.
  2. Look at the actual group first — they are all between 1.5 and 1.9 m — and fit the same 16 marks across just that band. Now each person is recorded accurately.
  3. The narrow band is a block, typically 32 to 128 weights that sit together. The note recording its range is the scale factor, stored alongside.
  4. The catch: the scale is stored too. A 16-bit scale and a 4-bit zero-point per 128 weights adds 0.16 bits to every weight, so “4-bit” is really 4.16 — and mixed-precision recipes reach 4.9.
  5. Smaller blocks track the local range more tightly and cost proportionally more overhead. That is the whole tuning dial, and 128 is the usual default.

Every block gets its own scale, which is why quantisation does not destroy the model. And every scale is stored, which is why the nominal bit width is never the real one.

The correction this document exists to make

The nominal bit width is never the real cost. A 4-bit format stores a scale — usually 16-bit — and often a zero-point, per block of 32 to 128 weights. And mixed-precision recipes keep sensitive tensors at higher precision.

So “13B at 4-bit is 6.5 GB” is wrong. AWQ or GPTQ at group size 128 is about 4.16 effective bits; GGUF Q4_K_M is about 4.9, which makes a 13B model roughly 7.9 GB rather than 6.5. That 20% gap is exactly the size of error that turns “it fits” into an out-of-memory failure on the first request.

NOMINAL BITS VS EFFECTIVE BITS · AND WHAT ACTUALLY FITS format nominal effective weights KV left users @8k THE CORRECTION WORTH CARRYING “13B at 4-bit is 6.5 GB” is the nominal payload only. The real Q4_K_M file is about 7.9 GB. A 20% underestimate is exactly the size of error that turns “it fits” into an out-of-memory failure on the first request. Size from the published file, or from effective bits, never from the nominal width.

Change the card. On a 24 GB A10 an 8B in bf16 leaves 1.8 GiB of cache — one user — and at 4-bit it leaves 14.4 GiB, which is fourteen. That is not a speed decision; it is the difference between a deployment and a demo.

3 · The methods, one at a time

Round-to-nearest has three weaknesses. Every named method is an attempt to fix one of them, and being able to say which is a far better answer than listing acronyms.

ROUND-TO-NEAREST — THE FLOOR EVERYTHING ELSE IS MEASURED AGAINST Take a block, find the largest magnitude in it, work out the scale, round everything to the nearest level. No sample data, seconds to run, works anywhere. needs no calibration data — it is pure arithmetic on the numbers and it has three weaknesses, which the next three tabs each attack 1 · It treats every weight as equally important. Some matter far more than others to the model’s output, and rounding them equally wastes the budget. 2 · It ignores what the weights get multiplied by. A small rounding error on a weight that meets a huge activation becomes a large error in the output. 3 · Errors compound. Dozens of layers in sequence, each one’s error feeding the next. Every named method below is an attempt to fix one of those three. Being able to say which one a method attacks is a much better answer than listing acronyms. GPTQ — ATTACKS PROBLEM 3, COMPOUNDING ERROR Feed the model a few hundred sample texts. Then go through the weights one at a time, and each time you round one, nudge the weights you have not done yet to compensate for the error you just introduced. round weight 1 adjust weights 2…n to compensate round weight 2 adjust weights 3…n … and so on The analogy. Arranging a group photo. When one person has to move slightly out of place, you shift the others a little so the overall picture still looks right. Works well, and it was the method that made 4-bit credible. Slow to produce, needs a GPU, and can overfit to the sample texts. Uses second-order information about the loss surface to decide the compensation, which is where the cost comes from — and what AWQ deliberately avoids. AWQ — ATTACKS PROBLEMS 1 AND 2, IMPORTANCE AND ACTIVATIONS Also uses sample texts, but asks a different question: which weights actually matter? And it answers by watching what flows through the model, not by looking at the weights. activation magnitude, by channel roughly 1% of channels carry unusually large signals — and a rounding error on a weight that meets one of those becomes a large output error The fix: scale those weights up before rounding, so they land where the ruler marks are useful, and scale the corresponding inputs down to keep the maths equivalent. WHY IT BECAME THE PRE-HOPPER DEFAULT Simpler than GPTQ, faster to produce, more robust to the calibration set, slightly better quality. It avoids the heavier second-order machinery entirely — the paper’s memorable framing is that not all weights matter equally, and you find the ones that do by looking at the activations. THE TWO DATA-FREE METHODS — AND THE ONE ORGANISING IDEA k-quants · the GGUF world Rather than one precision for the whole model, use different precisions for different parts. Attention and output tensors keep 5 or 6 bits; the bulky feed-forward blocks drop to 4. Q4_K_M is one such recipe — and it is why the effective width is 4.9, not 4.0. FP8 · the modern production answer Eight-bit floating point. The important part is that H100-class hardware multiplies it directly — there is no unpacking step, so it cuts operations as well as bytes stored and bytes moved. No sample data, conversion takes minutes, quality loss very small. THE ORGANISING IDEA — THERE ARE ONLY TWO FAMILIES Data-free methods do maths on the numbers: round-to-nearest, k-quants, fp8 casting. Calibration-based methods must run the model on sample text first: GPTQ, AWQ. That means a GPU and hours of work — and on a CPU-only machine only the first family is realistic. Formats are not interchangeable. The maths is universal; the file formats are not. You cannot hand a GGUF file to vLLM. Pick your serving tool first, then pick a format it accepts.

Four tabs, one question each. Round-to-nearest is the floor; GPTQ attacks compounding error; AWQ attacks importance and activation scale; k-quants attack it by spending bits unevenly across the model. FP8 sidesteps the whole discussion by having hardware support.

MethodCalibration?The idea, in one lineRuns onTypical use
Round-to-nearestNo Per-block scale from the largest magnitude, round everything to the nearest level AnythingThe baseline everywhere
GPTQYes Quantise weight by weight, adjusting the not-yet-quantised weights to compensate for each rounding error GPU, hoursOlder GPU servers
AWQYes Find the ~1% of channels carrying large activations and scale those weights up before rounding to protect them GPU, faster than GPTQThe pre-Hopper production default
k-quants (GGUF)No Mixed precision inside a layer — attention and output tensors keep more bits than the feed-forward CPU, Apple silicon, GPULaptops and local use
FP8No Cast to native 8-bit float; Hopper and later multiply it directly, with no unpacking H100 and newerThe modern production answer

AWQ’s framing is the one worth remembering

Not all weights matter equally, and you find the ones that do by looking at the activation distribution rather than at the weights themselves. Protecting roughly one per cent of channels recovers most of the quantisation error, and it avoids the heavier second-order machinery GPTQ uses — which is why it became the common enterprise fallback on pre-Hopper cards.

4 · What happens when the model runs

This is misunderstood constantly, and getting the direction right is a genuine signal.

THIS PART IS MISUNDERSTOOD CONSTANTLY, SO BE PRECISE Quantisation is a one-off, offline job. Somebody runs it once and publishes a smaller file. Same architecture, same layer count, same tokeniser — only the stored numbers differ. Serving it is just loading a smaller file. At run time, 4-bit weights stay 4-bit in VRAM for the entire session. They are never expanded back to full size in memory — that would defeat the whole point of quantising them. when a slice of weights is needed for a multiply, that slice is unpacked to 16-bit inside the chip’s on-chip memory, used, and thrown away 4-bit in HBM unpacked to 16-bit in SRAM multiplied discarded GET THE DIRECTION RIGHT It is the weights that get unpacked to 16-bit, not the activations. Activations were 16-bit the whole time. FP8 IS THE EXCEPTION TO ALL OF THIS On Hopper and later the silicon multiplies 8-bit floats natively. No unpacking step at all — which is why fp8 is both near-lossless and fast.
  1. Quantisation is a one-off, offline job producing a smaller file. Same architecture, same tokeniser; only the stored numbers differ.
  2. At run time, 4-bit weights stay 4-bit in VRAM for the whole session. They are never expanded back to full size in memory.
  3. When a slice is needed for a multiply it is unpacked to 16-bit inside on-chip memory, used, and discarded.
  4. It is the weights that get unpacked, not the activations — activations were 16-bit all along. And fp8 on Hopper-class hardware is the exception: multiplied natively, with no unpacking step.

The reason 4-bit weights cannot be multiplied directly is simply that the tensor cores have no 4-bit multiply path. FP8 is where the silicon caught up, and fp4 on Blackwell-class hardware is the same story one step further.

WeightsActivations
Where fromLearned during trainingCalculated from your input
Change?NeverEvery single request
Shared?Yes — one copy serves everyoneNo — yours alone
Quantised when?Offline, once, producing a new fileAt run time if at all, and it is much harder
AnalogyThe recipeThe ingredients

And the KV cache is the third thing

The KV cache is activations that you chose to keep. That is why quantising it is a runtime flag rather than an offline job, and why its error behaves differently: weight quantisation error is fixed and calibrated against once, but cache quantisation error accumulates over a generation, because a key quantised at token 10 is still being read at token 10,000.

Keeping those three straight — weights, activations, cache — makes half the confusing questions in this area evaporate. Document 10 covers the cache side.

5 · Choosing, and measuring the damage

PICK THE SERVING TOOL FIRST, THEN A FORMAT IT ACCEPTS — NOT THE OTHER WAY ROUND your situation use why H100 / H200 / Blackwell serverFP8 with vLLM or SGLangnative hardware support, near-lossless, no calibration, minutes to produceA100 or older data-centre GPUAWQ 4-bitno fp8 hardware, so this is the fallback. Robust and widely supportedOne consumer GPUAWQ, GPTQ or GGUFwhichever your serving tool accepts — that constraint usually decides itLaptop, no GPU, plenty of RAMGGUF Q4_K_M via llama.cppself-contained, no Python stack, genuinely runs on CPUMac with Apple siliconGGUFsame reason, and unified memory suits it wellQuality is the binding constraintbf16, or fp8 at mostand measure the drop on your own evaluation rather than trusting a general claimMemory is the binding constraintint4, and then a smaller modelbelow 4 effective bits, consider whether a smaller model at higher precision is better

Two ecosystems exist side by side and they do not mix: llama.cpp with GGUF (C++, self-contained, CPU-friendly) and the Python/CUDA world (vLLM, SGLang, AWQ, GPTQ, fp8). Choosing a format before choosing a server is the most common way to waste a week.

How to size the quality question honestly

The honest answer to “does quantisation make the model dumber” is: a little, it depends on the method and the bit width, and you measure it on your own workload rather than trusting a general claim. The published picture is that fp8 is nearly indistinguishable, good 4-bit methods lose a small but measurable amount, and very low bit widths degrade noticeably — but those are statements about aggregate benchmarks, not about your task.

What to actually do: take a fixed set of a few hundred real requests, run them against the bf16 model and the quantised one, and compare on whatever metric your product cares about — exact-match on extraction, a judge score on chat, pass rate on code. Then decide whether the memory is worth it. That is an afternoon, and it converts an argument into a number.

Two failure modes that are specific to quantisation

It degrades unevenly. Aggregate scores can hold up while one capability falls off a cliff — frequently long-context retrieval, multilingual output, or exact formatting. Test the slices you care about separately, not just the mean.

Below about 4 effective bits, ask a different question. At that point the honest comparison is not “4-bit versus 3-bit of this model” but “3-bit of this model versus a smaller model at higher precision”. Very often the smaller model at 8-bit wins on both quality and speed, and nobody checked because the question was framed as a quantisation decision.

6 · Interview questions

ArchitectWhat does quantisation actually do, and what does it cost?

It stores each weight in fewer bits — eight or four instead of sixteen — and the mechanism that makes it work is the block scale. You take a block of 32 to 128 weights that sit together, find their actual range, and fit the available levels across just that range. Without per-block scales you would be spreading sixteen levels across the whole dynamic range of the model and everything would round to the same value.

The cost is in two places. Quality, which is small for fp8, measurable for good 4-bit methods, and noticeable below that — and which you have to measure on your own workload rather than trust a general claim. And a bookkeeping cost that people forget: the scale is stored too. A 16-bit scale per 128 weights adds 0.16 bits to every weight, so “4-bit” is really 4.16, and a mixed recipe like Q4_K_M is 4.9. That is why a 13B Q4_K_M file is 7.9 GB and not the 6.5 GB the nominal arithmetic suggests.

ArchitectGPTQ or AWQ?

They attack different weaknesses of naive rounding. GPTQ attacks compounding error: it quantises weight by weight and nudges the not-yet-quantised weights to compensate for each rounding error it introduces — like shifting people in a group photo when one has to move. AWQ attacks importance: it watches the activations, finds the roughly one per cent of channels carrying unusually large signals, and scales those weights up before rounding so they land where the resolution is useful, scaling the inputs down to keep the maths equivalent.

In practice I would reach for AWQ on pre-Hopper hardware: it is simpler, faster to produce, more robust to the choice of calibration set, and slightly better in quality. GPTQ can overfit to its sample texts and uses heavier second-order machinery for the same job.

But the first question I would ask is what hardware we are on, because on H100 or later the answer is neither — it is fp8, which needs no calibration data at all, takes minutes, is near-lossless, and is multiplied natively by the silicon so it cuts operations as well as bytes.

ArchitectDoes a 4-bit model run four times faster?

No, and the reason is worth spelling out with the three-way test. Quantisation cuts bytes stored and bytes moved. It does not cut operations performed — except on hardware with native support for the format, which is fp8 on Hopper and fp4 on Blackwell.

Since decode is memory-bandwidth-bound, cutting bytes moved does speed it up, close to proportionally, at small batch. But two things blunt it. First, unpacking 4-bit weights to 16-bit for the multiply costs real work, so int4 kernels rarely hit the theoretical speedup. Second, and more importantly at scale, once the batch is large the KV cache is most of what you are reading — at 8k context and batch 64 the cache is 81% of the bytes — so shrinking the weights barely touches the total.

The honest framing: quantise the weights for capacity first, because freeing 7.5 GiB on an 8B directly buys concurrency. Treat the speed as a welcome secondary effect.

Eng managerCan we halve our GPU bill by quantising?

Possibly, and I would want to answer it with a measurement rather than a prediction, because the size of the win depends on which constraint we are actually under.

If we are memory-constrained — cache utilisation pinned, requests queueing for blocks — then yes, this is direct. Going from bf16 to fp8 on an 8B frees 7.5 GiB, which is 14% more KV budget and therefore 14% more users per card. Going to int4 frees 10.5 GiB. On a small card the effect is dramatic: an 8B in bf16 on a 24 GB A10 leaves room for one user; at int4 it leaves room for fourteen.

If we are compute-constrained or utilisation-constrained, much less. And I would put the alternative on the table at the same time, because it is often bigger: a half-idle expensive GPU costs the same as a busy one, so consolidating traffic onto fewer fuller machines frequently beats any quantisation gain. I would bring both numbers.

The cost side is a quality evaluation on real traffic and a rollback plan. fp8 is a low-risk change on Hopper; int4 is a real quality decision and I would want the evaluation before committing, not after.

ArchitectWhy can 4-bit weights not just be multiplied directly?

Because the tensor cores have no 4-bit multiply path. The weights stay 4-bit in HBM for the whole session — they are never expanded in memory, that would defeat the point — but when a slice is needed for a multiply it is unpacked to 16-bit inside on-chip memory, used, and discarded.

The direction matters and people get it backwards: it is the weights that get unpacked, not the activations. Activations were 16-bit all along.

fp8 is the exception on Hopper and later, where the silicon multiplies it natively with no unpacking step — which is exactly why fp8 is both near-lossless and genuinely fast, and why it became the enterprise default on new hardware. fp4 on Blackwell-class parts is the same story one step further.

ArchitectIs quantising the cache the same as quantising the weights?

Two separate things with different risk profiles. Quantising weights is an offline job producing a new file; quantising the KV cache is a runtime setting on the server. They stack — you can do both.

The risk differs because of where the error lives. Weight quantisation error is fixed: it is baked in once and you can calibrate against it. Cache quantisation error accumulates over a generation, because a key quantised at token 10 is still being read at token 10,000, and every subsequent token attends to it.

Practically that means 8-bit cache is generally safe and below that you should test on your own workload — and specifically test on long outputs, because a 200-token evaluation will not surface a problem that appears at 2,000.

Eng managerSomeone wants to run a 70B at 3-bit instead of an 8B at bf16. How do you evaluate that?

By insisting the comparison is run rather than argued, because both sides have a plausible story and the answer is empirical.

The memory arithmetic first: a 70B at roughly 3.9 effective bits is about 32 GiB of weights, which fits on one H100 with about 36 GiB left for cache — but the 70B costs 2.5 GiB per user at 8k against the 8B’s 1.0, so we would get roughly 14 concurrent users against 53. And single-stream decode would be about two and a half times slower, because the weight read is twice the size.

So the trade is quality against roughly 4× the concurrency and 2.5× the streaming speed. That is a big enough gap that I would want it settled by a head-to-head evaluation on a few hundred real requests, scored on whatever the product actually cares about — and I would want the per-slice breakdown, because heavy quantisation degrades unevenly and can hold up on aggregate while falling off a cliff on one capability. If the 70B at 3-bit does not clearly win on quality, the 8B wins on everything else.

7 · FAQ

Why is BF16 the format most weights ship in?

Same sixteen bits as fp16, split differently: eight exponent bits instead of five, so it has fp32’s dynamic range with less precision. Networks tolerate imprecision far better than overflow, so that trade is much more forgiving during training — and published checkpoints reflect what they were trained in.

Does quantisation make the model dumber?

A little, and how much depends on the method and the bit width. fp8 is nearly indistinguishable; good 4-bit methods lose a small measurable amount; very low widths degrade noticeably. The honest answer in an interview is that it is a trade you measure on your own workload rather than a general claim you quote.

Can I quantise a model myself?

Yes. Data-free methods like GGUF conversion or an fp8 cast run on an ordinary machine in minutes to hours. Calibration methods like GPTQ and AWQ need a GPU and can take many hours on a large model, because they have to run the model forward on sample text repeatedly.

Is quantisation the same as pruning or distillation?

No. Quantisation keeps every weight but stores each with fewer bits. Pruning removes weights entirely. Distillation trains a smaller, differently-shaped model to imitate a bigger one. Quantisation is the only one of the three that leaves the architecture untouched, which is why it is the only one that is an afternoon rather than a project.

What does “group size” control?

How many weights share one scale factor. Smaller groups track the local range more tightly, so quality is better, and cost proportionally more overhead — a group of 32 has four times the scale cost of a group of 128. 128 is the usual default and a reasonable place to leave it.

Why does loading a model take so long?

Most of it is reading tens of gigabytes off disk; disk is usually the bottleneck, not the GPU. Which is a real argument for quantisation that nobody makes: a 4-bit model is a quarter of the bytes to read, so cold start is roughly four times faster — and cold start is what makes autoscaling an LLM hard. That is document 15.

Can I mix formats — fp8 weights and an fp8 cache?

Yes, and you should think of them as independent levers that multiply. fp8 weights free memory that becomes KV budget; an fp8 cache halves what each user needs from that budget. Both are supported flags on modern servers. Just evaluate them separately, because their error modes differ.

What is SmoothQuant, and where does it fit?

It addresses the same activation-outlier problem AWQ does, but for activation quantisation rather than weight-only: it migrates the difficulty from activations into weights by rescaling both, so both can be quantised to 8 bits. Weight-only quantisation is far more common in serving because it is easier and captures most of the memory benefit; activation quantisation matters when you want the compute speedup too.

Why is my quantised model slower than expected?

Most likely the kernel. A quantised format only gets its speedup if the server has a fused kernel that reads the packed weights directly; a generic path that dequantises into a full-size buffer first gives you the memory saving and none of the speed. Check that the engine reports using the quantised kernel rather than a fallback — and be suspicious if throughput barely changed while memory did.

One sentence on when to quantise?

When memory is the binding constraint. If cache utilisation is pinned and requests are queueing for blocks, quantising the weights directly buys concurrency. If the card is half idle, quantisation is solving a problem you do not have and the win is in utilisation instead.

8 · Cheat sheet

bits buy two things exponent = range, mantissa = precision. bf16 keeps fp32’s eight exponent bits and gives up mantissa — which is why it won
how it works a per-block scale, typically over 32–128 weights, fits the available levels across the block’s actual range
effective bits nominal is never real. AWQ/GPTQ g128 ≈ 4.16 · Q4_K_M ≈ 4.90 · int8 ≈ 8.13. A 13B Q4_K_M file is ~7.9 GB, not 6.5
the five methods RTN (baseline) · GPTQ (compensates for compounding error) · AWQ (protects the ~1% of channels with big activations) · k-quants (mixed precision inside a layer) · fp8 (native hardware)
two families data-free (RTN, k-quants, fp8) · calibration-based (GPTQ, AWQ, which need a GPU and hours)
at run time 4-bit stays 4-bit in HBM; a slice is unpacked to 16-bit in on-chip memory for the multiply. It is the weights that unpack, not the activations
fp8 is the exception multiplied natively on Hopper and later, so it cuts operations as well as bytes stored and moved
weights vs cache weight error is fixed and calibratable; cache error accumulates over a generation. Test cache quantisation on long outputs
choosing H100+ → fp8 · A100 → AWQ · laptop → GGUF Q4_K_M. Pick the server first, then a format it accepts
below 4 effective bits change the question: a smaller model at higher precision often beats a large model at 3-bit, and almost nobody checks

The ninety-second version

“Quantisation stores each weight in fewer bits, and the thing that makes it work is the per-block scale: you fit the available levels across the actual range of 32 to 128 neighbouring weights rather than across the whole model. The scale is stored too, so the nominal width is never the real one — 4-bit is really 4.16 with AWQ at group size 128, or 4.9 for a mixed GGUF recipe. The methods each attack a different weakness of naive rounding: GPTQ compensates for compounding error, AWQ protects the one per cent of channels carrying large activations, k-quants spend bits unevenly across the model. On Hopper and later the answer is usually fp8, because the silicon multiplies it natively so there is no unpacking step, it needs no calibration data, and it is near-lossless. At run time the weights stay packed in memory and are unpacked to 16-bit inside the chip for each multiply — it is the weights that unpack, not the activations. And it cuts bytes stored and bytes moved, not operations, so quantise for capacity first and treat the speed as a bonus.”

Where this connects

Thread started herePicked up in
The 70% of parameters that quantisation is mostly quantising 02 · Inside the model
Why fp8 halves the bytes and doubles the peak, leaving the ridge batch unchanged 04 · The GPU and the roofline
Why weight quantisation stops helping once the cache dominates the read 05 · Prefill and decode
The memory freed, and what it becomes in the ladder 06 · The KV cache
Quantising the cache, the runtime lever that stacks on top of this 10 · Paging and prefix reuse
Which kernel actually gets used, and the flags that select it 12 · Serving engines
Faster cold start as a consequence of a smaller file 15 · Production

Questions to ask them