Skip to content
Nekowebops
Local AI & AgentsData-backed

Testing a local LLM one question at a time hides the failure: what we measured on a 64 GB Mac

On a 64 GB Mac, two local models both scored 6/6 one question at a time. With the same questions bundled into one context, they scored 9/18 and 17/18.

By the Nekowebops team · · 6 min read

Measured August 17, 2026 · Apple M1 Max 64 GB · Ollama 0.32.14

  • Local LLM
  • Agents
  • Benchmarking
  • Apple Silicon
  • Test design
  • 6/6 · 6/6

    one question at a time: both models correct

  • 9/18 vs 17/18

    same questions bundled: MoE vs dense

  • 0/3 vs 2/3

    fully correct bundled runs

  • ≈2.1×

    decode speed, yet similar wall-clock time

Why we ran this test

We run local models inside coding-agent setups, where the model reads files with read-only tools and answers questions about a codebase. The usual way to check such a model is to ask one question and see whether the answer is right. We wanted to know whether that check is enough.

We found the gap by accident. A loop let the agent process swallow its standard input, so questions 2 to 6 reached the model as one large prompt instead of five separate ones. The results looked different enough that we turned the bundled condition into a formal test.

This post reports that test. It is a small observation about how to test, not a ranking of models.

A one-question test would never have shown the gap.

The setup

Everything ran on one machine, one model at a time.

Machine
One Apple Silicon Mac: M1 Max, 64 GB
Runtime at the time
Ollama 0.32.14, one model loaded at a time
Model A
A mixture-of-experts (MoE) model, 35B-A3B, about 3B active parameters (Qwen3.5 family), Q4_K_M
Model B
A dense 27B model (Qwen3.8 family), Q4_K_M
Task
Answer questions by reading our own codebase with read-only tools (read, grep, find, ls), through the same agent harness we use day to day
Scoring
Exact match against a human-verified answer key
Test setup
  1. Task

    A question with an exact answer a person has verified

  2. Agent harness

    The same one we use day to day; read-only tools: read, grep, find, ls

  3. Local model

    MoE or dense, one loaded at a time

  4. Scoring

    A script checks exact match against the human-verified key

How each run was set up and scored.

A mixture-of-experts model uses only part of its parameters for each token (about 3B here); a dense model uses all of them. We do not publish file names, setting names or code from the codebase, so the tasks are described in general terms.

What we asked

Six questions, each with an exact answer that a person had verified.

  1. 1List 15 settings that share one prefix.
  2. 2Follow a chain of three causes and name a check id, the function behind it and a constant.
  3. 3Give the exact value taken by one branch.
  4. 4Reason about what an “any element matches” test returns on an empty list.
  5. 5Give the line numbers where a string appears, leaving out comments.
  6. 6Count how many times one expression occurs.
The six questions, described generically

Result 1: one question per run

First we asked the six questions one per run. Both models answered all six correctly.

The MoE model needed 137.3 seconds in total and the dense model 417.4 seconds, so the dense model was 3.0x slower. On quality, though, the test showed no difference at all.

Time per question, one question per run

Seconds for each of the six questions. Both models answered all six correctly; the dense model took longer on every question.

MoEDense
  1. Q1
    17.5
    43.9
  2. Q2
    21.0
    135.3
  3. Q3
    29.2
    121.0
  4. Q4
    48.1
    67.6
  5. Q5
    15.7
    31.5
  6. Q6
    5.8
    18.1
Total · MoE
137.3 s
Total · Dense
417.4 s
View data as table
One question per run: time in seconds
QuestionMoEDense
Question 117.543.9
Question 221.0135.3
Question 329.2121.0
Question 448.167.6
Question 515.731.5
Question 65.818.1
Total137.3417.4
Correct6/66/6

If we had stopped here, we would have concluded that the two models are equally reliable for this work.

Result 2: bundled in one context

Then we put the same six questions into one context and ran that bundle three times per model: 18 sub-answers per model.

The gap that one-question tests hid shows up immediately.

Bundled context: every sub-answer, run by run

Three runs per model, six sub-answers per run. A tick is an exact match; a cross is wrong; the hatched row is a run that produced no output at all.

CorrectWrongNo output

MoE

Q1Q2Q3Q4Q5Q6Score

Dense

