Fazal Shah.
Local LLMs

How to design a reproducible local LLM test

A measurement protocol for comparing local inference without inventing benchmark results.

Fazal Shah · Updated October 14, 2026
BENCHMARK DESIGNOne comparison. Four distinct measurements.
01
LoadMeasure startup and model-loading time.
02
RespondRecord the time until the first generated token.
03
GenerateMeasure generation throughput on a fixed output budget.
04
CompleteGrade task correctness, peak memory and responsiveness.
Measurement categories, not recorded hardware results. Keep cold and warm trials separate.

Define useful before fast

Pick a task before picking a winner. A coding comparison needs a test suite or a reviewed patch; an extraction task needs expected fields. Run the same workload on each configuration and keep the failures. Tokens per second tell you how output arrived, not whether it solved the problem.

Record the complete setup

Record the chip, memory, operating system, model version, inference engine version, quantization, context settings and prompt. Keep other applications and power settings consistent across runs.

Separate loading and generation

Report model-loading time, first-token latency and generation throughput separately. Distinguish cold and warm runs. Note whether compilation or cache reuse is included.

Measure memory under the real workload

Context length and simultaneous requests change memory use. Record peak memory and system responsiveness, not just the model file’s size. Avoid translating a model fitting in memory into a claim that it is practical.

Repeat and retain failures

Repeat each configuration, keep raw measurements and document failed or interrupted runs. Use consistent prompts and output limits. If a configuration cannot complete the task, report that outcome.

Publish limitations

Results describe a specific machine, model and workload. They do not prove that every model in the same size range will behave similarly. The M2 evidence below is an observed example; it is separate from this repeatable test protocol.

Download the blank benchmark CSV or visit the Local AI Lab.

Further implementation guides

Read the Mac setup guide and MLX versus Ollama comparison. These are documentation-led review editions; speed measurements remain pending.

Compare latency and throughput separately

A short interaction can feel slow even when its generation rate is high if loading or prompt processing delays the first token. Report time to first token, generation throughput and end-to-end latency as separate values. State whether the measurement begins before model loading, after warmup or at the request boundary.

For concurrent serving, distinguish aggregate output from per-request experience. Four requests producing a large combined token rate do not give each person that combined rate. Record average or per-request first-token delay and the output length used in the test. Check the benchmark implementation before assuming another tool uses identical metric definitions.

Keep a hardware specification ledger

Store chip name, CPU/GPU cores, memory capacity, nominal bandwidth and operating-system version. Memory capacity affects what can remain resident; bandwidth can affect decode performance when moving model data is the bottleneck. Neither specification is a measured token rate. Use the bandwidth guide for the distinction and keep hardware reference entries separate from machines actually tested.

The owner’s M3 Ultra screenshots now provide four result rows, with configuration and source images on the hardware-lab page. Exact RAM, advanced settings, model revision and repeat-run spread are still missing. Those limitations remain attached to the observations rather than being replaced with guessed values.

Prepare a repeatable run sheet

Create one configuration label for each distinct combination of model, quantization, context, cache policy and acceleration settings. Save the individual run number and timestamp. Record failed attempts in a separate outcome field rather than entering a zero as if it were a successful but slow generation.

Start with at least three identical runs for an initial inspection. Use medians to summarize the observations and retain the raw rows. With few trials, a percentile near the tail is often just the maximum and should not be described as a reliable service-level estimate. The benchmark analyzer exposes its calculation method so readers can interpret the summary.

Source context

Hugging Face’s memory-estimation documentation distinguishes loading a model from the additional demands of inference. Artificial Analysis publishes a methodology that separates latency and throughput across serving conditions. These references inform the measurement categories; no external leaderboard result is claimed as our own. Memory estimation; performance methodology.

Owner evidence: M2 Max 64GB

OWNER EVIDENCE / M2 MAX · 64GB

Measured workload, not a hardware ranking.

Owner-supplied oMLX v0.7.0 screenshots show Code (Python), 128 output tokens, and a model label beginning Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Opti… . The full artifact and quantization are not visible.

