LLM Sizer · how the numbers are made

Every number, and where it comes from

The tool is a calculator, not an oracle. This page has the questions people ask first, the full method with its constants, and the source behind every machine, benchmark row and factor.

Open the tool Open data (GitHub) Report a wrong number

Models as of 2026-09-05 · Machines 2026-09-02 · Benchmarks 2026-09-05 · Factors 2026-09-05 · Methodology v0.10.2 (2026-09-05)

Before you post the objection

Does it count the context window?

Yes. Every column has a context length (32K by default; 8K, 32K, 128K and 256K are one tap away, any number in Advanced), and the cell adds the context cache to the weights. The cache per token is read from each model's architecture: a conventional model caches every layer, models with sliding windows, linear-attention layers or compressed (latent) attention cache far less. That is why a 300-billion-parameter model can cost under 1 GB at 128K while a 27-billion dense model costs several. The formula is in section 5.

Can I see Q8 instead of Q4?

Yes. Each column has a quantization control (Q2 to Q8 buckets; the exact file labels in Advanced), and "All columns" changes every column at once. Q4 is the default because it is what most people run and what the reference tables use; Q8 roughly doubles the weights and rarely fits where Q4 was tight.

How fast will it write?

Every cell that fits shows an estimated writing speed in tokens per second. It is the inverse of a time per token: the time to read the bytes per token at the chip's effective bandwidth, plus a fixed cost per token for the chip and for the model's architecture, plus a small cost per token of context. The chip profiles are fitted to the community llama.cpp table, the architecture and runtime terms to measured runs, and the whole model is judged on runs it never saw. It is an estimate, labelled as one, with the profile's source next to it. The bands are: painful under 5 tok/s, usable under 12 tok/s, comfortable under 30 tok/s, fast under 60 tok/s, cloud-like above that. Details in section 6.1.

What about prefill, the wait before the first word?

Not yet. Reading your prompt is compute-bound, not bandwidth-bound, so it needs measured prefill rows per chip that do not exist for the newest Macs. It arrives as a separate column in v1.5 (see section 6.4). Until then, treat the writing speed as the number that matters for chat and agents, and expect prefill on long documents to be the pain point on any Mac.

What does the tool assume?

Eight things, all adjustable in Advanced except the first: memory sizes are binary gigabytes, so a 32 GB Mac has 34.4 GB in the units file sizes use; macOS keeps 6 GB, or the larger of 6 GB and 5.5 % of the memory once you lift the GPU limit; the work toggle reserves 16 GB for your own apps (off by default); macOS lets the GPU use two thirds of RAM under 36 GB and three quarters from 36 GB, unless you set the override; the context cache is stored at FP16, as every runtime does by default; buffers take 1.5 GB plus 1 % of the weights; MLX files set aside 0.15 GB per 1K tokens of context beyond 8K to process the prompt; a cell is "tight" under 10 % headroom. All of it is written out in section 4 and section 5.

Linux, PCs, older Macs?

Every Apple silicon Mac from the M1 onwards is in the catalog (12 current configurations, 33 older ones behind "older machines" in the picker), plus the NVIDIA DGX Spark. Any other machine can be typed in under Advanced with its memory and bandwidth, and the memory math is the same everywhere: only the reserves and the speed factor differ (section 7). A PC builder with graphics cards is planned for v2.

Which memory size makes sense?

The table answers that for the models you care about, so add them and read the rows: the first row where a column turns gold is the size to buy for that model. Or ask it the other way round: the "What can it run?" tile takes one machine at one memory size and lists every model with the best build that runs and the longest context it holds at Q4. Buying for one model? The "Which machine?" tile maps every current machine by memory size and estimated speed for it; set a minimum speed, a budget and laptop or desktop, and it names the cheapest configuration that qualifies. As a rule of thumb from today's featured models: 16 to 24 GB runs small models at short context, 32 GB runs a 27-billion dense model at Q4, 64 GB adds the mid-size mixture-of-experts models at lower precision, 128 GB runs them at Q4, 256 GB runs the 300-billion class, and 512 GB is where the 700-billion models start to fit. Re-check it whenever a model drops; the catalog updates nightly.

What is a ring?

A gold sphere means the model runs as asked with at least 10 % headroom. A ring means it runs with a compromise the cell has already chosen for you: close your apps, lift the macOS memory limit, shorten the context, or drop to a smaller build, in that order of preference. A cell that fits with under 10 % headroom is also a ring ("tight"). A grey dash means nothing at or above the quality floor fits even with every concession. Tap any cell for the reason, the memory bar and the fix. See How to read the table.

Why does it say my 32 GB Mac can't run a model I know fits?

Two reserves are probably on. A 32 GB Mac has 34.4 GB in file-size units; with the work toggle on it offers min(34.4 × ⅔, 34.4 − 6 − 16) = 12.4 GB to the model, because macOS keeps 6 GB and your apps keep 16 GB. Turn the toggle off and the two-thirds limit still caps the GPU at 22.9 GB. A 27-billion model at Q4 with a 32K context needs about 20.7 GB, so it fits in the second case (tight, at 90 %) and not the first. Tap the cell: the bar shows exactly which reserve is in the way, and the fix ("close your apps", "lift the memory limit") applies with one tap. The rules are in section 4.

Why is MLX faster than GGUF?

It is not always faster, and where it is, the gain is in the fixed cost per token rather than the read. Measured runs put MLX at 99 % of the fixed cost on dense models (a wash), about 50 % on small mixtures of experts on the M4 generation and newer (one measurement: 71 to 130 tok/s), 77 % on other mixtures, and 120 % on small mixtures on the M1 to M3 chips, where it is slower. Part of the dense "MLX lead" people report is llama.cpp's K-quant files reading about 25 % slower than plain formats on Metal. MLX also pays a long-context cost on top of the cache re-read: about 6.4 ms per token per 32K of context on the M1 to M4 chips, which is why llama.cpp catches up there at very long context, and about 0.8 ms on the M5 generation, whose GPU carries the neural accelerators (fitted on the M5 Max ladders; the M5 Ultra inherits it unmeasured). The switch is in the speed view; the factors and their sources are in section 6.2.

Why is the speed for the M5 Ultra (or the M6) an estimate?

Every speed is an estimate; some rest on measurements of that exact chip and some do not. 19 chips have measured rows in the benchmark data. The M5 Ultra has none yet, so its profile is an explicit assumption: 85 % of its 1,200 GB/s and 1.5 ms of fixed cost per token; the M6 uses the base-tier medians until someone measures one. The sheet says which case applies to your machine, and the profile table below lists every chip with its origin. If you have measured your Mac, send the number through the Feedback button; accepted rows enter the calibration data with your handle as the source.

How do I correct a number?

Use the Feedback button above the chart (it attaches your exact configuration) or open an issue on the open-data repository, which holds the machine catalog, the benchmark rows and the factors. Say what you measured or which source you are citing. Accepted corrections change the data or the formula and get a line in the changelog. The file-by-file recipe is in section 11.

The method

Rendered from the same file the open-data repository publishes as FORMULAS.md. Any change to a formula, constant or data source lands here first, with a changelog entry.

LLM Sizer — Methodology & Assumptions

Version 0.10.2 · 2026-09-05 · Status: public, early build. This is the public, plain-language explanation of every number LLM Sizer shows. It is the single source of truth: the tool’s About page renders it and the open-data repo’s FORMULAS.md is a nightly copy of it, and any change to a formula, constant, or data source in the tool must be reflected here first (that rule is part of the project’s definition of done). Comments and corrections: the feedback form in the tool, or an issue on the open-data repository. Changelog at the bottom.


1. What the tool answers — and what it doesn’t

LLM Sizer answers three questions for a machine you own or are considering: which open AI models fit in its memory, how fast they will write answers, and what you’d have to change to make a model fit. Every answer is a calculation from published data, calibrated against real measurements, and every estimate is labeled as one.

It does not run a benchmark on your machine, judge model quality (we show quantization-quality notes where quantizers publish them, nothing more), or cover image/video generation models (those are compute-bound and need a different method).

How to read the table

Machines are rows (one row per memory size, grouped by model line: “Mac mini · M6” covers the 16, 24 and 32 GB configurations), models are columns (one column per model at a chosen quantization and context length). Each cell is one of three marks:

  • Gold sphere: runs. The whole configuration fits in the memory available for AI with at least 10 % headroom. The sheet behind the cell says how much of the available memory it uses.
  • Gold ring: runs with a compromise. Something has to give, and the cell already picked the cheapest concession by our ranking (section 5): close the apps you reserved memory for, raise the macOS memory limit, shorten the context, or drop to a smaller build, in that order of preference. A cell that fits with under 10 % headroom is also a ring, labelled tight. The sheet lists the chosen fix, up to three alternatives (never “an earlier option plus something extra”), and applies any of them to the column with one tap.
  • Grey bar: doesn’t fit. Nothing at or above the quality floor (2-bit builds by label, adjustable in Advanced) fits even with every concession. The sheet shows the nearest miss: the smallest allowed build and how much memory it would still need.

Everything that configures the chart lives in the Settings panel (a column on the right on wide screens, a button above the chart on narrow ones): the machines and which of their memory sizes to show, the models (each column is one model at one build and one context, set when you add it and editable in the list, which you can also reorder by dragging), and two switches. “I’ll also use it for work” reserves 16 GB for your own apps (adjustable under Advanced); it is off by default, so the default table is the best case with nothing else running. “macOS memory limit” shows the share of RAM macOS lets the GPU use (67 % under 36 GB, 75 % from 36 GB); the sheet’s fix and Advanced can lift it to the override (section 4). The context cache is counted at FP16 by default, as every runtime stores it unless told otherwise (section 5). Speed numbers are always for the configuration that fits: a ring’s speed is the speed of its fix, not of the build you asked for. Column headers carry the model’s total and active parameters (“180B · 6B active” for a mixture-of-experts model), the build (Q4 by default) and the context length (32K by default). Five tiles above the chart switch between the fit table, the speed bars for one machine, the buying view (“Which machine?”), which places every current machine configuration on a map of memory size (rows) against estimated writing speed (x, shaded into the feels-like bands of section 6.5) for one model at one build and context, with a Q4 / Q8 switch on a shared axis, a minimum speed (any, 5, 12, 30 or 60 tok/s), and, from Settings, a budget, a laptop-or-desktop preference and the machine you already own; a configuration qualifies when it fits as asked, has a speed estimate at or above the minimum, costs no more than the budget and matches the preference, and the map names the cheapest qualifying configuration with a current list price on its mark and marks the machine you own (the owned machine is exempt from the budget and the preference because it is not being bought); a compromise is a ring at its fix’s speed and never qualifies, a machine that does not fit sits in a gutter and is never placed at a speed, a fit with no speed estimate never qualifies, an unpriced machine (a custom one, or a size Apple has not priced yet) is listed but never called cheapest, and when nothing qualifies a line under the map says so and names the nearest misses instead of inventing a pick; every mark opens the sheet, which carries the machine’s list price, the memory bar and the speed with its estimate detail on demand, the memory chart, which shows what each model needs at its build and context, split into weights, context cache, buffers and, for MLX files at long context, prompt scratch, with one machine’s limit drawn as a reference line, and the machine view (“What can it run?”), which takes one machine at one memory size and lists every model in the catalog, grouped by the size of its Q4 file (under 40 GB, 40 to 120, 120 to 256, 256 to 512, over 512), with its parameter count, the highest-quality build that runs as asked at 32K, the memory that configuration needs on the machine, and the longest context that runs at Q4; when nothing runs as asked it names the cheapest compromise or the nearest miss. “Show every build and context” turns each model into a table whose rows are the quantization buckets and whose columns are the context windows, with the same three marks and, under each, the speed and the memory needed; a build the model has no file for is shown as a gap, never as a substitute file.

Every table state is a link (?s=), the share image is rendered from the same math on the server, and a custom model or machine you type in travels inside the link so the person you send it to sees exactly your table.

Every number in the sheet behind a cell links to its source: the weights to the file’s repository on Hugging Face, the machine to its row in the sources table (bandwidth, prices, spec pages), the context cache and the available memory to the sections of this page that compute them, and the speed to the chip profile it used (effective bandwidth and fixed cost per token), with a sentence saying whether that profile was fitted from this chip’s own rows, assumed, or taken from the chip’s tier.

