Methodology · Checker result contract v6
How the Compatibility Checker works.
Each verdict the Checker gives, and each result summary you copy from it, comes from the rules on this page. They are practical VRAM fit rules rather than measured benchmarks, and this page states each threshold so a result can be checked, cited, or challenged.
Thresholds on this page are read from the Checker's own engine at build time, so the two cannot drift apart.
Estimates, stated as estimates
Fit verdicts are sizing rules, not benchmarks. Confirm against your own hardware before long sessions.
Privacy-safe by construction
A copied result contains hardware ranges only, not your exact specs or the text you typed.
Versioned and checkable
Each copied result carries "Contract v6" so it can be checked against the methodology that produced it.
The fit formula
The Checker grades a model against your estimated total VRAM need: the model's weights at a given quantization, plus roughly 1.5 GB of runtime overhead for the inference server itself. KV cache, the memory that grows with your context length, is not included, because it depends on how you use the model rather than on the model. Long contexts need headroom beyond any verdict here.
- Comfortable: the model fits with at least 2 GB of VRAM to spare above its estimated requirement. Context can grow without immediate risk of eviction.
- Usable, but tight: the model fits, but with less than 2 GB to spare. Close other GPU apps and avoid very long prompts.
- Runs via CPU RAM offload: GPU VRAM alone is not enough, but your system RAM can hold the overflow. This needs roughly 1.6× the model's weights in system RAM, counting weights alone, not the weights-plus-overhead figure above. The multiplier was calibrated end-to-end on real offloaded runs and already absorbs the runtime overhead, so applying it to the larger figure would count that overhead twice. For dense models expect 1–5 tokens/s. A sparse mixture-of-experts model activates only a fraction of its parameters per token, so offload stays usable; each result says which case applies.
- Does not fit: neither VRAM nor RAM offload can hold the model at any catalogued quantization.
Quantization selection
For each model the Checker picks the best quantization your memory can hold, preferring higher precision when it fits: FP16 or Q8_0 (near full precision) over Q4_K_M (roughly half the size with moderate quality loss). This pick depends on your memory alone; your “Preference” choice does not change which quantization a given model is offered. What Preference changes is the ranking between models: Speed first ranks models that run at the smaller quantization higher, Quality first boosts models running at FP16 or Q8_0 and penalizes offload fits. The quantization named in a verdict is the one that was actually graded.
Fit rules as implemented
The grading lives in lib/checker-engine.js. Its three constants are RUNTIME_OVERHEAD_GB = 1.5, COMFORTABLE_HEADROOM_GB = 2 and RAM_OFFLOAD_MULTIPLIER = 1.6. For a model whose catalog weights at a quantization are W GB, on a GPU with V GB of VRAM and R GB of system RAM:
- Comfortable when V is at least W + 1.5 + 2.
- Tight when V is at least W + 1.5, but less than that plus 2.
- Partial (CPU RAM offload) when the GPU check fails but R is at least W × 1.6. The multiplier applies to bare weights, without the overhead.
- Too large otherwise.
W is the weights-only figure in src/data/checker-models.json (quantizations[q].vramGb). The quantization offered is the first of FP16, Q8_0 and Q4_K_M whose W + 1.5 fits in V (pickBestQuantization in the same file); when none fits, Q4_K_M is offered through offload if R covers it. On Apple Silicon, V is a share of unified memory, rounded to one decimal: APPLE_USABLE_MEMORY_FRACTION_SMALL = 0.6667 (two-thirds) up to APPLE_SMALL_POOL_MAX_GB = 36 GB and APPLE_USABLE_MEMORY_FRACTION_LARGE = 0.75 above (src/lib/appleMemory.js). The estimated speed class on hardware presets is BANDWIDTH_EFFICIENCY = 0.7 × memory bandwidth ÷ W, banded as Very fast (60+ tokens/s), Fast (25–60 tokens/s), Moderate (8–25 tokens/s), Slow (under 8 tokens/s), one band lower for a tight fit, and absent for offload fits, sparse mixture-of-experts models, Apple Silicon, multi-GPU and manual entries (src/lib/throughputBand.js). The code, as it ships:
export function fitRequirementGb(weightsGb) {
const weights = Number(weightsGb);
if (!Number.isFinite(weights) || weights <= 0) return weightsGb;
return weights + RUNTIME_OVERHEAD_GB;
}
export function gradeVramFit(vramGb, requiredVramGb, systemRamGb = 0, offloadBasisGb = requiredVramGb) {
if (vramGb > 0) {
if (vramGb >= requiredVramGb + COMFORTABLE_HEADROOM_GB) return 'comfortable';
if (vramGb >= requiredVramGb) return 'tight';
}
if (systemRamGb >= offloadBasisGb * RAM_OFFLOAD_MULTIPLIER) return 'partial';
return 'too_large';
}
export function gradeModelFit(vramGb, weightsGb, systemRamGb = 0) {
return gradeVramFit(vramGb, fitRequirementGb(weightsGb), systemRamGb, weightsGb);
}One known gap, from measurement: the overhead is a flat 1.5 GB whatever the context length, and the KV cache grows with context. On our RTX 3080 10GB a model can fit at a 4K context and spill at 16K; the measured results for that card show it.
Apple unified memory
Apple Silicon shares one memory pool between the CPU, the GPU, and everything else you have open, so not all of it is available to a model. The Checker sizes every Apple fit against the share macOS lets a model use by default: about 67% of the reported total on Macs up to 36 GB and 75% above that. An 8 GB Mac is graded on 5.3 GB of effective model memory and a 64 GB Mac on 48 GB.
The two-thirds figure is measured: on this project's own 8 GB MacBook Air M1 (macOS 26.7.1, with the default iogpu.wired_limit_mb of 0) Metal reported a recommendedMaxWorkingSetSize of 5,726,633,984 bytes on 1 November 2026, two-thirds of the pool. The three-quarters figure is what owners of 64 GB and 128 GB Macs consistently report, and the size at which the share changes is not measured; the 36 GB boundary is the one those reports repeat. Where it is wrong for a Mac between those sizes, it understates that Mac rather than promising a fit macOS refuses. You can read the limit your own Mac applies in Terminal; it prints the usable figure in GiB: swift -e 'import Metal; print(Double(MTLCreateSystemDefaultDevice()!.recommendedMaxWorkingSetSize) / 1073741824)'
Runtime suggestions
The runtimes a result suggests follow your effective memory tier. They are starting points, not endorsements of one tool over another:
- Workstation (48 GB+ VRAM): Ollama, LM Studio, vLLM, SGLang, GPUStack
- Strong GPU (24–47 GB VRAM): Ollama, LM Studio, GPUStack, vLLM
- Mid-to-high GPU (16–23 GB VRAM): Ollama, LM Studio
- Mainstream GPU (8–15 GB VRAM): Ollama, LM Studio
- Entry GPU (4–7 GB VRAM): Ollama, LM Studio
- CPU-only (32 GB+ system RAM, no discrete GPU): Ollama
What a copied result contains
The Checker's “Copy result summary” button produces a plain-text snapshot built for pasting into a GitHub issue, a forum thread, or a chat. Three rules govern it:
- Hardware appears as ranges, not exact figures. Your VRAM and RAM are reduced to bands like “12–15 GB”, and your GPU to a vendor class (NVIDIA, AMD, Apple, Intel). The free text you typed into the form is not echoed, so a snapshot is safe to paste in public.
- Assumptions travel with the claim. Each snapshot carries the same threshold sentences this page documents, so a verdict can't circulate without the rules that produced it.
- Nothing is transmitted. Copying happens entirely in your browser via the clipboard. No result, hardware detail, or identifier is sent to us or anyone else when you copy, and results are not encoded into shareable URLs.
Each snapshot ends with Contract v6, the version of the result format. The version changes only when the shape or meaning of a result changes (v2 added honest wording for sparse mixture-of-experts offload; v3 corrected the offload RAM rule to state its weights-only basis), so an old citation can always be read against the rules that were in force when it was made.
Limits
These are sizing rules, verified against vendor documentation and hands-on runs, not a benchmark of your machine. Real generation speed depends on memory bandwidth, thermals, drivers, and context length. To measure what your running setup does, use the benchmark tool; to understand the memory arithmetic in depth, read What is VRAM? and What is quantization?.
When you pick a hardware preset, the Checker also shows an estimated speed class per model, a coarse tokens-per-second band derived from the GPU’s memory bandwidth divided by the model’s size, derated to match our own measured bench runs. It is an estimate calibrated against real measurements, not a measurement of your machine, and it does not affect which models are recommended or how they are ranked. Where no sound estimate exists (manually entered hardware, Apple Silicon, multi-GPU rigs, sparse mixture-of-experts models, CPU-offload fits) the Checker shows no class rather than a guess.
Found a verdict that disagrees with your real-world experience? Tell us; hands-on corrections outrank our estimates.
Measurement protocol
The measured sections on our hardware pages come from @opensourcesai/bench (protocol osai-bench/1.3; releases 0.10.0 (scoring osai-bench-derive/1.3) and 0.12.0 (scoring osai-bench-derive/1.4)), run against Ollama on machines we own. Every release listed ran the same workloads, so one table describes them all. Each run sends four workloads to the model with temperature 0, seed 42 and streaming on. This table is read from the published result files:
| Workload | Measures | Tokens generated | Context | Prompt length | Warm-ups | Measured passes |
|---|---|---|---|---|---|---|
| W1 | Cold load time | 1 | 512 | not fixed | 0 | 1 |
| W2 | Time to first token | 128 | 4,096 | 20 to 64 tokens | 1 | 5 |
| W3 | Prompt processing speed | 1 | 4,096 | 2,000 to 4,095 tokens, varied per pass | 1 | 5 |
| W4 | Generation speed | 512 | 4,096 | 20 to 64 tokens | 1 | 5 |
- Tokens per second. Generation is the median, over W4's measured passes, of Ollama's own
eval_countdivided byeval_duration. Prompt processing is the median over W3 ofprompt_eval_countdivided byprompt_eval_duration. Time to first token is the median over W2 of the time from request to the first streamed token. Cold load is W1'sload_duration. CV is the coefficient of variation across the measured passes. Our test suite recomputes each of these from the raw passes in every result file. - VRAM. After loading, the bench reads Ollama's
/api/ps:size, the loaded model's resident footprint including its KV cache and compute buffers, andsize_vram, the part of it in VRAM, both in bytes. It stores them asresidentBytesandvramResidentBytes, withhostResidentBytes= size − size_vram andvramResidentFraction= size_vram ÷ size, and computes nothing else. Our pages show size_vram as “VRAM used” and the spill as hostResidentBytes ÷ residentBytes. These are Ollama's own figures, not a separate GPU reading:deepseek-r1:14bandqwen2.5:14b, whose files differ in size, report byte-identicalsizeandsize_vramon our RTX 3080, so their shares are identical too. Because this is the model's own footprint, other programs using the card do not inflate it. - Preconditions. The bench refuses to start when the GPU is already busy (pre-existing utilization above 10%) or another model is resident, and records the free VRAM it sees when it checks the GPU and when the model loads.
- Validity. A pass whose prompt token count falls outside its workload's range, or whose generated token count differs from the target, is invalid and retried. A run whose generation passes all fail reports no generation figure, and our tables say so instead of showing one.
- Ceiling. The bench also divides the card's memory bandwidth from its built-in table (NVIDIA GeForce RTX 3080: 760 GB/s; NVIDIA GeForce RTX 4070 Ti: 504 GB/s) by the weight size, as a theoretical upper bound for generation.
- How we run it. One model at a time. In a catalog sweep the previous model is stopped first, with an 8-second pause before the next run's precondition check. A model measured more than once is listed once per run; runs are not averaged. Tables round to two decimals (milliseconds to one) and give sizes in decimal GB; each row links to its file, which holds the unrounded value.
- Scope. Each published GPU run used one discrete NVIDIA GPU and Ollama, at the context lengths in the table. The CPU-only runs used the same bench on the same Ollama, started with the GPU hidden from it (CUDA_VISIBLE_DEVICES=-1 and GGML_VK_VISIBLE_DEVICES=-1), so every byte of the model sat in system RAM; each file records 0 bytes in VRAM. That is how a machine without a usable GPU runs a model. The bench still sees the card and computes its bandwidth ceiling from it, which does not apply to a CPU run, so no page shows that figure for them. A Modelfile setting of num_gpu 0 is different: it keeps the layers on the CPU but leaves the GPU visible, and our sweep used it only as a diagnostics fixture, which no page shows. One further run, on our M1 MacBook Air with bench 0.11.0 (scoring osai-bench-derive/1.4), is not published: the bench cannot see Apple GPUs, so that rig is used for detection checks, not benchmarks.
Context-fit sweep
The bench measures speed at one context length. How long a context still fits on a card is a separate question, answered by scripts/lab/context-fit-sweep.mjs (protocol osai-ctxfit/1), which lives in this site's repository and runs on the rig against its own Ollama. For each context length (4,096, 8,192, 16,384, 32,768 tokens in the published sweeps, skipping any longer than the model was trained for) it:
- reads the GPU's used and free memory with
nvidia-smi, with no model loaded; - loads the model fresh with that
num_ctxand runs 4 short generation passes of 64 tokens each, the first one a warm-up; - reads Ollama's
/api/ps:size(the footprint),size_vram(the part on the card) andcontext_length, which must equal the length requested; - unloads the model and waits before the next length.
Each length is then labelled from those readings alone. In VRAM, full speed: Ollama put the whole footprint on the card, the footprint was no larger than the free VRAM measured before the load, and generation stayed within 25% of the sweep's speed at its shortest length. Slowed: Ollama still reported all of it on the card, but the footprint was larger than the free VRAM or generation fell further than that. On Windows the NVIDIA driver can move GPU memory into system RAM when the card is nearly full, which Ollama does not see; we name that as the likely cause and have not verified it. Split: Ollama itself put part of the model in system RAM. Generation in a sweep uses a short prompt, so the cache is allocated but nearly empty; it shows what a poor fit costs, not speed with a full context window. Our test suite recomputes every step's generation figure and label from the raw passes in the published file.
Published result files
Each file behind a measured page is published unedited under /lab/results/, with a note on what the files contain. Each was checked for paths, addresses, host names and credentials before publication; none needed redacting. The files are licensed Creative Commons Attribution 4.0 International (CC BY 4.0): reuse them, including commercially, with credit to CJ Zwart, OpenSourcesAI and a link to this page. The license covers the result files only.
2570server (RTX 3080 10 GB): 33 files, shown here
- 2026-08-01T11-36Z-rtx3080-qwen3-8b.json (qwen3:8b, Q4_K_M)
- 2026-08-03T01-32Z-rtx3080-gemma4-31b.json (gemma4:31b, Q4_K_M)
- 2026-08-03T04-22Z-rtx3080-north-mini-code-1.0.json (north-mini-code-1.0:latest, Q4_K_M)
- 2026-08-03T04-40Z-rtx3080-qwen3-30b.json (qwen3:30b, Q4_K_M)
- 2026-08-03T04-45Z-rtx3080-qwen3.6-35b-a3b.json (qwen3.6:35b-a3b, Q4_K_M)
- 2026-08-03T05-09Z-rtx3080-qwen3.6-27b.json (qwen3.6:27b, Q4_K_M)
- 2026-08-03T05-14Z-rtx3080-laguna-xs-2.1.json (laguna-xs-2.1:latest, Q4_K_M)
- 2026-08-03T05-37Z-rtx3080-llama3.1-8b.json (llama3.1:8b, Q4_K_M)
- 2026-08-03T05-38Z-rtx3080-qwen3-4b.json (qwen3:4b, Q4_K_M)
- 2026-08-03T06-06Z-rtx3080-qwen2.5-7b-instruct-q8_0.json (qwen2.5:7b-instruct-q8_0, Q8_0)
- 2026-08-03T06-08Z-rtx3080-deepseek-r1-8b-0528-qwen3-q8_0.json (deepseek-r1:8b-0528-qwen3-q8_0, Q8_0)
- 2026-08-03T06-09Z-rtx3080-qwen3-8b-q8_0.json (qwen3:8b-q8_0, Q8_0)
- 2026-08-03T06-11Z-rtx3080-phi3-3.8b-mini-128k-instruct-fp16.json (phi3:3.8b-mini-128k-instruct-fp16, F16)
- 2026-08-03T06-15Z-rtx3080-qwen3-coder-30b.json (qwen3-coder:30b, Q4_K_M)
- 2026-08-03T06-16Z-rtx3080-qwen3-8b.json (qwen3:8b, Q4_K_M)
- 2026-08-03T06-18Z-rtx3080-qwen3-web.json (qwen3-web:latest, Q4_K_M)
- 2026-08-03T06-21Z-rtx3080-qwen3-14b-1k.json (qwen3-14b-1k:latest, Q4_K_M)
- 2026-08-03T06-24Z-rtx3080-qwen3-14b-2k.json (qwen3-14b-2k:latest, Q4_K_M)
- 2026-08-03T06-30Z-rtx3080-gemma4-26b.json (gemma4:26b, Q4_K_M)
- 2026-08-03T06-47Z-rtx3080-qwen3-4b-fp16.json (qwen3:4b-fp16, F16)
- 2026-08-03T08-30Z-rtx3080-qwen3-32b.json (qwen3:32b, Q4_K_M)
- 2026-08-07T06-23Z-rtx3080-phi4.json (phi4:latest, Q4_K_M)
- 2026-08-07T07-19Z-rtx3080-phi3-medium-128k-q4km.json (phi3:14b-medium-128k-instruct-q4_K_M, Q4_K_M)
- 2026-08-07T07-46Z-rtx3080-qwen3-14b.json (qwen3:14b, Q4_K_M)
- 2026-08-07T07-48Z-rtx3080-deepseek-r1-14b.json (deepseek-r1:14b, Q4_K_M)
- 2026-08-07T07-55Z-rtx3080-qwen2-5-14b.json (qwen2.5:14b, Q4_K_M)
- osai-bench-result-2026-08-01T06-16-50-297Z.json (qwen3:8b, Q4_K_M)
- osai-bench-result-2026-08-01T06-23-32-319Z.json (qwen3:4b-fp16, F16)
- 2026-10-20T07-47Z-rtx3080-qwen3-4b-ctxfit.json (qwen3:4b, Q4_K_M)
- 2026-10-20T07-48Z-rtx3080-qwen3-8b-ctxfit.json (qwen3:8b, Q4_K_M)
- 2026-10-20T07-49Z-rtx3080-qwen3-8b-q8_0-ctxfit.json (qwen3:8b-q8_0, Q8_0)
- 2026-10-20T07-51Z-rtx3080-llama3.1-8b-ctxfit.json (llama3.1:8b, Q4_K_M)
- 2026-10-20T07-52Z-rtx3080-qwen3-14b-ctxfit.json (qwen3:14b, Q4_K_M)
Windows desktop (RTX 4070 Ti 12 GB): 21 files, shown here
- 2026-08-01T11-40Z-rtx4070ti-qwen3-8b-q8kv.json (qwen3:8b, Q4_K_M)
- 2026-08-01T11-45Z-rtx4070ti-qwen3-8b-defaults.json (qwen3:8b, Q4_K_M)
- 2026-10-20T05-56Z-rtx4070ti-deepseek-r1-14b.json (deepseek-r1:14b, Q4_K_M)
- 2026-10-20T06-16Z-rtx4070ti-qwen3-14b.json (qwen3:14b, Q4_K_M)
- 2026-10-20T06-19Z-rtx4070ti-phi4.json (phi4:latest, Q4_K_M)
- 2026-10-20T06-24Z-rtx4070ti-qwen2.5-14b.json (qwen2.5:14b, Q4_K_M)
- 2026-10-20T06-26Z-rtx4070ti-qwen3-4b-fp16.json (qwen3:4b-fp16, F16)
- 2026-10-20T06-47Z-rtx4070ti-qwen3-4b.json (qwen3:4b, Q4_K_M)
- 2026-10-20T06-49Z-rtx4070ti-qwen3-8b.json (qwen3:8b, Q4_K_M)
- 2026-10-20T06-53Z-rtx4070ti-llama3.1-8b.json (llama3.1:8b, Q4_K_M)
- 2026-10-20T06-56Z-rtx4070ti-qwen3-8b-q8_0.json (qwen3:8b-q8_0, Q8_0)
- osai-bench-result-2026-08-01T06-18-47-663Z.json (qwen3:4b, Q4_K_M)
- osai-bench-result-2026-08-01T09-21-41-393Z.json (qwen3:4b, Q4_K_M)
- osai-bench-result-2026-08-01T09-23-58-258Z.json (qwen3:4b, Q4_K_M)
- 2026-10-20T06-26Z-rtx4070ti-qwen3-14b-ctxfit.json (qwen3:14b, Q4_K_M)
- 2026-10-20T06-29Z-rtx4070ti-phi4-ctxfit.json (phi4:latest, Q4_K_M)
- 2026-10-20T06-30Z-rtx4070ti-qwen3-4b-fp16-ctxfit.json (qwen3:4b-fp16, F16)
- 2026-10-20T06-56Z-rtx4070ti-qwen3-4b-ctxfit.json (qwen3:4b, Q4_K_M)
- 2026-10-20T06-57Z-rtx4070ti-qwen3-8b-ctxfit.json (qwen3:8b, Q4_K_M)
- 2026-10-20T06-58Z-rtx4070ti-llama3.1-8b-ctxfit.json (llama3.1:8b, Q4_K_M)
- 2026-10-20T06-59Z-rtx4070ti-qwen3-8b-q8_0-ctxfit.json (qwen3:8b-q8_0, Q8_0)
Windows desktop (Intel Core i7-14700K): 3 files, shown here
- 2026-10-20T07-07Z-i7-14700k-cpu-qwen3-4b.json (qwen3:4b, Q4_K_M)
- 2026-10-20T07-16Z-i7-14700k-cpu-qwen3-8b.json (qwen3:8b, Q4_K_M)
- 2026-10-20T07-25Z-i7-14700k-cpu-llama3.1-8b.json (llama3.1:8b, Q4_K_M)
Changelog
Changes to the fit rules and the measurement protocol. The date is the commit date, or the run date for a result file; the reference is the commit or file that records the change.
| Date | Area | Change | Reference |
|---|---|---|---|
| 2026-06-24 | Fit rules | Engine introduced: comfortable at VRAM of at least the model figure + 2 GB, tight at VRAM of at least the figure, CPU RAM offload at system RAM of at least 1.6 times the figure. Callers passed the catalog's weights-only figure, so the engine's 1.5 GB runtime overhead was not yet applied to grading (corrected 2026-08-05). | e4041b03 |
| 2026-07-10 | Apple sizing | Apple Silicon sized at 75% of unified memory, one rule shared by every tool. | 451670a5 |
| 2026-07-31 | Result contract | Citable result contract v1; the two grading thresholds became named, exported constants with unchanged values. | d2a89a76 |
| 2026-08-01 | Result contract | Contract v2: a partial fit for a sparse mixture-of-experts model is described as usable rather than 1 to 5 tokens/s. Grading unchanged. | f758de42 |
| 2026-08-01 | Methodology | This page became the citation target of every copied Checker result. | 5db1df57 |
| 2026-08-01 | Measurement | First runs of @opensourcesai/bench 0.10.0 (protocol osai-bench/1.3, scoring osai-bench-derive/1.3) on both rigs, result files kept in the repository. | b6cce726 |
| 2026-08-03 | Measurement | Full-catalog sweep on the RTX 3080 rig under the same protocol. | 4cec67f5 |
| 2026-08-04 | Fit rules | Apple Silicon graded against unified memory instead of treating an empty VRAM field as zero, after a measured run on the M1. | 0cf49b16 |
| 2026-08-04 | Measurement | Sweep figures marked as sweep-context (back-to-back runs read low against isolated runs) and the NVIDIA driver version recorded as a comparability key. | 92aeab3a |
| 2026-08-05 | Fit rules | Fit graded against weights plus the 1.5 GB runtime overhead, as this page had stated; the offload rule stays on bare weights. | 95d3f74c |
| 2026-08-05 | Measurement | Bench 0.11.0 (scoring osai-bench-derive/1.4) used on the M1; its result file adds timeToFirstVisibleTokenMs and a reasoningWithheldPasses count. Not used on any published page. | 2026-08-05T00-57Z-macbookair-m1-qwen3-4b.json |
| 2026-08-06 | Result contract | Contract v3: the offload sentence states its weights-only basis. Grading unchanged. | c55060c9 |
| 2026-08-07 | Speed estimate | Estimated speed class on hardware presets: 0.7 times memory bandwidth divided by weights, display only. | 2cc82a39 |
| 2026-10-15 | Result contract | Contract v4: punctuation only, the em dash left every rendered string. Grading unchanged. | 8e491266 |
| 2026-10-20 | Measurement | Bench 0.12.0 runs on the RTX 4070 Ti desktop with Ollama 0.35.1 at its defaults (the owner’s q8_0 KV cache and flash attention removed for the run), a CPU-only lane on the same desktop with the GPU hidden from Ollama, and a profile for the machine. Where the bench refused to start on the desktop’s idle-clock utilization reading after eight retries, the run used its quality override, which the file records. | docs/lab/windows-desktop-test-rig.md |
| 2026-10-20 | Measurement | Context-fit sweep (osai-ctxfit/1): footprint, VRAM placement and short-prompt generation at several context lengths, each length labelled in VRAM at full speed, slowed (Ollama reports it on the card but it exceeded the free VRAM or ran more than 25% slower than at the shortest length) or split. Measured pages gained a prompt-processing column and a visible note once their newest run is more than a year old. | scripts/lab/context-fit-sweep.mjs |
| 2026-10-20 | Measurement | Context-fit sweeps on the RTX 3080 rig, against a second Ollama 0.32.5 server started at its defaults and held to eight cores of CPU time, with the service that shares the card stopped for the run. At 4,096 tokens their footprints equal the August bench runs of the same model files to the byte. | docs/lab/rtx3080-context-fit-2026-10-20.md |
| 2026-10-26 | Fit rules | Optional GPU budget for a GPU shared with other workloads: when entered, every fit is graded against it instead of the card, estimated full-GPU fits are listed apart from CPU-offload options (shown without run commands), and an entry the Checker cannot use pauses results. A budget estimates fit only and limits nothing at runtime. Blank changes nothing. | src/lib/gpuBudget.js |
| 2026-10-26 | Result contract | Contract v5: every snapshot carries budgetLimited and budgetBand (false and null with no budget, when every other field, the assumptions and the rendered text match v4 apart from the version). A budget appears only as a range. | src/lib/checkerResultContract.js |
| 2026-11-01 | Apple sizing | Apple Silicon sized at two-thirds of unified memory up to 36 GB and three-quarters above, rounded to one decimal, after the 8 GB M1 reported a Metal limit of two-thirds at the macOS default. Contract v6: the Apple assumption names the share that applies. A Mac of 36 GB or less is graded on less memory than before; larger Macs are unchanged. | docs/lab/macbook-air-m1-test-rig.md |
Who maintains this
The fit engine, this page and the measurements are maintained by CJ Zwart, Editor and founder, OpenSourcesAI, who also builds @opensourcesai/bench. Corrections go through the contact page.