Preflight Local AI Before You Benchmark a Model
My local AI test stopped before model load because the runtime could not build. This preflight keeps setup failures out of benchmark results.
My local AI benchmark failed before it loaded a model. The GPU was ready. The inference runtime was not.
The short answer: Test the toolchain, runtime build, and model load as separate gates. A setup failure is useful evidence, but it is not a model result. Record the exact failed gate and publish no speed number.
Canonical URL: https://bmdpat.com/blog/local-ai-runtime-preflight-before-benchmark-2026

What failed before the benchmark started?
On August 2, 2026, I tried to build WASTE on my RTX 5090 machine. WASTE is a C inference project with a Makefile. I wanted to test its NVMe expert offload path on hardware I own.
The test stopped at the build gate. cc, gcc, clang, and make were absent from the Windows host. WSL showed Ubuntu 22.04 as running, but each command returned Wsl/Service/E_UNEXPECTED with the text Catastrophic failure.
I recorded the failure in my 5090 report. I did not convert a model. I did not load weights. I did not get RAM, NVMe, latency, or token-rate measurements.
That distinction matters. A blank result row can mean that the model failed, the runtime failed, the host failed, or the test never started. Those outcomes need different fixes.
Which gates should run before model load?
I now split the preflight into three gates.
First, check the build tools. Ask the runtime what it needs. Then run version commands for each compiler, build tool, driver, and GPU API. Save stdout, stderr, and exit codes.
Second, build the runtime without a model. A clean build shows the source tree and host toolchain can produce the binary. It does not prove CUDA, model parsing, or inference works.
Third, load the smallest supported model. The goal is one known-good request, not a speed record. Capture the model file, quant, runtime commit, GPU, driver, load result, and stop reason.
Only then should the measured run begin.
Run these gates on every host, not once per project. My WASTE attempt stopped at the first gate, so the 5090 report carries the host state instead of an empty benchmark row. A gate that passes still earns a line in the receipt. That passed line is what lets a later failure point at the model rather than the machine.
Why is VRAM fit not enough?
VRAM answers one question: can the selected weights and runtime state fit on the GPU? It says nothing about whether the host can build or start the runtime.
I made the same point in VRAM Fit Is Not Runtime Support. That post dealt with feature and runtime support. This WASTE test exposed an earlier boundary. The binary did not exist, so VRAM never entered the decision.
This also changes how I read failed benchmark tables. In Why a Failed Local LLM Benchmark Row Still Matters, I kept a failed row because it showed a real limit. A preflight failure needs the same care, but it belongs in a different field.
Use preflight_status, build_status, load_status, and run_status. Do not put every failure under one error label.
What should the receipt contain?
My minimum receipt has four sections.
The host section names the operating system, GPU, driver, and available memory. The toolchain section stores the compiler and build-tool versions. The runtime section stores the repository URL, commit, build command, and build result. The model section stores the file, quant, load result, and measured-run result.
If a gate fails, I stop there. I keep the command, exit code, and error text. I mark all later measurements as not attempted.
This prevents two common errors. The first is to copy a number from another machine because the local run produced none. The second is to call a setup fault a model fault.
I did neither in the WASTE test. The report says that no inference numbers were produced. That is the only result the evidence supports.
When is the benchmark ready to start?
Start it after one small model completes one known-good request through the exact runtime binary that the measured run will use.
Keep that check cheap. It should catch a missing compiler, broken WSL session, bad CUDA link, unsupported model file, or failed load before the long test reserves the machine.
Then run the real workload. Capture input tokens, output tokens, wall time, token rate, VRAM, power, and stop reason. If the workload fails, the receipt can now place the fault after a passed preflight.
The point is not to avoid failed tests. The point is to make each failure name the boundary it reached.
Accompanying prompt
What the prompt does: It turns a local AI test plan into a fail-closed preflight with separate build, load, and measurement results.
Copy/paste this prompt:
Copy-ready prompt
Paste the exact block into your coding agent.
No article chrome, no footnotes, no formatting drift.
This prompt and every other one we publish live in the free prompt library.
Copy the block above.
Get the next measured local AI build note from The 5090 Reports.
Get the Local AI Field Kit
Four copy-ready tools now, then one evidence-backed Local AI Lab Note on Friday when there is something worth sharing.
Get the requested artifact now, then at most one evidence-backed Local AI Lab Note on Friday when there is something worth sharing. One-click unsubscribe. No sponsored placements. Privacy.
Patrick Hughes
Building BMD HODL — a one-person AI-operated holding company. Nashville, Tennessee. Twenty-Two agents.
More writing
- 5 min
49W Average Hid a 338W Burst on Gemma 26B
Gemma 4 26B Q4_K_M averaged 49 W on a long RTX 5090 run and peaked at 338 W. Keep both watt numbers before you compute energy per token.
- 5 min
How to Calculate Local LLM Energy per Token
My RTX 5090 test shows how watts and output rate become joules per token, and why the faster of two matched settings can waste energy.
- 4 min
Why a Failed Local LLM Benchmark Row Still Matters
A failed local LLM row marks the test boundary. My RTX 5090 report shows why quality, speed, and settings belong in one receipt.
- 5 min
My local LLM eval hid four token caps
My 5090-rig eval uses four output caps: 50, 180, 192, and 256 tokens. A score without the cap is not a model result. Record the cap on every row.
- 5 min
The 26B Model Hit the Cap. The 8B Finished.
Same code task, same 512-token cap. Ollama's done_reason showed one local model finished and one got cut off. Tokens per second hid it.