What kind of number is this

Every figure the tool shows is one of five kinds, and the sheet behind a cell says which:

  • Exact file data. Weight sizes are the bytes Hugging Face reports for the file you would download; machine memory and bandwidth are the makers’ specifications. Nothing is estimated.
  • Derived from the architecture. The context cache is computed from the model’s config.json (attention design, layers, heads) and the context length: exact for a design we can read, the pessimistic classic formula for one we cannot (“architecture assumed conventional”).
  • Fitted to measurements. Speed. Each chip’s effective bandwidth and fixed cost per token are fitted to the community llama.cpp table; the architecture and runtime terms are fitted to measured runs and judged on runs the fit never saw (section 6.1). Every fitted term carries the number of rows it rests on, and a term with too few rows is labelled assumed.
  • Quoted. A hand-maintained build’s published speed. It is shown as a note with its source, never as the cell’s number, because the publisher named a memory size but not the chip, runtime or context it was measured on.
  • Policy margins. The reserves for macOS and your apps, the working buffers and the MLX prompt scratch are safety margins chosen from owners’ observations, not measurements of your machine (sections 4 and 5). They are the numbers most worth arguing with, and section 8 says how far off they have been seen to be.

2. Words we use

  • Model / weights — the file you download. Its size is the single biggest number in every fit calculation.
  • Quantization (Q4, Q8, FP8, MLX 4-bit…) — storing the weights with fewer bits per number. Q4 ≈ 4.5 bits per weight and is the common local default; Q8 ≈ 8 bits and is near-lossless; FP8/BF16 are the “full” formats. Smaller quant = smaller file = faster, with some quality loss below Q4.
  • Context window — how much text the model can hold “in mind” at once (your prompt + its answer + any documents). Measured in tokens; 1 token ≈ ¾ of an English word.
  • Context cache (KV cache) — memory the model uses to remember the context while it works. It grows with the context length and is the part most fit charts ignore.
  • Unified memory — on Apple silicon (and boxes like the DGX Spark), CPU and GPU share one pool. A model must fit in the part the GPU is allowed to use.
  • Bandwidth (GB/s) — how fast the chip can read its own memory. It decides writing speed.
  • Tokens per second (tok/s) — how fast the answer appears. Decode = writing the answer; prefill = reading your prompt before the first word appears.
  • Active parameters — in mixture-of-experts (MoE) models only part of the model works on each token; that part is what gets re-read per word and what sets the speed.

3. Where the data comes from, and how fresh it is

DataSourceRefresh
Model weight sizes per quantizationThe exact file sizes published on Hugging Face by the quantizers people use (Unsloth, Bartowski, LM Studio community, mlx-community, and llama.cpp’s own ggml-org) and by the model makers, read through the Hugging Face APInightly
Model architecture (layers, attention type, experts, context maximum, MTP heads)Each model’s config.json on Hugging Face; a small hand-maintained overrides file for facts the config can’t express (license thresholds, “ships 4-bit only”, published active-parameter counts)nightly
Machines (memory options, bandwidth, GPU cores, prices)Apple’s and NVIDIA’s published specifications, with the source link per row; one row per chip bin where bandwidth differs (for example the M5 Max 32-core at 460 GB/s and 40-core at 614 GB/s)by hand, when products change
Measured speeds used for calibrationThe community llama.cpp Apple-silicon benchmark table (M1 → M5 Max, updated 2026-08-25), the llama.cpp maintainers’ DGX Spark benchmark (build b7941, February 2026), published MLX / MTP / DFlash measurements, and later community submissions through the toolas available; each row carries its source

How models get in. Every night a job lists what the five quantizer organisations above published or updated, finds the maker’s original repository for each (from the quantizer’s own “base model” note, otherwise by name), and reads that model’s config.json and file list. It keeps everything from the last twelve months that has at least a billion parameters and a thousand downloads; the ~25 featured models (hand-picked, current releases only) are always refreshed. Repositories that are edited variants — uncensored or “abliterated” builds, mixed-precision experiments, draft models — are skipped by name and logged. A model released today is normally in the tool tomorrow, with its real file sizes.

What can go wrong, and the safety net. Before new data goes live it is compared with what is live now: if a featured model lost its quantizations, a known file changed size by more than a tenth, a model’s architecture could suddenly not be read, or the catalog shrank, the update is held and a person looks at it. The page always shows the date of the data it is using. The full export (search index, one file per model, machines, benchmarks, factors, this document) is mirrored nightly to the public data repository.

4. How much memory is actually available for AI

Units first. Memory sizes are quoted in binary gigabytes: a “32 GB” Mac has 32 GiB, which is 34.4 GB in the decimal gigabytes file sizes use (× 1.0737). The tool converts the machine’s size before subtracting anything, so a 48 GB MacBook Pro is 51.5 GB, a 128 GB machine 137.4 GB, a 512 GB Studio 549.8 GB. The DGX Spark’s 128 GB is binary too.

Macs (Apple silicon). macOS does not let the GPU use all of the unified memory. By default it allows ⅔ on machines under 36 GB and ¾ from 36 GB: Metal’s recommended working set is logged at two thirds on 16 and 32 GB machines (10,922 and 21,845 MiB) and three quarters on 36, 48, 64 and 128 GB machines (28,991 / 38,655 / 49,152 / 98,304 MiB). Power users can raise this limit from Terminal (sudo sysctl iogpu.wired_limit_mb=…) — it works and it’s common, but it’s unsupported by Apple, so the tool treats it as an explicit toggle, off by default.

On top of that, the machine has to run macOS itself and — if it’s your everyday computer — your apps. We assume:

  • macOS base: 6 GB with the default GPU limit. Once the limit is lifted, macOS is the only reserve left and on big machines it keeps more: the larger of 6 GB and 5.5 % of the memory (a 512 GB Studio keeps about 30 GB, which is what owners running with the override report). A policy margin.
  • Your apps (the “I’ll also use this machine for work” toggle): a budget of 8 GB (light) / 16 GB (typical, the default when the toggle is on) / 24 GB (heavy) — a browser with many tabs alone is 5–7 GB. Adjustable in Advanced.
available = min( RAM × GPU-limit ,  RAM − 6 GB − apps )          default limit; RAM in decimal GB (nominal × 1.0737)
available = RAM − max( 6 GB , 5.5 % × RAM ) − apps                with the override

The min matters: on large machines the ¼ that macOS holds back already covers the OS and your apps; on small machines it doesn’t, and your apps become the real limit. Example: a 32 GB Mac mini (34.4 GB) used for work → min(34.4 × ⅔ = 22.9, 34.4 − 6 − 16 = 12.4)12.4 GB for AI; with nothing else running, 22.9 GB. That’s why a model that “fits 32 GB” on a spec sheet doesn’t fit a 32 GB machine you work on. Available memory by size, nothing else running: 16 GB → 11.2 · 24 → 17.2 · 32 → 22.9 · 36 → 29.0 · 48 → 38.7 · 64 → 51.5 · 128 → 103.1 · 256 → 206.2 · 512 → 412.3. With the override: 32 → 28.4 · 64 → 62.7 · 128 → 129.9 · 256 → 259.8 · 512 → 519.5.

Other platforms — see §7.

5. How much memory a model needs

needed = weights + context cache + working buffers + prompt scratch (MLX files above 8K of context)
  • Weights = the published file size of the quantization you picked (not an estimate).
  • Working buffers = 1.5 GB + 1 % of weights — activations and the runtime’s scratch space. A policy margin set from owners’ peak readings: about 1.1 GB above the file on a 17 GB dense model, about 0.4 GB above weights and cache on a 224 GB mixture-of-experts file (the earlier 5 % of weights rule charged that machine 11 GB).
  • Prompt scratch (MLX files only) = 0.15 GB per 1K tokens of context beyond 8K. MLX allocates working memory to process a long prompt in one pass, and owners’ peak readings grow at about that rate on a 27B and a 397B model between 8K and 128K (3.6 GB at 32K, 18 GB at 128K); GGUF runtimes process the prompt in batches inside the buffers. A policy margin; it is its own segment in the memory bar and follows the file that runs, so a GGUF fix on an MLX column drops it.
  • Context cache = bytes per token × context length. Bytes per token depends on the model’s attention design, which we read from its config:
Attention design (how we detect it)Cache per token, per attention layerTypical 128K cost
Classic grouped-query attention (default)2 × kv_heads × head_dim × bytestens of GB on big models
Partial-attention hybrids — only some layers keep a cache (layer_types lists linear/full layers, or full_attention_interval)classic formula on the attention layers only; linear layers keep a small constant stateQwen 3.8 27B: 16 of 64 layers → ≈ 8.7 GB at FP16 (4.4 GB with an 8-bit cache)
Compressed / latent attention (MLA: kv_lora_rank; DeepSeek V4: one 512-wide KV head)(latent_width + rope_width) × bytesGLM-5.2 (78 layers): ≈ 11.8 GB; DeepSeek V4 Flash: ≈ 6.5 GB; GLM-5.3 Flash: ≈ 1.5 GB (all FP16)
Sliding-window layers (sliding_window, Gemma-style)classic formula, but the window (e.g. 1,024 tokens) caps the lengthnegligible
Key = Value sharing (attention_k_eq_v, Gemma 4)no saving: one projection produces keys and values, but the runtime stores both; Gemma 4’s few global layers use their own wider heads (num_global_key_value_heads × global_head_dim)Gemma 4 26B-A4B: 5 global layers → ≈ 2.9 GB at 128K (1.4 GB with an 8-bit cache)

bytes is the cache precision: FP16 by default (2 bytes), which is what llama.cpp, LM Studio, Ollama and MLX store unless told otherwise; 8-bit (1 byte) or 4-bit (0.5) selectable in Advanced. Most 2026 models use compressed or hybrid attention, so long context is far cheaper than older fit charts assumed. Models whose design we can’t read from the config are marked “architecture assumed conventional” and use the classic formula — the pessimistic choice.

Verdicts:

  • Runs (solid dot) — needed ≤ 90 % of available.
  • Tight (ring) — it fits, but with under 10 % headroom: 90 % < needed ≤ 100 %. Real sessions grow; treat it as “will work, watch it.”
  • Runs with a compromise (ring) — the asked-for configuration doesn’t fit, but a change does, and the cell says which. The tool tries, alone and in combination: closing your work apps (only when the work toggle is on), the macOS memory-limit override (only on Macs, and only when the GPU limit is what binds), a shorter context (the next chips down: 128K → 32K → 8K), a smaller quantization of the same format, and any hand-maintained special build (below). Every combination that fits gets a cost — closing apps 1 · the override 2 · each context step 4 · a smaller quant 8 (9 under 3 bits) · a special build 16 · tightness ½ — and the cheapest wins; ties go to the higher-quality (more bits) and longer-context option. Up to three genuinely different alternatives are kept for the tooltip (“or: at 32K context instead of 128K”).
  • Doesn’t fit (dash) — nothing allowed fits at any context. The cell still explains itself: “the smallest allowed build, UD-IQ2_XXS (2-bit) at 711 GB, needs about 724 GB at 128K; this machine offers 520 GB at most.”

The quality floor. The automatic search never proposes a build under 2 bits per weight, judged by the file’s label (IQ1_* / Q1_* are out; IQ2_*, Q2_*, MLX-2bit are in). The label is used rather than the measured bits-per-weight because dynamic quantizations keep some tensors at higher precision — a 1-bit-labelled build of a large mixture-of-experts model reads as 2.3 effective bits. When only a sub-floor build would load, the dash says so (“a 1.3-bit build (466 GB) would load, quality unknown”); Advanced lets you lower the floor and pick such builds by hand.

Special builds. A few community builds are not plain quant files — Qwen 3.8 Flash Next’s 4-bit build keeps 45.8 GB in memory and pages its 51 GB n-gram table from SSD. Those are hand-maintained entries (resident size, source, and the measurement that justifies them) and appear in the search as their own compromise: “with the SSD-paged build (45.8 GB resident)”. Their speed is not estimated: the tool has no per-token read to reason from, and the publisher’s measurement (36 tok/s on a 64 GB MacBook Pro) names a memory size but not the chip, runtime or context, so it cannot be carried to any catalog machine. The sheet quotes it as a note with its source and shows no speed figure for the build.