Q1Q2Q3Q4Q5Q6Score
View data as table
Bundled context: correct answers and time per run
RunMoEDense
Run 10/6 · 187.7 s
Empty output
6/6 · 375.5 s
All correct
Run 24/6 · 168.9 s
One item dropped, one wrong yes/no
5/6 · 346.8 s
All 15 items right, plus 2 invented names (17 items)
Run 35/6 · 155.5 s
An expression and a local variable instead of a function name and a constant name
6/6 · 364.4 s
All correct
Total9/18 (50%)17/18 (94%)

Bundled condition at a glance

Correct sub-answers out of 18, fully correct runs out of 3, and mean time per bundled run.

MoEDense✓ = correct / completed · · not

Correct sub-answers

Fully correct runs

Mean time per run

View data as table
Bundled condition at a glance
MeasureMoEDense
Correct sub-answers9/18 (50%)17/18 (94%)
Fully correct runs0/32/3
Mean time per run170.7 s362.2 s

MoE: 9 of 18 (50%), no fully correct run (0 of 3), mean time 170.7 s. Dense: 17 of 18 (94%), fully correct runs 2 of 3, mean time 362.2 s, which is 2.12x slower than the MoE model.

In the MoE model's run 1, the process exited silently after 187.7 seconds: zero bytes on standard output and standard error.

How the two models failed

A count of correct answers does not show how a run goes wrong, so we also recorded the failure modes.

What went wrong, by type

Failure modes counted in sub-answers (one question in one run). The MoE model's silent run alone accounts for six.

MoEDense1 square = 1 sub-answer
MoEDense
Silent empty output
Dropped item
Wrong yes/no
Shallow reasoning
Fabricated items
View data as table
What went wrong, by type
Failure modeMoEDense
Silent empty output60
Dropped item10
Wrong yes/no10
Shallow reasoning10
Fabricated items01

MoE model, under load

  • Silent empty output: in run 1 the process exited with nothing on standard output or standard error.
  • Dropped items: one of the 15 list items was missing, and one yes/no answer was wrong.
  • Shallow reasoning: it stopped at a surface level and did not follow the call chain to the real function and constant.

Dense model

  • Fabrication: all 15 real items plus 2 names that do not exist.

For a role that delegates judgement, we consider a silent empty run the more harmful failure.

Decode speed versus wall-clock

Speed claims usually quote decode speed: how many tokens per second the model writes. A real agent run also has prefill, the model reading everything it is given, here the files the agent opens. We measured both on the dense model, with the same prompt, warm, thinking off.

Decode speed versus wall-clock time (dense model, two engines)

Three runs each. The MLX engine decoded faster, but the bundled run took about the same time.

Dense, Q4_K_M (GGUF)Dense, MLX (nvfp4)◆ Mean

Decode speed, tok/s (longer bar = faster)

Dense, Q4_K_M (GGUF)

9.2 / 8.7 / 7.2 tok/s

Dense, MLX (nvfp4)

18.3 / 18.2 / 17.2 tok/s

≈2.1× faster decode (MLX vs GGUF)

Wall-clock time, seconds (shorter bar = faster)

Dense, Q4_K_M (GGUF)

529.4 / 468.0 / 447.8 s · Mean 481.7

Dense, MLX (nvfp4)

639.8 / 338.5 / 498.3 s · Mean 492.2

Wall-clock: no meaningful difference

Why: most of a real agent run is prefill, the model reading the files it is given, which decode speed does not measure.

View data as table
Decode speed versus wall-clock time (dense model, two engines)
VariantRun 1Run 2Run 3Mean
MoE, Q4_K_M · tok/s39.940.040.0—
Dense, Q4_K_M (GGUF) · tok/s9.28.77.2—
Dense, Q4_K_M (GGUF) · s529.4468.0447.8481.7
Dense, MLX (nvfp4) · tok/s18.318.217.2—
Dense, MLX (nvfp4) · s639.8338.5498.3492.2

The MLX engine decoded about 2.1x faster than GGUF. On the bundled six-question run, though, wall-clock time was about the same: a mean of 481.7 s for GGUF and 492.2 s for MLX, with no meaningful difference. Most of the time in a real agent run goes to prefill (reading files), not to decode.

Both variants answered correctly on the questions not affected by a later code edit (see the limits below).

The speed ratio between the MoE and dense models also depends on the prompt: 4.8x in this test (40.0 versus 8.4 tok/s) and 7x in an earlier one. Please do not quote 7x as a general number.

