Local AI Infrastructure

Two models, one $1,400 mini-PC: the paired numbers, failures included

A 35B reasoning model now runs shoulder to shoulder with our daily 27B on one $1,400 box, at the same time. Every number paired, same problems, same machine. The failures are in here too.

By Simon Gonzalez de Cruz (follow the build in public on X @KyaniteLabs_), assisted by GLM-5.3. 2026-08-25. Every number below was re-read from raw result files on this machine before writing.

We run a small AI lab on hardware that fits under a TV: one AMD Strix Halo mini-PC with 64GB of shared memory. A Qwen3.8-27B has been our main model and daily engine here since mid-August. This week we asked a harder question: can this same box also run Ornith-1.5-35B, a bigger open-weights model, at the same time, and is it actually any good when you measure it fairly?

The answer is yes, with three caveats. Here is everything, including what failed. One number below was first measured wrong by our own tool. Story at the end.

The setup

One machine. Two models, resident at the same time, no switching:

  • Qwen3.8-27B (our "champion", serving the product): 262k context, vision attached.
  • Ornith-1.5-35B-A3B (the newcomer, thinking-on lane): a Mixture-of-Experts build that only activates ~3B parameters per token. We run an APEX-Compact quantization at 17.4GB. Together the two models use 43.4 of 64GB, with about 20GB to spare.

That "to spare" matters: this only fits because of a memory trick we checked (see below). The stock quant at ~22GB also fits, but with less headroom.

The scoreboard, every number paired, same problems, same machine

We never compare two numbers that came from different places. Both models ran the same fixed problem sets, back to back, on the same box:

TestChampion 27BOrnith 35BRead
Grade-school math (GSM8K, strict grading, paired 2×2, same 60 problems, n=60/cell)96.7% thinking off; 96.7% thinking on (identical outcomes, McNemar p=1.0)90.0% thinking off; 98.3% thinking on (p=0.0625, marginal at n=60)At each model's best config: a one-problem tie (p=1.0). Thinking costs the champion 2.4× time for zero gain; Ornith needs it
Code, clean problems (HumanEval, same frozen 30)28/3026/30Tie within noise
Code, real-world (LiveCodeBench, same 30)20/3017/30Slight edge champion, not decisive at n=30
Vision, same 6 real screenshots6/65/6Ornith misread an email address in a form (typo'd the domain)

If you only remember one row: a 35B reasoning model now runs shoulder to shoulder with our daily driver on this class of hardware. Until paired measurements like this, that was a forum argument.

The three caveats

  1. Thinking is a dial, not a model gap. Measured paired (2×2, same problems, same protocol): the champion scores 96.7% with thinking off AND on (identical outcomes, p=1.0), so its thinking switch buys nothing here at 2.4× the time. Ornith scores 90.0% without thinking and 98.3% with it. At best configs the two models tie within one problem (p=1.0). Earlier numbers that compared Qwen thinking-off against Ornith thinking-on were regime-mismatched; this paired table is the truth and it replaces them.
  2. Code is a tie, not a win. 26/30 vs 28/30 on identical problems is within noise. We will not claim a code champion from this data.
  3. Vision has one miss. On a real signup-form screenshot, Ornith returned an email with the domain misread. That is a wrong answer, not a near-miss. Our champion got all 6. Small sample, labeled: 5/6.

What did NOT work (the part few publish)

We tested speculative decoding two ways, because it promised free speed:

  • The trained draft head shipped in APEX builds: accepted only ~33% of draft tokens, and made generation ~9% slower end to end. Dead on this hardware, measured, twice.
  • An improvised draft: same ~33% class. Same verdict.

Speculative decoding is a memory-bandwidth trick, and this machine's bandwidth goes to the two resident models. The right setting is OFF, and anyone running a similar box should start there instead of paying our discovery cost.

The memory trick that made it fit

The APEX-Compact build packs the 35B into 17.4GB (vs ~22GB stock at the same Q4 quality tier). We could not measure a quality cost at these sample sizes: grade-school math 95.0% vs 96.7% stock on n=60, and identical results on a 15-problem code reasoning set. That ~4.3GB saving is the difference between "one model at a time" and "both models always on," which is the whole point of the machine.

Speed, labeled

  • Writing a long answer: ~55 tokens/second sustained. A 200-word reply lands in about 6-7 seconds. A full thinking run on a hard problem: minutes.
  • Reading long documents (prefill): we ingested 130,715 tokens, a whole book, in 359 seconds (~364 tokens/second), with the chip at 72°C the whole way. Long-context work is where this MoE build earns its keep.

Our settings card (if you have the same box)

Greedy decoding (temperature 0), q4_0 KV cache, speculative decoding OFF, APEX-Compact Q4 weights, math budget 2048 tokens, hard-code budget 8192 (2/30 problems still hit the cap, labeled, not hidden). Nothing here is exotic; all of it was measured against at least one alternative on this machine before we kept it.

Why publish all of it

Most "I ran a big model locally" posts show one screenshot and one tokens-per-second number. We think the valuable artifact is the paired, same-fixture table with the failures included, including the run where our own grading tool truncated the model's output and briefly told us the model was bad at math (0.467). It wasn't; our instrument was wrong. That difference is visible in the two saved configs. Same problems: 0.967. Both JSONs are cited below, because the instrument should be suspect as often as the model.

Sources (raw result files, on-box paths): GSM8K paired 2×2 ~/exp/2x2-gsm8k/summary.json (champ 58/60 both cells; orn 54/60 off, 59/60 on; McNemar p=1.0/0.0625/1.0; median walls 28.3/68.5/11.4/23.3s; run 2026-08-24T19:42Z, live doors, self-test read before scoring). GSM8K Ornith stock corrected ~/exp/w1-35b/gsm-full-b/Ornith35B/results_2026-08-22T01-26-41.json (strict 0.9667); the false start results_2026-08-22T01-00-27.json (strict 0.4667, instrument truncation). APEX-Compact ~/exp/w4-35b/gsm-run.log (0.9500). HumanEval-30 Ornith ~/exp/w1-35b/bench-results-default.log (26/30); champion 28/30 (~/exp/bench-results-default.log, verified 2026-08-24). LiveCodeBench-30 Ornith ~/exp/w3b-35b/verdict.txt (17/30, trunc 2/30); champion 20/30 (recorded in the comparison design doc, READ; result bytes not yet located, labeled). LCB-15 parity ~/exp/w4-35b/lcb15-run.log (7/15, identical to stock). Vision real-UI: Ornith ~/exp/vision35b-results.log (5/6); champion ~/exp/vision-real-results.log (6/6). Decode speed ~/exp/w4-fire.log (no-spec 55.9 tok/s; spec slower 50.4 vs 55.2, paired, same binary). Prefill ~/exp/ornith-window-results.log (wall=359s, 130,715 tokens, 72°C). Speculative acceptance ~0.33: window-4 banked comparators. Memory: APEX-Compact 17.4GB weights; dual-resident 43.4/64GB GTT (live readback 2026-08-23). Regime note: earlier champion GSM8K readings of 70% strict and 98% predate the paired protocol and are superseded by the 2×2 for this piece.

Work with Kyanite

Want this working in your environment?

If this post describes a Kyanite tool or result you need, implementation help can cover setup, advising, docs, examples, checks, and a usable handoff.

Fit boundary

Kyanite offers help grounded in its tools, products, and build practice. Broader consulting routes through PuenteWorks.

Keep following the system.

The One-Line Bug That Crashed Our Fast Lane: finding, fixing, and measuring a speculative-decoding crash on a $1,400 mini-PC

Spec decoding crashed our fastest lane on day one. The bug was one missing line in our fork; the fix bought +17.7% and a surprise about draft quantization.

How I became a forward deployed engineer without a software engineer title

The title is new; the work is old. Twelve years of enterprise deployments plus public, measured AI work. The honest path, artifacts included.

Evals are the FDE skill nobody lists: my 495-trial public benchmark

The market says it cannot find people who can build AI evals. The skill is learnable and I published mine: 495 trials, certified floors, sabotage cell, open source.

Forward deployed vs solutions engineer vs implementation vs customer engineer: the title decoder

Four titles, one job family, different coding bars. A decoder that reads any posting and tells you what you are actually signing up for.

What does a forward deployed engineer actually do? A demo on a $1,400 mini-PC

The straight answer, then the receipts: the whole FDE job run end to end on a $1,400 mini-PC, with public evals.

The Delegation Card: we asked a $1,400 mini-PC to take our jobs

Not is-it-smart but can-you-hand-it-work-and-walk-away. 495 certified trials, then re-validated at deeper n after the product changed: 965 total, floors to 92.8%.

Qwen 3.8 27B on Strix Halo: the complete measured story

Every dial measured, every number public: the frozen optimal config for a 27B on a $1,400 mini-PC.

Lab Notes: the measured-knees method for reasoning effort

A methods note on reasoning-effort calibration. Thinking rescued 15/40 hards vs 4/40 off. On easy tasks it bought nothing. Publish the knee.

Lab Notes: 67% LiveCodeBench-30 on a $1,400 rig

20/30 = 67% LiveCodeBench-30 on a $1,400 mini-PC. Wilson 95% CI 49-81%. Easy 10/10, medium 8/10, hard 2/10. n=30 public subset. Not the card.

Lab Notes: we reverted a llama.cpp regression

We found a llama.cpp regression and reverted it. n=6 battery on a $1,400 rig: 0/6 slashes before, 5/6 after. Same Q4_K_XL. Not a quant story.

Lab Notes: 93% HumanEval on a $1,400 rig

28/30 = 93% HumanEval on a $1,400 mini-PC. Qwen3.8-27B Q4_K_XL. Temp 0, thinking off. Failures: 50 and 145. Raw log linked.

Lab Notes: the model that can't forget but can't remember

The number first: this model is 75% not a transformer. 48 of 64 layers keep a running state. On a $1,400 rig, load 198k once (1818s), then query in 9-27s.

Lab Notes: the basin was a bug

We published a basin. The serving binary was the hole. After the c7d8722 revert: 6/6 HIT at 198k. n=1 map of the fixed build.

Lab Notes: the KV verdict

The q8-to-q4 KV question from night 1 got its paired answer: same accuracy, zero tripwires, half the cache. Plus the label we had to correct in public when the server's counter beat our estimate.

Lab Notes: verdict night

A $1,400 mini-PC serving a 27B at 262k context asks one question: does capping thinking cost accuracy? The paired answer, the invalid first attempt it survived, and the doctrine that followed.

One mini-PC, one night, and the numbers that argued with themselves: tuning Qwen3.8-27B on Strix Halo

A fully measured night-and-evening of tuning a 27B dense model on a Strix Halo mini-PC: the honest bands, the reversal, the crash doctrine, and the EC detective story.

GPT-5.6 Sol vs. Terra vs. Luna: an evidence-based routing policy for coding agents

The practical GPT-5.6 split is Sol for discovery, Terra for bounded execution, and Luna for repeatable processing - with a different verification contract for each.

Agents need verifiable tools, not better prompt theater

The useful agent pattern is not a prettier prompt. It is a tool surface the agent can call, inspect, verify, and revise.

Repo history is a product signal

A repo is not just storage. It is evidence of decisions, repairs, release behavior, naming drift, test gaps, and what the builder actually knows how to finish.

Implementation help is part of the product surface

A useful open-source tool still needs a path from public repo to working environment. That path is product work, not an afterthought.

Why Kinocut matters

Kinocut gives AI agents callable handles on timelines, effects, Hyperframes, and finished media at kinocut.dev.

Infinite monkeys, LLMs, and the room around the machine

The argument behind the video: output quality is not just probability. It is architecture, filters, and human taste.

What a working AI tool needs before people can use it

A practical checklist for turning a working tool, workflow, or rough app into something other people can understand, install, and use.

MCP server implementation checklist

The checklist Kyanite uses to decide whether an MCP server is a toy, a usable tool, or something worth implementing.

Repo archaeology turns history into proof

Why commit history is one of the strongest proof sources for learning diagnostics, implementation help, and engineering trust.

AI discovery needs more than a sitemap

What Kyanite adds so search engines and AI assistants can understand the tools, products, proof, and support path.