6. Speed

6.1 Writing speed (decode) — the number that matters day to day

To write each token, the machine re-reads the model’s active weights plus the context cache, and then does a fixed amount of work that does not shrink with a smaller file: launching the kernels of every layer, routing between experts, attending over the context. The time per token is the sum of the two, and the speed is its inverse:

GB per token = active_params × bytes per weight (quant) + cache bytes per token × context length
ms per token = read + fixed + context
    read     = GB per token ÷ effective bandwidth × 1000 × read factor   (K-quant GGUF files on Apple silicon 1.25, everything else 1)
    fixed    = (chip fixed cost + architecture cost) × MLX factor         (GGUF files 1; section 6.2)
    context  = (attention cost + MLX attention cost) × context ÷ 32K
tok/s        = 1000 ÷ ms per token

Until version 0.8 the tool used bandwidth × efficiency ÷ GB per token, one efficiency factor per chip. That factor was calibrated on a 3.8 GB read (Llama-2-7B at Q4_0) and carried the fixed cost inside it, so it was wrong in both directions away from that size: models with a small active set (a 2 to 4 GB read per token) came out 1.5 to 3 times too fast, and 8-bit dense models on the Ultra chips 0.55 to 0.85 times too slow. The fixed-cost model separates the two.

Chip profiles are fitted, not assumed. For every chip, calibrate.py takes the F16, Q8_0 and Q4_0 rows of the community llama.cpp table (13.5, 7.2 and 3.8 GB reads of the same 7B model) and fits a straight line of milliseconds per token against gigabytes read: the slope is the effective bandwidth, the intercept the chip’s fixed cost. The effective bandwidth is stored as a share of the chip’s specification, because that share carries across the GPU bins of one chip (an M4 Max 32-core at 410 GB/s fits 0.88, the 40-core at 546 GB/s 0.90; an M3 Max 30-core 0.96 against the 40-core’s 0.98) while the GB/s does not.

ChipEffective bandwidthShare of specFixed costRows
M161 GB/s0.908.4 ms2
M1 Pro190 GB/s0.957.2 ms3
M1 Max363 GB/s0.916.4 ms6
M1 Ultra639 GB/s0.805.8 ms3
M294 GB/s0.945.3 ms3
M2 Pro191 GB/s0.955.8 ms3
M2 Max381 GB/s0.955.1 ms3
M2 Ultra700 GB/s0.885.0 ms3
M398 GB/s0.988.2 ms2
M3 Pro142 GB/s0.945.9 ms3
M3 Max390 GB/s0.985.2 ms3
M3 Ultra677 GB/s0.835.2 ms3
M4104 GB/s0.874.9 ms3
M4 Pro251 GB/s0.924.3 ms3
M4 Max494 GB/s0.904.2 ms3
M5148 GB/s0.975.8 ms2
M5 Pro309 GB/s1.012.6 ms3
M5 Max516 GB/s0.840.5 ms3
NVIDIA DGX Spark258 GB/s0.942.6 ms2

Two-row chips (M1, M3, M5, the Spark) have a line through two points and no slack; the rest fit within 2 % except the M1 Max (8 %, six rows from several machines) and the M5 Max (6 %). The Ultra chips read at 80 to 88 % of their specification: the multi-die design pays a consistent price. Tier medians stand in for chips without rows and are labelled “estimate — unmeasured”: base 0.94 / 5.8 ms, Pro 0.95 / 5.8 ms, Max 0.91 / 5.1 ms, Ultra 0.83 / 5.2 ms; M6 and M6 Pro take the base and Pro medians. The M5 Ultra is the one explicit assumption: 85 % of its 1,200 GB/s (the Ultra tier’s share) and 1.5 ms of fixed cost (between the M5 Pro’s 2.6 and the M5 Max’s 0.5), until a measured row exists. The chip name is matched without its GPU bin (M5 Max (40-core GPU)M5 Max); a platform without a profile (AMD ROCm boxes) gets no speed number rather than an invented one.

Architecture cost is the extra fixed time a model’s design adds per token, on top of the chip’s own. The class comes from the config: a dense model adds nothing; a mixture of experts adds its routing; one with linear-attention layers (the Qwen 3.5, 3.6 and 3.8 mixtures, Nemotron 3) adds those layers’ recurrent state; one with compressed (latent) attention (GLM-5.x, Kimi, DeepSeek-R1) adds the decompression; DeepSeek V4 is its own class, set by hand in the overrides file, because its FP4 experts and 512-wide attention measure far above the others. Each cost is the median over the measured GGUF rows of its class at short context, after the read and the chip’s fixed cost are subtracted:

ClassCost per tokenRowsRange of the rows
dense0 msby definition
mixture of experts1.7 ms160.0 – 4.4 ms
mixture of experts with linear-attention layers5.8 ms25.2 – 6.4 ms
mixture of experts with latent attention11.7 ms211.0 – 12.4 ms
DeepSeek V417.0 ms313.3 – 32.7 ms

Read factor. On Apple silicon, GGUF K-quant and IQ files (Q4_K_M, UD-Q4_K_XL, IQ2_M …) read about 25 % slower than the plain Q4_0, Q8_0, F16 and MXFP4 formats, because their dequantization is heavier on Metal. One dense row measures it (1.25, kept as an assumption until more rows exist), and it applies only on Apple silicon: no CUDA row measures it, so the Spark reads K-quants at the plain rate. MLX files read at the plain rate.

Context cost. Beyond the cache re-read (already in GB per token), attending over a long context costs time that does not show up in the bytes: 5 ms per token per 32K of context for latent-attention models (an assumption; see section 8 on the rows that could have fitted it), nothing for grouped-query attention, and on MLX a cost that depends on the chip generation: 6.4 ms per 32K on the M1 to M4 chips (fitted on 14 rows of the M3 Ultra and M1 Ultra sweeps to 128K) and 0.8 ms per 32K on the M5 generation (fitted on 4 rows of the oMLX M5 Max ladders to 64K; section 6.2). Because the cache is also in the read, speed visibly falls as the context grows: more for classic-attention models, less for hybrids, and more on the M1 to M4 chips than on the M5.

How the fit is judged. The terms above are fitted on the training split of validation.json (73 measured runs from the llama.cpp maintainers and eleven community contributors, each row with its source, grade and context length) by coordinate descent on medians, and judged on a held-out split the fit never saw: every Gemma 4 row and every row from the omlx benchmark site, split by submission so that a contributor’s sweep is never half in each. On the held-out rows the median error is a factor of 1.14 (90th percentile 1.29); the multiplier model scored 1.21 (90th percentile 2.66) on the same rows. On the training rows: 1.06 against 1.33. The release rule was a held-out median under 1.25 and no measured row getting worse than the multiplier by more than 1.30; both held. factors.json carries every term with its row count, range and source, and calibrate.py --report regenerates the row-by-row comparison. Chips whose profile is a tier median are flagged in the sheet.

6.2 Runtime: GGUF (llama.cpp / LM Studio) vs MLX

The baseline above is llama.cpp with a GGUF file. Apple’s MLX runtime (MLX files, used by LM Studio’s MLX engine, Ollama’s MLX backend, mlx-lm) changes the fixed cost per token, not the read: the measured gains sit where the fixed cost dominates (a 3B-active mixture of experts on an M4 Max: 71 → 130 tok/s) and vanish where the read dominates (8-bit files and big dense models: 0.96 to 1.2×), and on the M1 generation MLX is slower on mixtures (0.8×). So the tool multiplies the fixed cost by a factor per model group, fitted on the MLX rows of the training split:

Model type on MLXFixed-cost factorRowsEvidence
Dense0.995Qwen 27B and Qwen 32B on the M1 Ultra, M3 Ultra and M5 Max: MLX 4-bit lands where a plain Q4_0 would; its lead over Q4_K_M is the K-quant read factor, not an MLX bonus
Mixture of experts under 6B active, M4 and newer0.51, assumedQwen3.5-35B-A3B on the M4 Max: 71 → 130 tok/s
Mixture of experts under 6B active, M1 to M31.23Qwen3-30B-A3B on the M1 Ultra 83 → 68; gpt-oss-120b and Qwen3-Coder-Next on the M3 Ultra
Other mixtures of experts0.7710Qwen3.5-397B, Mixtral, Nemotron 3, GLM-5.2, Kimi K2.6 and DeepSeek V4 Flash on the M3 Ultra and M5 Max

Also: MLX files are 5–13 % smaller for the same nominal quant (the tool uses the actual MLX file size when you pick MLX), and MLX prefill is 30–40 % faster. Long context: on top of the cache re-read, MLX pays a cost per token per 32K of context that depends on the chip generation. On the M1 to M4 chips it is about 6.4 ms (fitted on the Qwen 32B and Qwen3.5-397B sweeps on the M3 Ultra and the Qwen 27B rows on the M1 Ultra, to 128K), which is why llama.cpp with flash attention catches up and passes MLX there somewhere past 30K tokens (on an M3 Ultra, MiniMax-M2.1 at 146K: MLX 6 tok/s against llama.cpp 12). On the M5 generation it is about 0.8 ms (fitted on the oMLX M5 Max ladders of Qwen 3.8 27B to 64K and Nemotron 3 Super at 32K, accelerations off): the same model that loses 55 % from 4K to 64K on the M3 Ultra loses 23 % on the M5 Max, and the difference beyond the cache read is what the M5 GPU’s neural accelerators remove. A chip whose generation the tool cannot read (a custom machine) is charged the pre-M5 cost. The M5 Ultra inherits the M5 value unmeasured, like the rest of its profile. The crossover falls out of the terms instead of the hard-coded 24K–36K fade of earlier versions.

6.3 Acceleration: MTP and draft models (DFlash / DSpark)

Some models can write several tokens per step. Two ways: MTP (multi-token-prediction heads built into the model — we detect them in the config) and draft models (a small helper model proposes a block of tokens the big model verifies in one pass; DFlash and DSpark drafts exist for many popular models — we find them on Hugging Face daily). Output is identical; only speed changes. The tool offers these only for models that actually have them, and shows the result as a range beside the baseline, never as the headline:

MethodFactorEvidence
MTP (native heads)1.6–2.6× (median 2.1)9B on M4 mini 14.4 → 23.0; Qwen 3.8 27B on M4 Pro 7 → 18.3 (MTPLX)
DFlash / DSpark draft, dense model2.0–3.6× (median 2.8)Qwen 3.8 27B 4-bit on M4 Pro 14.7 → 33.8; 8-bit 8.4 → 30.5; Gemma 4 12B 17.8 → 49.4; Qwen3-8B 13.7 → 45.8 (mlx-dspark, mlx-dflash)
DFlash / DSpark draft, MoE with under ~6B active1.1–1.3×Qwen3.6-35B-A3B 86.9 → 114.5 — little to gain when the model is already fast

These ranges are computed by calibrate.py from the paired rows in benchmarks.json (each accelerated row records the unaccelerated speed of the same setup), so they move as measurements are added.

Gains depend on the task (code and math accept longer drafts than chat) and on quant (8-bit targets accept more than 4-bit).

6.4 Reading speed (prefill) and time to first answer — v1.5

Prefill is limited by compute, not bandwidth. We calibrate it per chip from the measured pp512 rows of the same community table (M5 Max: 3,220 tok/s on a 7B model vs 886 on M4 Max — Apple’s neural accelerators are measurable), scaled by active parameters, and show time to first token for 8K / 32K / 128K prompts. Chips without measured prefill rows are labeled estimates.

6.5 “Feels like” — the translation next to every speed

tok/slabel
under 5painful — slower than reading
5–12usable for short answers
12–30comfortable chat
30–60fast — agents and coding feel fine
over 60cloud-like

7. Other machines: the same math, different facts