What we do now

  1. Test agents with the load shape they will really face: long, bundled context, not only one question at a time.
  2. Record failure modes, not only a score: silent empty output, dropped items, shallow reasoning, fabrication.
  3. Treat decode tokens per second as a poor proxy for task time when prefill dominates.
  4. Score with a script against a human-verified key, and keep the raw logs.
  5. State the setup and the limits. Do not turn n=3 into a leaderboard.

Limits and caveats

  • This is a small test: 6 questions x 3 runs x 2 models, one machine, one codebase, n=3 per cell. It is an observation about test design, not a model ranking.
  • The software has moved on. The Ollama stack used here has since been replaced in our setup by llama.cpp. Model families are named as tested, and results may differ today. We claim nothing about current versions.
  • The speed condition was run after a code edit changed the answer to one question (question 5), so that condition is compared on the other five questions only.
  • The hardware is Apple Silicon, not NVIDIA. Do not mix these numbers with numbers from other people's setups.
  • Scoring was exact match against a human-verified key. A first visual pass missed one fabrication in the dense model's run 2, and a script corrected it: always score with a script.

Try it on your own agents

You do not need our code to apply the same idea.

  1. Write tasks that have an exact answer a person has verified, so a script can score them.
  2. Run each task alone, then bundle them into one long context the way your real runs look.
  3. Repeat each condition several times and keep the per-run results.
  4. Record the failure type for every wrong run: empty output, dropped item, shallow reasoning, fabrication.
  5. Measure real wall-clock time, and measure decode speed separately.
  6. Score with a script and keep the raw logs.
  7. Write down the setup and the limits next to the results.

The raw records

run log (verbatim)

[qwen3.5:35b-a3b] C1 done 187.7s[qwen3.5:35b-a3b] C2 done 168.9s[qwen3.5:35b-a3b] C3 done 155.5s[qwen3.8:27b] C1 done 375.5s[qwen3.8:27b] C2 done 346.8s[qwen3.8:27b] C3 done 364.4s
The only timing records from the bundled runs, copied verbatim from the logs. C1 to C3 are the three runs.
Output size and time per bundled run
ModelRunOutput (bytes)Size barSeconds
MoERun 10 ⚠187.7
MoERun 2475168.9
MoERun 3488155.5
DenseRun 1495375.5
DenseRun 2533346.8
DenseRun 3495364.4
The MoE model's first run wrote zero bytes to standard output and standard error and exited silently.
Per-question record, bundled runs
QuestionMoE
Run 1
MoE
Run 2
MoE
Run 3
Dense
Run 1
Dense
Run 2
Dense
Run 3
Question 1No outputWrongCorrectCorrectWrongCorrect
Question 2No outputCorrectWrongCorrectCorrectCorrect
Question 3No outputCorrectCorrectCorrectCorrectCorrect
Question 4No outputWrongCorrectCorrectCorrectCorrect
Question 5No outputCorrectCorrectCorrectCorrectCorrect
Question 6No outputCorrectCorrectCorrectCorrectCorrect
Wrong sub-answers: MoE run 2, Q1 (one of 15 items dropped) and Q4 (yes/no flipped); MoE run 3, Q2 (an expression and a local variable instead of a function and a constant name); dense run 2, Q1 (all 15 right plus 2 invented names).

Glossary

MoE (mixture of experts)
A model that uses only part of its parameters for each token.
Dense model
A model that uses all of its parameters for each token.
Prefill
The stage where the model reads everything it is given, such as the files an agent opens.
Decode
The stage where the model writes its answer, token by token.
tok/s
Tokens per second: how fast decode runs.
Wall-clock time
The real time from start to finish of a run, prefill and decode together.
Exact match
A sub-answer counts only if it equals the human-verified key exactly.

Data & methods

Download the data

The records behind this article, as plain files. Each CSV starts with a short README header.

# Source: our own run logs, measured August 17, 2026 on Apple M1 Max 64 GB with Ollama 0.32.14. Scored by script. The correct answers are not published. Licence: not yet specified.

References

  1. Run logs and answer key. Our own run logs, re-scored by exact match against a human-verified key. Kept by the team; the key is not published.
  2. The data files above. Every number in this article is in them.

Ready to grow your business with Nekowebops?

Tell us about your business and we will take it from there.

Get Started
The smiling Nekowebops cat mascot working on a laptop