M2 Max 64GB · displayed observations · repeat-run spread unknown
Input / batchGeneration tok/sTTFT msE2E secondsPeak GB reported
1024 / 1×811076.32.66219.89
4096 / 1×78.43956.55.59521.79
1024 / 2×133.22085.74.47Not shown
1024 / 4×213.13871.28.526Not shown

At 2× and 4× batching, generation is aggregate throughput, not the rate each user receives. The screenshot reports 1.64× and 2.63× speedup.

All-time serving: a separate view

Prefill tokens (rounded)72.9M
Cached tokens (rounded)69.8M
Displayed cache efficiency95.7%

The All-Time / All Models dashboard reports 215.6 tok/s prompt processing excluding cached tokens and 33.2 tok/s generation. Its date range, model mix and request count are unknown. These are mixed-use averages, not another benchmark or proof of a latency/cost saving. The empty Today history does not invalidate the all-time counters.

The M2 Max specification is 400 GB/s memory bandwidth; the M3 Ultra is 819 GB/s. The supplied tests use different artifacts and oMLX versions (v0.7.0 versus v0.5.4), so their token speeds cannot isolate bandwidth or establish which chip is faster. Inspect both datasets, bandwidth sources and original screenshots →

FIELD VERDICT / REPORTED BY FAZAL SHAH

More memory didn’t fix the model. Finding the right model did.

Even our M3 Ultra Mac Studio with 256GB unified memory could run models that failed to do the work we needed. Qwen3.6 35B MoE became our sweet spot for agentic AI, coding and basic operations.

What worked in our setupQualitative experience · no accuracy scores or ranked benchmark
  1. Smaller models tried

    Frequent hallucinations and insufficient reasoning for our OpenClaw workflows.

    Did not meet our needs
  2. Other Qwen variants

    The variants we tried did not sustain the agent workflows we needed.

    Did not meet our needs
  3. “Mistral 70B” — owner’s label

    Still unsuccessful in our setup, including on the 256GB M3 Ultra. Exact artifact unconfirmed.

    Did not meet our needs
  4. Qwen3.6 35B MoE

    Worked for our agentic AI, coding and basic operations; our preferred model among those tried.

    Our operational sweet spot
REPORTED OPERATIONAL OUTCOME16 OpenClaw agents

Running in parallel for months of basic operations, according to the owner’s experience with Qwen3.6 35B MoE.

Our recommendation: test the workflow before buying more RAM.

For an OpenClaw setup like ours, start by evaluating this 35B MoE model against the tasks your agents actually perform. Check reasoning, hallucinations, tool use and completed work, then measure latency and memory. A model fitting into RAM does not establish that it can run the workflow successfully.

Evidence scope and how to read this verdict

This is Fazal Shah’s retrospective account of models tried in his own setup, not a universal claim that other models fail. “Failed” means the model did not meet his operational needs; it does not necessarily mean it failed to load. Smaller models reportedly hallucinated and could not support the reasoning and work required by his OpenClaw agents.

Exact alternative model repositories, quantizations, dates, prompts, failure counts and intervention rates have not been supplied. “Mistral 70B” preserves the owner’s wording, not a verified model identifier. The 16-agent account does not establish 16 simultaneous inference requests, uninterrupted uptime, unattended operation or a measured success rate. Its exact machine allocation and deployment artifact remain unconfirmed.

The screenshot benchmarks test 1×, 2× and 4× batching with 128 output tokens, not the 16-agent operational deployment. They show Qwen3.6-35B-A3B-8bit on the M3 Ultra and a differently named, truncated artifact on the M2 Max. They cannot independently verify months of agent operation or identify the exact deployment artifact.

Next evidence to collect: a redacted OpenClaw agent roster, dated run history, exact model artifact and configuration, representative completed tasks, failed attempts and human interventions. Keep task quality and throughput as separate measurements.

WHEN THE TOOL ISN’T ENOUGH

Bring the problem. We’ll scope the next step.

Something in your workflow keeps breaking, or your team is doing the same manual work every week.

Send the current setup, what failed, and the result you need. I can help with software integrations, local AI infrastructure, agent permissions, failure recovery and deployment.

Useful first details: system or runtime, expected workload, data restrictions and one redacted example. Don’t send credentials or private customer data.
About the author

Fazal Shah builds AI systems, automation and software products. Based in Pakistan, working with a global audience. About Fazal →