PlatformAvailable memorySpeed rule
Mac (unified)§4§6 with the chip’s own profile, or its tier’s
Prebuilt unified boxes (DGX Spark, AMD Halo)RAM (binary, converted) − ~8 GB for the OS and runtime; no Apple-style GPU limit; work-apps budget still appliesthe same fixed-cost model with the box’s own profile: the DGX Spark reads at 258 GB/s (94 % of its 273) with 2.6 ms of fixed cost, from two dense llama.cpp maintainer rows; the K-quant read factor is not applied on CUDA (unmeasured); ROCm has no profile, so no number is shown yet
Custom PC (cards × count + system RAM) — v2Σ VRAM − ~1 GB per card; system RAM only as slow overflow (flagged)slowest card’s bandwidth × factor — splitting a model across cards does not add writing speed; NVLink tensor-parallel gains (~1.3–1.6×) as an optional toggle
Mac clusters (Thunderbolt 5 / RDMA) — laterΣ pools − per-machine reservesper-machine speed, not summed; clustering helps prefill more than decode

One sentence to remember: memory adds up across cards and boxes; speed doesn’t.

8. Known limitations (read before arguing with a number)

  1. Everything speed-related is an estimate unless a measured row exists for exactly your chip, model, quant and runtime — then we show the measurement next to the estimate.
  2. Fits ≠ runs well. A model that loads at 2-bit, or crawls at long context, is running the way a car runs in first gear. Rings tell you the compromise.
  3. Sustained load is real. Long inference sessions run the GPU flat out; laptops get hot and may throttle. The tool doesn’t model thermals.
  4. The macOS limit override is unsupported by Apple; the tool defaults to the official behavior.
  5. Quantization quality varies by quantizer and method (dynamic “UD” quants keep more accuracy at the same size); we show quantizers’ own quality notes where published and don’t invent scores.
  6. MoE active parameters are computed from the config; makers’ published figures take precedence when they differ.
  7. Models newer than the data date aren’t in the tool yet; custom entries are the workaround.
  8. “Architecture assumed conventional” entries use the pessimistic classic cache formula until someone tags the architecture.
  9. Quick custom models (name, parameters, file size) get an assumed design: about 32 × (parameters ÷ 8B)^0.4 layers with 8 KV heads of 128, all caching. Enter the real fields in the full form for exact context math.
  10. Two-point chip profiles. The M1, M3, M5 and the DGX Spark have only two dense rows, so their line has no slack and no error estimate; the Spark’s rows are the maintainers’ own, the Macs’ come from one community table.
  11. Thin classes and one-row terms. The linear-attention and latent-attention mixture costs rest on two rows each, DeepSeek V4 on three (range 13 to 33 ms); the K-quant read factor and the MLX factor for small mixtures on M4 and newer rest on one row each and are labelled assumed; the latent-attention context cost is an assumption. These are the terms a single new measurement can move.
  12. The held-out rows cover no latent-attention mixture and no mixture on the Spark, so the 1.14 median is a statement about dense models, Gemma’s mixtures and the Spark’s small dense models; the oMLX M5 Max submissions that run past 8K moved from the held-out set to the training set in 0.10, because they are the only long-context M5 rows there are, which leaves 13 held-out rows. Every row came from a public post; none was measured under controlled conditions.
  13. Rows the model gets wrong by 2× or more. MiniMax-M2.1 at 30K and 146K of context (mlx-lm issue 763) runs at half the model’s prediction on both runtimes; Kimi K2.6 at 10K and 20K on a 512 GB Studio with a 440 GB build runs at a third and a fifth. Both look like memory pressure and are kept as report-only rows; a long-context term that catches them needs cleaner measurements.
  14. Memory margins are policy, and their residuals are known. Against owners’ peak readings, with every reading converted to decimal GB where its unit is known (oMLX reports binary gigabytes), the tool over-estimates by 0.5 to 1.4 GB on 17 to 30 GB dense GGUF files, by 0.3 to 1.7 GB on a 27B MLX file from 4K to 64K, by 1 to 5 GB on a 224 to 422 GB MLX file, and under-estimates a 31B GGUF file at 37K by 2.4 GB. Readings whose unit or method is not stated are kept as published and flagged in validation.json. Read a tight verdict with that in mind.
  15. Active parameters are the makers’ published counts where they exist. The config-derived estimate is the fallback, and it has been wrong by 2× on models whose configs hide the expert width (MiniMax M3) or use a latent expert dimension (Kimi K3); the overrides file carries the published figure and the reason. Every validation row must use the catalog’s own count and cache bytes (a test enforces it), so a passing fit says something about the live path.
  16. The M5-generation MLX context cost rests on four rows of two models on one machine. The 0.8 ms per 32K comes from the oMLX M5 Max ladders (Qwen 3.8 27B at 16K, 32K and 64K, Nemotron 3 Super at 32K), one contributor, accelerations off, and it is applied to every M5 and later chip, including the M5 Ultra, which nobody has measured yet. The pre-M5 value rests on the M3 Ultra and M1 Ultra alone. A long-context ladder on an M4 chip, or on an M5 Ultra once it ships, is the measurement that would settle which generation each value really belongs to.

9. Worked examples

All numbers below come from the live data (file sizes read from Hugging Face, factors from factors.json) and are reproduced by the engine’s tests.

A. 32 GB Mac mini (M6), Qwen 3.8 27B at Q4 (LM Studio’s Q4_K_M, 16.8 GB), 32K context. The machine has 34.4 GB in file-size units. Available with the default GPU limit = min(34.4 × ⅔, 34.4 − 6 − 0) = 22.9 GB. Needed = 16.8 (weights) + 2.2 (cache: 64 KB/token at FP16 × 32K, plus the hybrid layers’ constant state) + 1.7 (buffers: 1.5 GB + 1 %) = 20.7 GBtight at 90 %, a ring. Speed ≈ 6.5 tok/s (“usable”; the M6 has no measured row yet, so it uses the base-tier profile and carries the estimate label). Turn the work toggle on: available = min(22.9, 34.4 − 6 − 16) = 12.4 GB → the ring says “runs if you close your apps; tight”; the tooltip’s alternative is a 2-bit build that fits with the apps open.

B. 256 GB Mac Studio (M5 Ultra), GLM-5.3 Flash at Q4 (UD-Q4_K_XL, 199.7 GB), 128K context. Available with the default GPU limit = ¾ of 274.9 GB = 206.2 GB; needed = 199.7 + 1.5 (cache — compressed attention on 11 of 45 layers, FP16) + 3.5 (buffers) = 204.8 GBtight at 99 %, a ring. With the override, available = 274.9 − max(6, 15.1) = 259.8 GB → runs at 79 %; with the work toggle on as well (243.8 GB) it runs at 84 %. Speed on the M5 Ultra (assumed profile: 1,020 GB/s effective, 1.5 ms): 18B active × 4.97 effective bits ≈ 11.2 GB read per token at 8K → 13.8 ms read + 1.5 ms chip + 11.7 ms latent-attention mixture + 1.3 ms context ≈ 28 ms → ≈ 35 tok/s at 8K, ≈ 31 at 32K and ≈ 21 at 128K; with MLX the fixed part shrinks to 0.77× (≈ 39 tok/s at 8K); with its MTP heads, more again. The same model on a DGX Spark: 129.4 GB available after the 8 GB reserve; Q4 does not fit; the 3-bit build (UD-IQ3_XXS, 120.4 GB) fits tight at 96 %, at ≈ 15 tok/s (the Spark’s 258 GB/s effective and 2.6 ms, plus the same 11.7 ms architecture cost), and the 2-bit build (UD-Q2_K_XL, 108.7 GB) is the alternative at ≈ 16 tok/s.

C. 512 GB Mac Studio, GLM-5.2 at Q4 (UD-Q4_K_XL, 467.3 GB), 128K context, override on. Needed = 467.3 + 11.8 (cache — compressed attention, FP16) + 6.2 (buffers: 1.5 GB + 1 % of 467) = 485.2 GB; available = 549.8 − max(6, 30.2) = 519.5 GB → tight (93 %). Without the override (available 412.3 GB) the cheapest fix is the override itself; the alternative is the 3-bit build (UD-IQ3_S, 309 GB), which runs comfortably.

D. 256 GB Mac Studio, GLM-5.2, 128K. A ring: with the override (259.8 GB available) the 2-bit build UD-IQ2_M (238.6 GB) fits with its cache and buffers (254.2 GB) at 98 %, tight; the alternatives are the smaller 2-bit UD-IQ2_XXS, also tight, and a 32K context. Without the override nothing fits, so the fix is the override plus the 2-bit build.

E. 512 GB Mac Studio, Kimi K3 (2.8T parameters). A dash: the smallest 2-bit build is 711 GB and needs about 724 GB, against 520 GB at most with the override. Its 1.3-bit build (466 GB) would load at 92 % with the override, tight — quality unknown, and only if you lower the floor in Advanced.

F. 64 GB MacBook Pro (M5 Max), Qwen 3.8 Flash Next. The machine has 68.7 GB; three quarters of it is 51.5 GB. Every regular 2-bit-and-up build starts at 75 GB, so none fits. The hand-maintained SSD-paged build (45.8 GB resident) fits without the override: 45.8 + 0.9 + 2.0 = 48.6 GB → ring: “with the SSD-paged build; tight” (94 %), no speed figure: the publisher’s 36 tok/s on a 64 GB MacBook Pro is quoted as a note, because the chip, runtime and context of that measurement were not stated.

G. The buying map for Qwen 3.8 27B at Q4 (Q4_K_M), 32K, at least 12 tok/s. Every current configuration is evaluated as in A. With no minimum speed the cheapest that fits as asked is the 32 GB Mac mini (M6) at $1,299 (tight, ≈ 6.5 tok/s, estimate); at 12 tok/s or more it misses on speed, and the pick becomes the 48 GB Mac mini (M5 Pro) at $2,299 (≈ 13 tok/s, comfortable, 18 GB to spare), with the 64 GB M5 Pro mini ($2,699, 31 GB to spare) as the alternative with headroom; a laptop preference makes it the 48 GB MacBook Pro (M5 Pro) at $3,099. Under a $2,000 budget at 12 tok/s nothing qualifies: the card names the 48 GB mini as $299 over the budget, the 32 GB mini as too slow (≈ 6.5 tok/s), and the 24 GB M5 Pro mini as qualifying only with a change (the memory-limit override and 8K context). The 512 GB Studio fits at every setting but has no list price yet, so it is listed as qualifying without one and is never the pick.

