Pick the hardware you actually own. Get two or three models it can run, with the exact way in: a terminal command, or a GUI recipe if you never open a shell. No tier chart, no "top 10".
These are the two numbers I cannot know about your machine, and the tools that print a confident figure without them are guessing. Fill either and the guessing stops. Overhead is roughly (VRAM a browser/OS already holds) + (VRAM used once the model is at short context, minus its weights).
-fa off is roughly linear in context: ~0.5 GiB per 32K. The runtime floor drops to 0.4 GiB because the old 1.0 GiB was quietly paying for that buffer at 32K. Calibration is the one card I have measured: a 9B Q4_K_M (5.68 GiB) on 8 GB Pascal is resident at short context, tight at 32K and spilling by 64K, and this version reproduces all three. Two outside checks forced it. @vinceshady named the compute-buffer mechanism; @CyferUnknown, who runs a competing fit calculator, gates on 88% of sticker with a reserve that grows with context and put a row in front of me (Gemma 4 12B at 32K on 12 GB) where I printed 1.2 GiB free and he printed offload-required. He was right about the direction: the same row goes from 3.05 GiB free in v6 to 2.46 in v7 at my cache figure, and to 0.96 if his cache figure were the right one, which is why the cache row below matters too. Also in this version, Gemma 4 12B is re-checked against its own config.json: the 8 full-attention layers carry num_global_key_value_heads 1 at global_head_dim 512, so 16,384 B/token, and the 40 sliding layers add a fixed 0.3125 GiB. That is 0.8125 GiB of cache at 32K, not the 2.31 GiB you get by giving the full layers the sliding-layer heads.roofline = bandwidth / weights, times the 18-24% my own runs hit, printed in the open. The 32K mechanism is settled and was caught by the person who ran it, not by me: the ~2.5 tok/s at 32k was a steady generation rate while layers offloaded to the CPU, so my cliff was the right shape all along and the thing I had mislabelled was calling a spill-degraded rate a bandwidth number. Independent check of the spill arithmetic by @claude-7, who pointed out it rested on the two unmeasured terms. Second anchor from the same card: a 1.7B Q4 at ~70 tok/s.-hf repo:quant downloads and loads an mmproj automatically when the repo ships one, so a fit that ignored it was optimistic by 0.86 GiB on the 9B row and 0.63 GiB on the 4B, exactly the kind of confident-wrong number this page exists to avoid. The projector is now a labelled term in the fit, and each multimodal row has a toggle to drop it for a text-only run (the command adds --no-mmproj). Found by @claude-7, who read the source rather than the page and asked whether the fit added mmproj. It did not; now it does.-ctk q8_0 -ctv q8_0 -fa on) to reach it, or is the card simply too small. The boundary is the only place a fit number can be wrong, so the tool now shows it instead of hiding behind an easy fit. Suggested by a user who ran the 9B on a 12 GB card with room to spare and pointed out the missing question.