10. Changelog

  • 0.10.2 — 2026-09-05. The buying map’s speed axis is numbered at the feels-like band edges (0, 5, 12, 30, 60 and the end of the axis) instead of round ticks, so every band’s border carries its number; the “cheapest that qualifies” and “yours” tags are measured with their labels, so a tag can no longer run into the memory-size column. No formula or constant changed.
  • 0.10.1 — 2026-09-05. The tool went public: the tool and this page are indexed, in the site map and in the site’s navigation (a phone menu was added for it). No formula or constant changed.
  • 0.10 — 2026-09-05. The MLX long-context cost is now per chip generation (sections 6.1 and 6.2): 6.4 ms per token per 32K on the M1 to M4 chips as before, 0.8 ms on the M5 generation, fitted on the oMLX M5 Max ladders. The old single value, fitted only on M3 Ultra and M1 Ultra sweeps, charged the M5 chips a penalty they do not show: the tool under-predicted the M5 Max by 17 to 21 % at 32K to 64K on MLX, and the M5 Ultra by about 45 % at 256K, so the Ultra-to-Max ratio at long context read 1.4× where the bandwidth ratio says 1.8×. The two oMLX M5 Max submissions that run past 8K moved to the training split to fit the new term (holdout 13 rows, median ×1.14, gate passed; train 79 rows, median ×1.05). Section 8 gains item 16 on how thin that fit is. Numbers at 32K and below, and every GGUF number, do not move.
  • 0.9.6 — 2026-09-05. The buying map after the founder’s first look: the “doesn’t fit” gutter is gone (a dash just left of the zero line, never on the speed axis); machines at the same speed get a label each, one under another (a joined label only past three or where nothing fits beside them); a legend above the map explains the five marks; the answer card and the list under the map are retired, the map itself names the cheapest qualifying configuration and the machine you own, and a single line says when nothing qualifies. The cell sheet is in sections: the list price first, the memory bar without the sentence that repeated it, the speed as a number with the feels-like phrase and the acceleration ceiling, the estimate’s provenance on hover and on demand, the sources on one line. No formula or constant changed.
  • 0.9.5 — 2026-09-05. “Which machine?” is now a buying map (section 1): every current machine configuration placed by memory size and estimated writing speed for one model at one build and context, a Q4 / Q8 / own-build switch on a shared axis, a minimum-speed line, and three new settings (a budget, laptop or desktop, the machine you own) that turn the marks into a recommendation with the rules written down: fits as asked, speed at or above the minimum, within the budget, matching the preference; a compromise is a ring at its fix’s speed and never qualifies; a machine that does not fit is never placed at a speed; an unpriced machine is never called cheapest; nothing qualifies is said plainly with the nearest misses. Worked example G. The share link gains the budget, the preference and the owned machine; links made before the map open it at its defaults. No formula or constant changed.
  • 0.9.4 — 2026-09-05. “What can it run?” tidied after a second look: the data columns are spaced apart and a row says one thing per column (a dash reads “Doesn’t fit”, the reason moves to the tooltip and the sheet); the whole row opens the sheet; size bands are headed in full (“40 to 120 GB at Q4 · 6 models”); the expanded table has a proper header (“Build” over the rows, “Context window” over the columns) and vertically centred row labels. No formula or constant changed.
  • 0.9.3 — 2026-09-05. “What can it run?” reworked after the founder’s first look: models are grouped by the size of their Q4 file instead of the catalog’s laptop / studio / frontier tiers; every row carries the parameter count and the memory the configuration in the row needs; the expanded view is a full-width table per model (rows = builds, columns = context windows, speed and memory under each mark) under a tinted header band that repeats the model’s summary, with a legend above the list. No formula or constant changed.
  • 0.9.2 — 2026-09-05. The fifth tile, “What can it run?”: one machine at one memory size against the whole catalog, best build first, expandable into every build and context (section 1). Any catalog machine can be picked, including older ones and the machines typed into Advanced; the assumptions in Settings apply as they do everywhere; a cell opens the same sheet, where only the global fixes (closing your apps, lifting the limit) can be applied because a build or context is a cell of the grid, and “Which machine do I need?” adds the model to the table at that build and context. The share image and presentation mode show the table for this view. A “Show benchmarks · coming soon” chip records interest through the notify card. No formula or constant changed.
  • 0.9.1 — 2026-09-05. Corrections from a second independent audit of the 0.9 release. A hand-maintained build’s published speed is no longer used as the cell’s number on any machine (it had been shown on every Apple machine with a 64 GB option); it is quoted as a note with its source, and the sheet’s file link now follows the build that fits. Active parameters: MiniMax M3 23B (was 49B, the config hides the expert width), Kimi K3 104B (was 165B, the experts work on a 3,584-wide latent), Qwen3-Coder-Next 3B (was 4.0B), Gemma 4 E4B 4.5B effective (was 8B: the per-layer embedding tables are lookups), each from the model card; the parser now reads a latent expert width and Gemma’s embedding tables itself. Validation data: four rows transcribed from the wrong context of one source corrected, memory readings now carry their published unit and metric with oMLX’s binary gigabytes converted (the 27B MLX residual at 64K is 1.7 GB, not 3.7), the file sizes of the mixture-of-experts memory rows added so the memory report covers every row, three readings taken at a configured rather than filled context moved to report-only, and a test that refuses a validation row whose active count or cache bytes differ from the catalog record. The re-fit moved no term: held-out median ×1.14, gate passed. Section 8: item 14 corrected, item 15 added.
  • 0.9 — 2026-09-05. The speed model is now a fixed-cost model: milliseconds per token = a read of the bytes per token at the chip’s effective bandwidth + a fixed cost (the chip’s, fitted from the F16/Q8_0/Q4_0 rows of the community table, plus an architecture-class cost fitted on measured runs) + a context term; tok/s is its inverse (section 6.1). MLX now scales the fixed cost by model group instead of multiplying the speed, GGUF K-quant files on Apple silicon carry a 1.25 read factor, and the MLX long-context penalty is a fitted term instead of a 24K–36K fade (section 6.2). Fitted on 73 measured runs and judged on 19 held-out ones: median error ×1.14 against ×1.21 for the multiplier model, with no row getting worse. What moves: mixtures of experts with a small active set lose the 1.5–3× the old model gave them (GLM-5.3 Flash on the M5 Ultra ≈ 35 tok/s, was 59; its 3-bit build on the Spark ≈ 15, was 25), 8-bit dense files on the Ultras gain, and the Mac-vs-Spark contrast on GLM-5.3 Flash shrinks from about 4× to about 2.3×. Memory margins became explicit policy (sections 4 and 5): buffers are 1.5 GB plus 1 % of the weights instead of 5 % capped at 16 GB (a 467 GB file is charged 6.2 GB, not 16), MLX files carry 0.15 GB of prompt scratch per 1K tokens beyond 8K as their own bar segment, and with the GPU limit lifted macOS keeps the larger of 6 GB and 5.5 % of the memory (30 GB on a 512 GB Studio). New subsection in section 1 on the five kinds of number. Worked examples rewritten: A is tight at 90 % (the buffers grew), B is tight at 99 % without the override, C at 93 %, E’s nearest miss is 724 against 520 GB. The aired-chart cross-check disagrees in 17 of 108 cells (the realistic chart’s 48 GB Qwen cell is tight at 92 %). Data: validation.json (120 measured speed and memory rows with sources, grades and the train/holdout split) joins the mirrored files; benchmarks.json gains the F16 and Q8_0 rows per chip (role floor-fit, outside the retired multiplier’s medians).
  • 0.8 — 2026-09-05. Verified defects from two independent audits against measured runs. Memory sizes are now converted from the binary gigabytes Apple and NVIDIA quote to the decimal gigabytes file sizes use before any reserve is subtracted (32 GB = 34.4 GB, 512 GB = 549.8 GB); the macOS GPU limit is ⅔ under 36 GB and ¾ from 36 GB, as Metal’s logged working set shows, not ¾ from 64 GB (36 and 48 GB Macs gain about a fifth of their usable memory). The context cache defaults to FP16, which is what every runtime stores unless told otherwise (it was 8-bit); Gemma 4’s shared key/value projection no longer halves the stored cache (26B-A4B ≈ 1.4 GB at 8-bit, 2.9 GB at FP16, was 0.7); a hand-maintained build’s measured speed is shown only on the machine class it was measured on. DGX Spark efficiency is 0.75 from five llama.cpp maintainer rows (build b7941); it was 0.40 from a single row that was recorded as a 40 GB Q4 llama.cpp run but was in fact LMSYS’s Llama 3.1 70B at FP8 under SGLang (kept in the data for provenance, excluded from calibration) — every Spark speed rises about 1.9×. Mistral Small 4’s active parameters are 6.5B per its model card (the config-derived estimate was 8.0B). Worked examples rewritten: the 256 GB Studio fits GLM-5.2’s 2-bit build with the override (D is a ring), the 64 GB MacBook Pro runs Flash Next’s SSD build without the override (F), the Spark fits GLM-5.3 Flash’s 3-bit build (B). The aired-chart cross-check now disagrees in 16 of 108 cells, none from a formula error. The MLX fade end is single-sourced at 36K (the data file said 30K).
  • 0.7 — 2026-09-04. The memory chart became “How much memory?”: absolute bars of what a configuration needs (weights + context cache + buffers), machine-independent, so the same model at two builds or two context lengths can be compared; one machine’s limit is a dashed reference line. No formula or constant changed.
  • 0.6 — 2026-09-03. The simple UI: all configuration moved into a settings panel (machines with tickable memory sizes, models as one-build-one-context columns, drag to reorder, the two switches, Advanced folded in); four chart tiles (fit table, speed, which machine, memory); the memory breakdown became a full chart; a Feedback button and a closable notify card replaced the forms under the table. Section 1’s reading guide updated. No formula or constant changed.
  • 0.5 — 2026-09-03. The About page (/tools/llm-sizer/about) renders this document with a FAQ and the sources behind every machine, benchmark row and factor; every number in a cell’s sheet now links to its source (section 1). Correction recipe by file (section 11). Colours inside the tool darkened for contrast (the video’s palette stays on the filming canvas). Cross-check against the charts that aired in the Apple-Macs video (2026-08-29), reproduced through the tool’s own table path and kept as a test: the tool disagrees in 14 of 108 cells, none from a formula error. The reasons: the chart drew “does not fit at Q4” as a dash where the tool shows the cheapest compromise as a ring (a 2-bit or 3-bit build, a shorter context, the memory-limit override, or closing your apps in the realistic chart); the chart assumed the three-quarters memory limit on a 32 GB Mac where macOS allows two thirds (Qwen 3.8 27B at Q4 + 128K needs 22.2 GB against 21.4); Qwen 3.8 Flash Next’s Q4 file is 119 GB (the n-gram table is inside it), not the ≈ 85 GB the chart assumed; GLM-5.3 Flash at Q4 needs the override on a 256 GB Studio once buffers count; GLM-5.2’s 2-bit build does not fit 256 GB with its cache and buffers, and on 512 GB it needs the override and lands at 97 % (tight, a ring); and the speed table’s flat 0.48 efficiency is now per chip (section 6.1). No formula or constant changed.
  • 0.4 — 2026-09-03. The app. New “How to read the table” subsection (section 1): the three marks, the two switches, tight cells as rings, speed shown for the configuration that fits, links and custom entries. Fix descriptions now separate the tight note with a semicolon instead of a dash; the alternatives list never contains a superset of an earlier alternative. No formula or constant changed.
  • 0.3 — 2026-09-02. The engine. Verdicts now have four states (runs / tight / compromise / doesn’t fit) with the fix search’s costs written down; the 2-bit quality floor (by label) and hand-maintained special builds added; MLX factor fades 24K → 36K instead of dropping at 30K; efficiency computed on active weights for mixture-of-experts benchmark rows (Ultra tier 0.44, M5 Ultra assumption 0.55); chip names matched without their GPU bin; ROCm machines get no speed number. Worked examples rewritten from the live data: Qwen Q4 is 16.8 GB (LM Studio’s file), GLM-5.3 Flash ≈ 59 tok/s at 8K on the M5 Ultra, its Q4 does not fit the DGX Spark (the 2-bit build runs ≈ 17 tok/s), GLM-5.2 on 256 GB is a dash once buffers are counted, Kimi K3 and Flash Next examples added.
  • 0.2 — 2026-09-02. Data pipeline built. Section 3 now describes how models are discovered (five quantizer organisations, twelve-month window, featured list, name-based exclusions) and the publish-time safety net. Efficiency constants are now generated by calibrate.py from benchmarks.json into factors.json (tier medians 0.79 / 0.74 / 0.63 / 0.45 / 0.40; measured chips use their own value, M5 Max 0.82); M5 Ultra documented as an explicit 0.57 assumption. Acceleration ranges computed from paired rows. Gemma 4 cache corrected to its global-layer heads (≈ 0.7 GB at 128K, not 1.3). Machines catalog: one row per bandwidth bin (M5 Max 460 vs 614 GB/s; M6 mini 153 GB/s at 16 GB vs 170 at 24/32 GB). Spark speed in example B corrected from ~14 to ~11 tok/s.
  • 0.1 — 2026-09-02. First draft, written from the Phase 0 research spike: efficiency by chip tier from the community llama.cpp table (M1–M5 Max), context-cache formulas by attention design read from model configs, MLX runtime factors from 2026 community reports, MTP/DFlash factors from MTPLX and mlx-dspark measurements.

11. How to correct us

Use the feedback form in the tool (it attaches your exact configuration) or open an issue on the open-data repository, ideally with: machine, model, quant, context, runtime, and the number you measured. Accepted measurements go into the calibration data with your handle as the source, and the relevant row above changes with a changelog entry.

File by file (the canonical copies of machines.json, benchmarks.json and models.overrides.json live in the tool’s repository and are mirrored to the open-data repository every night; propose a change as an issue or pull request there and it lands in the tool):

  • A machine fact (memory options, bandwidth, price, status): edit the row in machines.json and add the page you are citing to its sources.
  • A speed you measured: add a row to benchmarks.json with chip, bandwidth_gbs, memory_gb, model, quant, weights_gb (decimal GB; active_weights_gb too for a mixture-of-experts model), runtime (llama.cpp-gguf, mlx, or another runtime’s name — only llama.cpp rows calibrate the efficiency), accel (none, mtp, dflash, dflash2, dspark), tg (writing tokens per second), pp (prefill, optional), source (a public link), date, and where you have them build (the runtime build) and context_tokens (tokens already in context when you measured); accelerated rows also carry baseline_tg, the same setup without the acceleration; rows meant for the chip-profile fit (F16, Q8_0 and Q4_0 reads of one dense model at short context) carry role: "floor-fit". A measurement of a whole configuration (a model at a quant, runtime and context, with tokens per second or peak memory) goes into validation.json with a grade (A: the maintainers’ or a reproducible tool’s number; B: a community post with the setup stated; C: a headline number) and a split (train, holdout, or report for rows the fit must not learn from); a memory reading also records the number as published, its unit (binary or decimal gigabytes, or unknown) and what was measured (allocator peak, process footprint, a configured context), and the row’s active count and cache bytes must be the catalog’s. Do not edit factors.json: it is regenerated from the rows.
  • A model fact the Hugging Face API cannot express (a published active-parameter count, a licence threshold, a hand-maintained build): models.overrides.json.
  • A formula or constant: open an issue. FORMULAS.md is a nightly copy of this document and is not edited in the data repository.

Sources

The three hand-maintained data files, row by row. The model records themselves come from the Hugging Face API nightly; each cell links to the repository of the file it counted.

Machines

One row per chip and bandwidth bin. Prices are Apple's and NVIDIA's list prices at the data date; unpriced sizes were not yet on sale.

MachineMemoryBandwidthPricesStatusSourcesNotes
MacBook Air · M1 8 / 16 GB 68 GB/s discontinued · 2020 support.apple.com, en.wikipedia.org Apple's tech-specs page does not state M1 bandwidth; 68.25 GB/s (128-bit LPDDR4X-4266) per Wikipedia, rounded to 68. 7-core and 8-core GPU bins share the same memory system.
MacBook Air · M2 8 / 16 / 24 GB 100 GB/s discontinued · 2022 support.apple.com, support.apple.com 13-inch launched 2022; 15-inch (10-core GPU only) added 2023. Ports are Thunderbolt/USB 4 rated at Thunderbolt 3 speeds (40Gb/s).
MacBook Air · M3 8 / 16 / 24 GB 100 GB/s discontinued · 2024 support.apple.com, support.apple.com 13-inch and 15-inch, both March 2024. 15-inch is 10-core GPU only. Thunderbolt/USB 4 ports at Thunderbolt 3 speeds.
MacBook Air · M4 16 / 24 / 32 GB 120 GB/s discontinued · 2025 support.apple.com Replaced by the M5 MacBook Air on 2026-03-11; no longer sold new by Apple.
MacBook Air · M5 16 / 24 / 32 GB 153 GB/s 16 GB $1,299 · 24 GB $1,499 · 32 GB $1,699 current · 2026 support.apple.com, support.apple.com, apple.com, apple.com Announced 2026-03-03, available 2026-03-11. Prices reflect Apple's 2026-06-25 US price increase (13-inch base rose from $1,099 to $1,299; base storage 512GB). 8-core GPU bin is sold with 16GB only in the US store; 24/32GB require the 10-core GPU bin. 15-inch is 10-core GPU only, from $1,499.
MacBook Pro · M1 8 / 16 GB 68 GB/s discontinued · 2020 support.apple.com, en.wikipedia.org 13-inch only. Apple's tech-specs page does not state M1 bandwidth; 68.25 GB/s (128-bit LPDDR4X-4266) per Wikipedia, rounded to 68.
MacBook Pro · M1 Pro 16 / 32 GB 200 GB/s discontinued · 2021 support.apple.com, support.apple.com 14-inch and 16-inch (2021). Apple states 200GB/s; Wikipedia lists the theoretical 204.8GB/s.
MacBook Pro · M1 Max 32 / 64 GB 400 GB/s discontinued · 2021 support.apple.com, support.apple.com 24-core and 32-core GPU bins share 400GB/s (stated on the 16-inch tech-specs page). Wikipedia lists the theoretical 409.6GB/s.
MacBook Pro · M2 8 / 16 / 24 GB 100 GB/s discontinued · 2022 support.apple.com 13-inch only (last Touch Bar model). Thunderbolt/USB 4 ports at Thunderbolt 3 speeds.
MacBook Pro · M2 Pro 16 / 32 GB 200 GB/s discontinued · 2023 support.apple.com, support.apple.com 14-inch and 16-inch (Jan 2023). 16-inch ships with the 19-core GPU bin.
MacBook Pro · M2 Max 32 / 64 / 96 GB 400 GB/s discontinued · 2023 support.apple.com, support.apple.com 96GB only with the 38-core GPU bin; both bins share 400GB/s.
MacBook Pro · M3 8 / 16 / 24 GB 100 GB/s discontinued · 2023 support.apple.com 14-inch only (Nov 2023). Two Thunderbolt/USB 4 ports at Thunderbolt 3 speeds.
MacBook Pro · M3 Pro 18 / 36 GB 150 GB/s discontinued · 2023 support.apple.com, support.apple.com 14-inch 14-core GPU bin is 18GB only; 36GB requires the 18-core GPU bin. 16-inch is 18-core GPU only.
MacBook Pro · M3 Max (30-core GPU) 36 / 96 GB 300 GB/s discontinued · 2023 support.apple.com, support.apple.com 14-core CPU / 30-core GPU bin: 36GB or 96GB, 300GB/s. Distinct bandwidth from the 40-core bin.
MacBook Pro · M3 Max (40-core GPU) 48 / 64 / 128 GB 400 GB/s discontinued · 2023 support.apple.com, support.apple.com 16-core CPU / 40-core GPU bin: 48GB, 64GB or 128GB, 400GB/s.
MacBook Pro · M4 16 / 24 / 32 GB 120 GB/s discontinued · 2024 support.apple.com 14-inch only. Replaced by the M5 14-inch in Oct 2025.
MacBook Pro · M4 Pro 24 / 48 GB 273 GB/s discontinued · 2024 support.apple.com, support.apple.com MacBook Pro M4 Pro topped out at 48GB (the Mac mini M4 Pro offered 64GB). 16-inch is 20-core GPU only.
MacBook Pro · M4 Max (32-core GPU) 36 GB 410 GB/s discontinued · 2024 support.apple.com, support.apple.com 14-core CPU / 32-core GPU bin: 36GB only, 410GB/s.
MacBook Pro · M4 Max (40-core GPU) 48 / 64 / 128 GB 546 GB/s discontinued · 2024 support.apple.com, support.apple.com 16-core CPU / 40-core GPU bin: 48GB, 64GB or 128GB, 546GB/s.
MacBook Pro · M5 16 / 24 / 32 GB 153 GB/s 16 GB $1,999 · 24 GB $2,199 · 32 GB $2,399 current · 2025 support.apple.com, apple.com, apple.com 14-inch only (Oct 2025). Prices reflect the 2026-06-25 US increase (from $1,599 to $1,999 base) and a 1TB base SSD; memory +$200 per step per Apple's configurator on 2026-09-02.
MacBook Pro · M5 Pro 24 / 48 / 64 GB 307 GB/s 24 GB $2,499 · 48 GB $3,099 · 64 GB $3,699 current · 2026 support.apple.com, support.apple.com, apple.com, apple.com Announced 2026-03-03. 64GB requires the 18-core CPU / 20-core GPU bin (cheapest 64GB = 14-inch 20-core, 1TB, $3,699). 16-inch is 20-core GPU only, from $2,999. Post-June-2026 prices from Apple's US configurator.
MacBook Pro · M5 Max (32-core GPU) 36 GB 460 GB/s 36 GB $4,099 current · 2026 support.apple.com, support.apple.com, apple.com, apple.com Apple lists 460GB/s for the 32-core GPU bin (not 614GB/s, which is the 40-core bin). 36GB only; base SSD 2TB. Price = 14-inch, post-June-2026 US price.
MacBook Pro · M5 Max (40-core GPU) 48 / 64 / 128 GB 614 GB/s 48 GB $4,699 · 64 GB $5,099 · 128 GB $6,699 current · 2026 support.apple.com, support.apple.com, apple.com 40-core GPU bin: 48/64/128GB at 614GB/s. On the 14-inch it is a build-to-order upgrade from the 32-core model (+$300 GPU, +$300 for the required 36->48GB step); 64GB +$400 and 128GB +$2,000 over 48GB. 16-inch 48GB stock model is $4,999.
Mac mini · M1 8 / 16 GB 68 GB/s discontinued · 2020 support.apple.com, en.wikipedia.org Apple's tech-specs page does not state M1 bandwidth; 68.25 GB/s (128-bit LPDDR4X-4266) per Wikipedia, rounded to 68.
Mac mini · M2 8 / 16 / 24 GB 100 GB/s discontinued · 2023 support.apple.com Two Thunderbolt 4 ports on the M2 model.
Mac mini · M2 Pro 16 / 32 GB 200 GB/s discontinued · 2023 support.apple.com Four Thunderbolt 4 ports on the M2 Pro model.
Mac mini · M4 16 / 24 / 32 GB 120 GB/s discontinued · 2024 support.apple.com Removed from Apple's store on 2026-08-25 when the M6 Mac mini was announced.
Mac mini · M4 Pro 24 / 48 / 64 GB 273 GB/s discontinued · 2024 support.apple.com Removed from Apple's store on 2026-08-25 when the M5 Pro Mac mini was announced.
Mac mini · M6 (16 GB) 16 GB 153 GB/s 16 GB $899 current · 2026 apple.com, apple.com, apple.com 16 GB configuration: Apple lists 153 GB/s memory bandwidth (170 GB/s for 24/32 GB). Thunderbolt 4.
Mac mini · M6 (24/32 GB) 24 / 32 GB 170 GB/s 24 GB $1,099 · 32 GB $1,299 current · 2026 apple.com, apple.com, apple.com 24/32 GB configurations: 170 GB/s (16 GB is 153 GB/s). Thunderbolt 4.
Mac mini · M5 Pro 24 / 48 / 64 GB 307 GB/s 24 GB $1,699 · 48 GB $2,299 · 64 GB $2,699 current · 2026 apple.com, apple.com, apple.com Announced 2026-08-25; ships 2026-09-22. 48GB +$600 and 64GB +$1,000 over the $1,699 base (available on both the 16-core and 20-core GPU bins in the Mac mini).
Mac Studio · M1 Max 32 / 64 GB 400 GB/s discontinued · 2022 support.apple.com Both GPU bins share 400GB/s.
Mac Studio · M1 Ultra 64 / 128 GB 800 GB/s discontinued · 2022 support.apple.com Apple states 800GB/s; Wikipedia lists the theoretical 819.2GB/s.
Mac Studio · M2 Max 32 / 64 / 96 GB 400 GB/s discontinued · 2023 support.apple.com 96GB only with the 38-core GPU bin.
Mac Studio · M2 Ultra 64 / 128 / 192 GB 800 GB/s discontinued · 2023 support.apple.com Both GPU bins share 800GB/s.
Mac Studio · M4 Max (32-core GPU) 36 GB 410 GB/s discontinued · 2025 support.apple.com 14-core CPU / 32-core GPU bin: 36GB only, 410GB/s. Removed from Apple's store on 2026-08-25.
Mac Studio · M4 Max (40-core GPU) 48 / 64 / 128 GB 546 GB/s discontinued · 2025 support.apple.com 16-core CPU / 40-core GPU bin: 48/64/128GB, 546GB/s. Removed from Apple's store on 2026-08-25.
Mac Studio · M3 Ultra 96 / 256 / 512 GB 819 GB/s discontinued · 2025 support.apple.com Apple states 819GB/s for both GPU bins. 512GB required the 32-core CPU / 80-core GPU bin. Removed from Apple's store on 2026-08-25.
Mac Studio · M5 Max (32-core GPU) 36 GB 460 GB/s 36 GB $2,499 current · 2026 apple.com, apple.com, apple.com Announced 2026-08-25; ships 2026-09-22. Apple lists 460GB/s for the 32-core GPU bin; 36GB only.
Mac Studio · M5 Max (40-core GPU) 48 / 64 / 128 GB 614 GB/s 48 GB $3,099 · 64 GB $3,499 · 128 GB $5,099 current · 2026 apple.com, apple.com, apple.com Announced 2026-08-25; ships 2026-09-22. 40-core GPU bin is +$300 over the base and requires the 48GB step (+$300); 64GB +$400 and 128GB +$2,000 over 48GB (Apple US configurator, 2026-09-02).
Mac Studio · M5 Ultra 96 / 256 / 512 GB 1.2 TB/s 96 GB $5,499 · 256 GB $9,499 · 512 GB — current · 2026 apple.com, apple.com, apple.com, apple.com Announced 2026-08-25; ships 2026-09-22. Apple states 1.2TB/s for both the 64-core and 80-core GPU bins (Wikipedia: 1228.8GB/s theoretical). 256GB is +$4,000 on either bin; 80-core GPU bin is +$1,300. 512GB requires the 36-core CPU / 80-core GPU bin, ships late October 2026 and is unpriced as of 2026-09-02.
iMac · M1 8 / 16 GB 68 GB/s discontinued · 2021 support.apple.com, en.wikipedia.org 24-inch. Apple's tech-specs page does not state M1 bandwidth; 68.25 GB/s (128-bit LPDDR4X-4266) per Wikipedia, rounded to 68.
iMac · M3 8 / 16 / 24 GB 100 GB/s discontinued · 2023 support.apple.com, support.apple.com 24-inch, two-port (8-core GPU) and four-port (10-core GPU) models. Thunderbolt/USB 4 ports at Thunderbolt 3 speeds.
iMac · M4 16 / 24 / 32 GB 120 GB/s 16 GB $1,499 · 24 GB $1,699 · 32 GB $2,099 current · 2024 support.apple.com, apple.com, apple.com 24-inch. Still Apple's current iMac on 2026-09-02 (no M5/M6 iMac shipped yet). Prices reflect the 2026-06-25 US increase (base from $1,299 to $1,499). 32GB requires the 10-core GPU model ($1,699 + $400) and showed as 'currently unavailable' in the US configurator on 2026-09-02; 24GB is +$200 on the 8-core model.
Mac Pro · M2 Ultra 64 / 128 / 192 GB 800 GB/s discontinued · 2023 support.apple.com Tower and rack. Discontinued by Apple on 2026-03-26 with no successor announced.
NVIDIA DGX Spark · GB10 Grace Blackwell 128 GB 273 GB/s 128 GB $4,699 current · 2025 nvidia.com, marketplace.nvidia.com 128GB LPDDR5x coherent unified memory, 273GB/s. gpu_cores is CUDA cores (6,144), not Apple-style GPU cores. ConnectX-7 200Gb/s lets two units pair. Launched 2025-10-15 at $3,999; NVIDIA raised the price to $4,699 on 2026-02-23. Partner variants (ASUS, Dell, HP, Lenovo etc.) are priced separately. GB10 GPU has 6,144 CUDA cores (not comparable to Apple GPU core counts).

Benchmark rows

Measured tokens per second the efficiency and acceleration factors are calibrated on. "Baseline" is the same setup without the acceleration.

ChipModelQuantRuntimeAccelerationWriting tok/sPrefill tok/sDateSource
M1 Llama-2-7B Q4_0 llama.cpp-gguf none 14.15 117.96 2026-08-25 github.com
M1 Pro Llama-2-7B Q4_0 llama.cpp-gguf none 36.41 266.25 2026-08-25 github.com
M1 Max Llama-2-7B Q4_0 llama.cpp-gguf none 61.19 530.06 2026-08-25 github.com
M1 Ultra Llama-2-7B Q4_0 llama.cpp-gguf none 83.73 1030.04 2026-08-25 github.com
M2 Llama-2-7B Q4_0 llama.cpp-gguf none 21.91 179.57 2026-08-25 github.com
M2 Pro Llama-2-7B Q4_0 llama.cpp-gguf none 38.86 341.19 2026-08-25 github.com
M2 Max Llama-2-7B Q4_0 llama.cpp-gguf none 65.95 671.31 2026-08-25 github.com
M2 Ultra Llama-2-7B Q4_0 llama.cpp-gguf none 94.27 1238.48 2026-08-25 github.com
M3 Llama-2-7B Q4_0 llama.cpp-gguf none 21.34 186.75 2026-08-25 github.com
M3 Pro Llama-2-7B Q4_0 llama.cpp-gguf none 30.74 341.67 2026-08-25 github.com
M3 Max Llama-2-7B Q4_0 llama.cpp-gguf none 66.31 759.7 2026-08-25 github.com
M3 Ultra Llama-2-7B Q4_0 llama.cpp-gguf none 92.14 1471.24 2026-08-25 github.comtable quotes 800 GB/s; the catalog's spec is 819 and the floor fit takes its ratio against the catalog
M3 Ultra Llama-2-7B Q8_0 llama.cpp-gguf none 63.93 1487.51 2026-08-25 github.comtable quotes 800 GB/s; the catalog's spec is 819 and the floor fit takes its ratio against the catalog
M4 Llama-2-7B Q4_0 llama.cpp-gguf none 24.11 221.29 2026-08-25 github.com
M4 Pro Llama-2-7B Q4_0 llama.cpp-gguf none 50.74 439.78 2026-08-25 github.com
M4 Max Llama-2-7B Q4_0 llama.cpp-gguf none 83.06 885.68 2026-08-25 github.com
M4 Max Llama-2-7B Q8_0 llama.cpp-gguf none 54.05 891.94 2026-08-25 github.com
M5 Llama-2-7B Q4_0 llama.cpp-gguf none 31.88 722.79 2026-08-25 github.comM5 rows measured on commit c1d0e7a
M5 Pro Llama-2-7B Q4_0 llama.cpp-gguf none 66.33 1620.64 2026-08-25 github.com
M5 Max Llama-2-7B Q4_0 llama.cpp-gguf none 119.92 3219.99 2026-08-25 github.com
M5 Max Llama-2-7B Q8_0 llama.cpp-gguf none 72.42 3143.81 2026-08-25 github.com
M5 Max Llama-2-7B F16 llama.cpp-gguf none 37.11 3158.49 2026-08-25 github.com
M1 Llama-2-7B Q8_0 llama.cpp-gguf none 7.91 117.25 2026-08-25 github.comcommit 8e672ef
M1 Pro Llama-2-7B F16 llama.cpp-gguf none 12.75 302.14 2026-08-25 github.comcommit 8e672ef
M1 Pro Llama-2-7B Q8_0 llama.cpp-gguf none 22.34 270.37 2026-08-25 github.comcommit 8e672ef
M1 Max Llama-2-7B F16 llama.cpp-gguf none 23.03 599.53 2026-08-25 github.comcommit 8e672ef
M1 Max Llama-2-7B Q8_0 llama.cpp-gguf none 40.2 537.37 2026-08-25 github.comcommit 8e672ef
M1 Ultra Llama-2-7B F16 llama.cpp-gguf none 37.01 1168.89 2026-08-25 github.comcommit 8e672ef
M1 Ultra Llama-2-7B Q8_0 llama.cpp-gguf none 59.87 1042.95 2026-08-25 github.comcommit 8e672ef
M2 Llama-2-7B F16 llama.cpp-gguf none 6.72 201.34 2026-08-25 github.comcommit 8e672ef
M2 Llama-2-7B Q8_0 llama.cpp-gguf none 12.21 181.4 2026-08-25 github.comcommit 8e672ef
M2 Pro Llama-2-7B F16 llama.cpp-gguf none 13.06 384.38 2026-08-25 github.comcommit 8e672ef
M2 Pro Llama-2-7B Q8_0 llama.cpp-gguf none 23.01 344.5 2026-08-25 github.comcommit 8e672ef
M2 Max Llama-2-7B F16 llama.cpp-gguf none 24.65 755.67 2026-08-25 github.comcommit 8e672ef
M2 Max Llama-2-7B Q8_0 llama.cpp-gguf none 41.83 677.91 2026-08-25 github.comcommit 8e672ef
M2 Ultra Llama-2-7B F16 llama.cpp-gguf none 41.02 1401.85 2026-08-25 github.comcommit 8e672ef
M2 Ultra Llama-2-7B Q8_0 llama.cpp-gguf none 66.64 1248.59 2026-08-25 github.comcommit 8e672ef
M3 Llama-2-7B Q8_0 llama.cpp-gguf none 12.27 187.52 2026-08-25 github.comcommit 8e672ef
M3 Pro Llama-2-7B F16 llama.cpp-gguf none 9.89 357.45 2026-08-25 github.comcommit 8e672ef
M3 Pro Llama-2-7B Q8_0 llama.cpp-gguf none 17.53 344.66 2026-08-25 github.comcommit 8e672ef
M3 Max Llama-2-7B F16 llama.cpp-gguf none 25.09 779.17 2026-08-25 github.comcommit 8e672ef
M3 Max Llama-2-7B Q8_0 llama.cpp-gguf none 42.75 757.64 2026-08-25 github.comcommit 8e672ef
M3 Ultra Llama-2-7B F16 llama.cpp-gguf none 39.78 1538.34 2026-08-25 github.comcommit 8e672ef
M4 Llama-2-7B F16 llama.cpp-gguf none 7.43 230.18 2026-08-25 github.comcommit 8e672ef
M4 Llama-2-7B Q8_0 llama.cpp-gguf none 13.54 223.64 2026-08-25 github.comcommit 8e672ef
M4 Pro Llama-2-7B F16 llama.cpp-gguf none 17.18 464.48 2026-08-25 github.comcommit 8e672ef
M4 Pro Llama-2-7B Q8_0 llama.cpp-gguf none 30.69 449.62 2026-08-25 github.comcommit 8e672ef
M4 Max Llama-2-7B F16 llama.cpp-gguf none 31.64 922.83 2026-08-25 github.comcommit 8e672ef
M5 Llama-2-7B Q8_0 llama.cpp-gguf none 18.42 715.42 2026-08-25 github.comM5 rows measured on commit c1d0e7a
M5 Pro Llama-2-7B F16 llama.cpp-gguf none 21.55 1588.78 2026-08-25 github.comM5 rows measured on commit c1d0e7a
M5 Pro Llama-2-7B Q8_0 llama.cpp-gguf none 38.92 1553.86 2026-08-25 github.comM5 rows measured on commit c1d0e7a
M4 Max Llama-2-7B F16 llama.cpp-gguf none 24.29 736.25 2026-08-25 github.com32-core GPU bin; commit 8e672ef
M4 Max Llama-2-7B Q8_0 llama.cpp-gguf none 43.87 2026-08-25 github.com32-core GPU bin; commit 8e672ef
M4 Max Llama-2-7B Q4_0 llama.cpp-gguf none 69.95 713.93 2026-08-25 github.com32-core GPU bin; commit 8e672ef
M3 Max Llama-2-7B F16 llama.cpp-gguf none 19.54 589.41 2026-08-25 github.com30-core GPU bin; commit 8e672ef
M3 Max Llama-2-7B Q8_0 llama.cpp-gguf none 34.3 2026-08-25 github.com30-core GPU bin; commit 8e672ef
M3 Max Llama-2-7B Q4_0 llama.cpp-gguf none 56.58 567.59 2026-08-25 github.com30-core GPU bin; commit 8e672ef
M1 Max Llama-2-7B F16 llama.cpp-gguf none 22.55 453.03 2026-08-25 github.com24-core GPU bin; commit 8e672ef
M1 Max Llama-2-7B Q8_0 llama.cpp-gguf none 37.81 2026-08-25 github.com24-core GPU bin; commit 8e672ef
M1 Max Llama-2-7B Q4_0 llama.cpp-gguf none 54.61 400.26 2026-08-25 github.com24-core GPU bin; commit 8e672ef
M3 Ultra DeepSeek-R1-671B (37B active) Q4 llama.cpp-gguf none 17.5 2025-03 macrumors.comDave2D run; 448GB wired-limit override required
DGX Spark Llama 3.1 70B FP8 sglang none 2.7 803 2025-10-13 lmsys.orgkept for provenance; SGLang FP8, not llama.cpp, so excluded from calibration (was recorded as a 40 GB Q4 llama.cpp run)
DGX Spark gpt-oss-20b MXFP4 llama.cpp-gguf none 83.43 4505.82 2026-02-05 github.comllama.cpp b7941 · -fa 1, depth 0, batch 1; GiB in the table converted to decimal GB
DGX Spark gpt-oss-120b MXFP4 llama.cpp-gguf none 58.72 2443.91 2026-02-05 github.comllama.cpp b7941 · -fa 1, depth 0, batch 1; GiB in the table converted to decimal GB
DGX Spark Qwen3 Coder 30B A3B Q8_0 llama.cpp-gguf none 61.06 2986.97 2026-02-05 github.comllama.cpp b7941 · -fa 1, depth 0, batch 1; GiB in the table converted to decimal GB
DGX Spark Qwen2.5 Coder 7B Q8_0 llama.cpp-gguf none 29.43 2250.28 2026-02-05 github.comllama.cpp b7941 · -fa 1, depth 0, batch 1; GiB in the table converted to decimal GB
DGX Spark Gemma 3 4B Q4_0 llama.cpp-gguf none 81.05 5948.74 2026-02-05 github.comllama.cpp b7941 · -fa 1, depth 0, batch 1; GiB in the table converted to decimal GB
M4 Pro Qwen3.8-27B MLX-4bit mlx none 7 2026-05 vinoth12940.github.ioblog baseline; see mlx-dspark row for a second M4 Pro baseline (14.7) — discrepancy to resolve (memory bandwidth variant or context length)
M4 Pro Qwen3.8-27B MLX-4bit mlx mtp (baseline 7) 18.3 2026-05 vinoth12940.github.ioMTPLX native MTP heads; 2.6x over its own baseline
M4 Pro Qwen3.8-27B MLX-4bit mlx none 14.7 2026 github.commlx-dspark README baseline, median of 3
M4 Pro Qwen3.8-27B MLX-4bit mlx dflash2 (baseline 14.7) 33.8 2026 github.com2.30x mean; draft incoai/Qwen3.8-27B-DFlash2
M4 Pro Qwen3.8-27B MLX-4bit mlx dspark (baseline 14.7) 29.5 2026 github.com1.99x mean
M4 Pro Qwen3.8-27B MLX-8bit mlx none 8.4 2026 github.com
M4 Pro Qwen3.8-27B MLX-8bit mlx dflash2 (baseline 8.4) 30.5 2026 github.com3.63x mean — 8-bit targets accept longer drafts
M4 Pro gemma-4-12B MLX-8bit mlx none 17.8 2026 github.com
M4 Pro gemma-4-12B MLX-8bit mlx dspark (baseline 17.8) 49.4 2026 github.com2.78x
M4 Pro Qwen3.6-35B-A3B (3B active) MLX-4bit mlx none 86.9 2026 github.comMoE: speed follows ACTIVE params — validates the active-bytes formula
M4 Pro Qwen3.6-35B-A3B (3B active) MLX-4bit mlx dspark (baseline 86.9) 114.5 2026 github.comonly 1.32x — speculative decoding helps small-active MoE much less
M4 Pro Muse-Glimmer-30B MLX-8bit mlx none 8.2 2026 github.com
M3 Max Qwen3-8B bf16 mlx none 13.7 2026 github.com
M3 Max Qwen3-8B bf16 mlx dflash (baseline 13.7) 45.8 2026 github.com3.34x, long-essay task
M4 Qwen3.5-9B MLX-4bit mlx none 14.4 2026 github.com
M4 Qwen3.5-9B MLX-4bit mlx mtp (baseline 14.4) 23 2026 github.com1.6x, depth 1

Speed profiles and other factors

ms per token = GB read per token ÷ (b_eff_ratio × spec bandwidth) × 1000 × read_factor[quant family] (the K-quant factor on the platforms it lists: Apple silicon) + (t0_ms + architecture_cost_ms[class]) × mlx overhead_factor[group] (GGUF: 1) + (attention_ms_per_32k[attention] + mlx attention_ms_per_32k[chip generation: pre_m5 | m5plus]) × context ÷ 32768; tok/s = 1000 ÷ ms. Generated from the benchmark and validation rows by the calibration script; never edited by hand.

Per chip

ChipEffective bandwidthFixed costRowsOrigin
M1 61 GB/s (90 % of 68) 8.4 ms 2 measured profile: 61 GB/s effective (90 % of 68 GB/s) and 8.4 ms per token (M1, fitted from 2 rows)
M2 94 GB/s (94 % of 100) 5.3 ms 3 measured profile: 94 GB/s effective (94 % of 100 GB/s) and 5.3 ms per token (M2, fitted from 3 rows)
M3 98 GB/s (98 % of 100) 8.2 ms 2 measured profile: 98 GB/s effective (98 % of 100 GB/s) and 8.2 ms per token (M3, fitted from 2 rows)
M4 104 GB/s (87 % of 120) 4.9 ms 3 measured profile: 104 GB/s effective (87 % of 120 GB/s) and 4.9 ms per token (M4, fitted from 3 rows)
M5 148 GB/s (97 % of 153) 5.8 ms 2 measured profile: 148 GB/s effective (97 % of 153 GB/s) and 5.8 ms per token (M5, fitted from 2 rows)
M1 Pro 190 GB/s (95 % of 200) 7.2 ms 3 measured profile: 190 GB/s effective (95 % of 200 GB/s) and 7.2 ms per token (M1 Pro, fitted from 3 rows)
M1 Max 363 GB/s (91 % of 400) 6.4 ms 6 measured profile: 363 GB/s effective (91 % of 400 GB/s) and 6.4 ms per token (M1 Max, fitted from 6 rows)
M2 Pro 191 GB/s (95 % of 200) 5.8 ms 3 measured profile: 191 GB/s effective (95 % of 200 GB/s) and 5.8 ms per token (M2 Pro, fitted from 3 rows)
M2 Max 381 GB/s (95 % of 400) 5.1 ms 3 measured profile: 381 GB/s effective (95 % of 400 GB/s) and 5.1 ms per token (M2 Max, fitted from 3 rows)
M3 Pro 142 GB/s (94 % of 150) 5.9 ms 3 measured profile: 142 GB/s effective (94 % of 150 GB/s) and 5.9 ms per token (M3 Pro, fitted from 3 rows)
M3 Max 293 GB/s (98 % of 300) 5.2 ms 3 measured profile: 293 GB/s effective (98 % of 300 GB/s) and 5.2 ms per token (M3 Max, fitted from 3 rows)
M4 Pro 251 GB/s (92 % of 273) 4.3 ms 3 measured profile: 251 GB/s effective (92 % of 273 GB/s) and 4.3 ms per token (M4 Pro, fitted from 3 rows)
M4 Max 371 GB/s (90 % of 410) 4.2 ms 3 measured profile: 371 GB/s effective (90 % of 410 GB/s) and 4.2 ms per token (M4 Max, fitted from 3 rows)
M5 Pro 309 GB/s (101 % of 307) 2.6 ms 3 measured profile: 309 GB/s effective (101 % of 307 GB/s) and 2.6 ms per token (M5 Pro, fitted from 3 rows)
M5 Max 386 GB/s (84 % of 460) 0.5 ms 3 measured profile: 386 GB/s effective (84 % of 460 GB/s) and 0.5 ms per token (M5 Max, fitted from 3 rows)
M6 144 GB/s (94 % of 153) 5.8 ms assumed profile: 144 GB/s effective (94 % of 153 GB/s) and 5.8 ms per token (M6: base-tier median until measured)
M1 Ultra 639 GB/s (80 % of 800) 5.8 ms 3 measured profile: 639 GB/s effective (80 % of 800 GB/s) and 5.8 ms per token (M1 Ultra, fitted from 3 rows)
M2 Ultra 700 GB/s (88 % of 800) 5.0 ms 3 measured profile: 700 GB/s effective (88 % of 800 GB/s) and 5.0 ms per token (M2 Ultra, fitted from 3 rows)
M3 Ultra 677 GB/s (83 % of 819) 5.2 ms 3 measured profile: 677 GB/s effective (83 % of 819 GB/s) and 5.2 ms per token (M3 Ultra, fitted from 3 rows)
M5 Ultra 1020 GB/s (85 % of 1200) 1.5 ms assumed profile: 1020 GB/s effective (85 % of 1200 GB/s) and 1.5 ms per token (M5 Ultra: ultra-tier median 0.438 × M5 generation lift 1.265 (M5 Max vs M4 Max); replace when measured; fixed-cost model: unmeasured: 85 % of spec bandwidth (the Ultra tier's share) and the M5 generation's fixed cost; replace when measured)
GB10 Grace Blackwell 258 GB/s (94 % of 273) 2.6 ms 2 measured profile: 258 GB/s effective (94 % of 273 GB/s) and 2.6 ms per token (DGX Spark, fitted from 2 rows)

Tier medians (used when a chip has no row of its own)

TierShare of spec bandwidthFixed costChips
base94 %5.8 ms5
pro95 %5.8 ms5
max91 %5.1 ms5
ultra83 %5.2 ms3
spark94 %2.6 ms1

Architecture cost per token

ClassCostRowsSourceRange
dense0.0 ms0definition
mixture of experts1.7 ms16fitted0 – 4.4
mixture of experts with linear-attention layers5.8 ms2fitted5.2 – 6.4
mixture of experts with latent attention11.7 ms2fitted11 – 12.4
DeepSeek V417.0 ms3fitted13.3 – 32.7

MLX: factor on the fixed cost

Model groupFactorRowsSourceRange
dense×0.997fitted0.76 – 2.62
mixture under 6B active, M4 and newer×0.501assumed
mixture under 6B active, M1 to M3×1.203fitted0.95 – 1.56
other mixtures of experts×0.7710fitted0.54 – 1.18
MLX context cost per 32K, M1 to M46.4 ms14fitted0 – 32.7
MLX context cost per 32K, M5 and newer0.8 ms4fitted0 – 1

Read factors and context cost

TermValueRowsSourceApplies on
Q4_0 / Q5_0 (plain)×1.00definitioneverywhere
Q8_0 / FP8×1.00definitioneverywhere
F16 / BF16×1.00definitioneverywhere
MXFP4 / NVFP4×1.00definitioneverywhere
MLX files×1.00definitioneverywhere
GGUF K-quant and IQ files×1.251assumedapple
grouped-query attention, per 32K of context0.0 ms0definitioneverywhere
latent attention (MLA), per 32K5.0 ms0assumedeverywhere
latent attention (DeepSeek V4), per 32K5.0 ms0assumedeverywhere

Acceleration

KindMinMedianMaxRows
mtp1.60×2.11×2.61×2
draft dense2.01×2.77×3.63×5
draft small active moe1.32×1.32×1.32×1
  • · Qwen3.8-27B MLX-4bit on M4 Pro: 7.0 → 18.3 (2.61×, mtp)
  • · Qwen3.5-9B MLX-4bit on M4: 14.4 → 23.0 (1.60×, mtp)
  • · Qwen3.8-27B MLX-4bit on M4 Pro: 14.7 → 33.8 (2.30×, dflash2)
  • · Qwen3.8-27B MLX-4bit on M4 Pro: 14.7 → 29.5 (2.01×, dspark)
  • · Qwen3.8-27B MLX-8bit on M4 Pro: 8.4 → 30.5 (3.63×, dflash2)
  • · gemma-4-12B MLX-8bit on M4 Pro: 17.8 → 49.4 (2.78×, dspark)
  • · Qwen3-8B bf16 on M3 Max: 13.7 → 45.8 (3.34×, dflash)
  • · Qwen3.6-35B-A3B (3B active) MLX-4bit on M4 Pro: 86.9 → 114.5 (1.32×, dspark)

"Feels like" bands

BandUp toMeaning
painful5 tok/sslower than reading
usable12 tok/susable for short answers
comfortable30 tok/scomfortable chat
fast60 tok/sagents and coding feel fine
cloud-likeand aboveas fast as a hosted model

Sources for the factors