Back to AI/ML Overview
🧪 Field Notes · Living Document · Updated 2026-07-05

Local LLM Field Notes — Evaluating Open-Weight Models on Apple Silicon

A first-hand friction log from running open-weight models locally on a MacBook Pro M4 Max with 128 GB of unified memory — GLM-4.5-Air in MLX-4bit and GGUF, the memory math that rules out the 750B-class models entirely, and the Ollama-versus-LM-Studio reality on Apple Silicon. Not many people have actually sat down and evaluated these specific models on this specific hardware. This is what actually happens when you do — the errors, the format-versus-engine traps, and the dimensions the “just run it locally” crowd forgets to price in.

First-handM4 Max · 128 GBDated friction logHonest recommendation
Living DocumentField notes — updated as the evaluation continues.Last updated 2026-07-05
M4 Max
The test rig
128 GB
Unified memory
56 GB
GLM-4.5-Air MLX-4bit
~410 GB
What GLM-5.2 (750B) needs
2 engines
MLX + llama.cpp
Frontier
Verdict for production

🎯The one-line position

🔑The whole page in one sentence
Frontier API for production velocity and trust; open-weight locally only when data-gravity or compliance forces it — and then you budget for being your own ops, , and security team.

This isn't a “cloud good, local bad” take. It's the opposite of a lazy one: I ran the local path, hit the walls first-hand, and the walls are where the honest recommendation comes from. A recommendation to use the frontier API is only credible if you actually measured the alternative — so I did, on real hardware, and logged every place it bit.

⚖️The 10-second verdict

Seven dimensions, both stacks, no hedging. This is the summary the friction log below earns line by line.

Capability ceiling
Open-weight localThe top of the open leaderboard is a datacenter proposition, not a laptop one
Frontier APIFrontier by definition — no hardware question to answer
Ops burden
Open-weight localYou are the ops team: formats, engines, quant math, memory budgeting
Frontier APIZero — it's an HTTP call
Updates
Open-weight localStatic weights; every release is a multi-GB re-download and re-eval
Frontier APIContinuous; a new snapshot is a one-line model-string change
Trust / provenance
Open-weight localYou verify weights, licenses, and alignment yourself
Frontier APIVendor-accountable, published safety work, contractual terms
Privacy
Open-weight localData never leaves the machine
Frontier APIContractual (no-train commitments, retention windows)
Cost shape
Open-weight localCapEx (hardware) + your time
Frontier APIOpEx per token; zero at idle
“Self-learning”
Open-weight localNeither learns in deployment — see the myth-buster below
Frontier APISame — but managed context and caching narrow the gap

📖Open source vs open weight vs closed — three different contracts

These three terms get used interchangeably, and they are not the same contract. What you can inspect, reproduce, and depend on differs at each tier — and most of what gets called “open source AI” is actually the middle column.

Open source
  • You get: weights + training code + data recipe. The full pipeline is inspectable.
  • You can: audit, reproduce, retrain from scratch, fork the whole lineage.
  • Examples: OLMo 2 (AI2, Apache-2.0), Pythia (EleutherAI, Apache-2.0), BLOOM (BigScience, RAIL).
Open weight
  • You get: the trained weights to download and run. Training data and code stay private.
  • You can: self-host, fine-tune, quantize — but never fully audit or reproduce how it was made.
  • Examples: GLM-4.5-Air (MIT), DeepSeek-R1 (MIT), Qwen (mostly Apache-2.0), Llama (custom license), Mistral (Apache-2.0), Gemma (Google terms).
Closed
  • You get: an API. Weights, code, and data all stay with the vendor.
  • You can: build on capability + contractual terms — with zero infrastructure and no reproducibility at all.
  • Examples: Claude, GPT-5 family, .
💡Where this page's test subject sits
GLM-4.5-Air is open weight under MIT — the most permissive corner of the middle column, and genuinely so. But note what even MIT weights don't give you: the training data, the training code, or any way to reproduce or audit the run that produced them. “Open weight” is a distribution model, not a provenance guarantee — which is why the trust items below apply even to the friendliest license.

📓Friction log — dated, first-hand

The running log. Newest entries sit at the top; each one is a place the local path actually broke or surprised me, with the fix and the talking point it earned.

2026-07-05

First conversation with GLM-4.5-Air: 16 minutes, 6,120 tokens, stopped by hand

With the runtimes fixed and the 56 GB model finally loaded, I asked one three-part question I already knew the answers to: the 750B memory math, a tokens/sec estimate for itself, and its own active-parameter count. A self-grading exam. It was sent at 02:41:58. I pressed Stop at 02:57:53.

Wall clock
15 m 55 s — then user-stopped
Measured speed
7.21 tok/s decode · ~26 s to first token
Tokens generated
6,120 — most of them thinking or looping
Its own estimate
“50–100 tok/s” — 7–14× off, disproved by its own stats line

The scorecard: the 750B memory math was clean — 375 GB at 4-bit against 128 GB, “physically impossible,” correct. Everything else fell over, and the ways it fell over are the finding:

  • 1.It doesn't know what it is. Mid-reasoning it decided it was “a 1.2B parameter model (as per the name ‘Air’, which typically indicates a smaller version)” — it is a 106B-parameter with ~12B active. A model's training data predates the model itself; hosted APIs paper over this with an injected identity prompt. A raw checkpoint has no idea who it is, and every downstream answer inherited the error.
  • 2.It contradicted itself — the summary said the dominant factor was “GPU compute power,” the body said “memory bandwidth.” (The body was right.)
  • 3.It arithmetic — a theoretical throughput of “60 × 10⁹ tokens/s.” Sixty billion tokens per second.
  • 4.Then it ran away. After answering, it emitted a raw <|user|> chat-template token, invented a follow-up question from a fictional user, renamed itself “GLM-4.5-Airlite,” answered its own invented question, repeated the summary twice, and was starting a third round when I stopped it. Stop-token and chat-template discipline is another ops surface you own locally — one the API world solved so long ago you forgot it existed.
The full runaway answer: self-invented user turns, repeated summaries, and the final stats line — 7.21 tok/sec, 6120 tokens, stop reason User Stopped
The whole runaway, scroll to believe it — the self-invented <|user|> turns, the second summary, and at the very bottom the receipts: 7.21 tok/sec · 6,120 tokens · Stop reason: User Stopped — measured by the same window in which the model claimed “50–100 tokens/sec.”
🔑The compounding, not the bugs
Slow visible thinking × a wrong self-model × no stop-token discipline = confidently wrong, slowly, twice. These aren't five independent bugs — they're what “no ops team” looks like end to end. My honest note from the session, on a top-spec M4 Max with a correctly installed stack: as an AI-native builder I don't have the hardware — or the patience — to run this locally.
2026-07-05

LM Studio: “No LM Runtime found for model format 'safetensors'!”

The 56 GB MLX-4bit model downloaded cleanly. Then LM Studio refused to load it: No LM Runtime found for model format ‘safetensors’. The model file sitting on disk meant nothing — there were zero inference engines installed. The first-launch runtime fetch had silently failed, so the app had a model and no way to run it. The fix is lms runtime from the CLI — pull the MLX and llama.cpp runtimes explicitly, and the same model loads instantly.

GGUF
Needs the llama.cpp engine.
MLX safetensors
Needs the MLX engine (Apple-Silicon-native).
Raw HF safetensors
Needs neither as-is — requires conversion first.
⚠️The hidden ops surface, in one error message
A managed API has no equivalent failure mode. “The download finished” and “the model runs” are two different milestones locally, separated by a runtime layer you have to understand and provision yourself.
2026-07

GLM-5.2 (750B class) does not fit in 128 GB

Before downloading anything, do the arithmetic: memory ≈ params × bytes-per-param. At a 4-bit quant, that's roughly 0.55 bytes per parameter. A 750B-parameter model is therefore on the order of 410 GB just for the weights — before context, activations, and . 128 GB of unified memory cannot hold it at any practical quant. “Open” does not mean “runnable.” The top of the open-weight leaderboard is a datacenter proposition — H100s, not a laptop.

The workable fallback — GLM-4.5-Air (106B ):

GGUF Q4 · Ollama
~72 GB · around 7 tokens/second.
MLX-4bit · LM Studio
~56 GB · faster decode via Metal.
💡The talking point
Companies comparing “free open model” against a paid API almost never price the H100s into the “free” side. The bytes-per-param math is the fastest way to puncture that.
2026-07

Ollama vs LM Studio — same model family, two stacks

Ollama

via llama.cpp, headless, an OpenAI-compatible endpoint on :11434/v1, service-style UX. Great for scripting and headless / server use.

LM Studio

A GUI, MLX on Apple Silicon (noticeably faster decode on M-series thanks to Metal and unified memory), an OpenAI-compatible endpoint on :1234/v1.

🔑The architecture lesson hiding in a tooling comparison
Both expose OpenAI-compatible APIs. Application code can switch between them — and between either of them and a frontier vendor — with a base-URL change. design is what makes the whole cheap. Wire your app to one vendor's SDK shape and swapping models is a refactor; speak a neutral endpoint and it's a config line.

New dated entries get appended to the top of this log as the continues.

🧭The dimensions people forget to ask about

When the ask is “evaluate open-source for us,” the conversation usually stops at benchmark scores and token cost. The dimensions below are where local-versus-hosted is actually decided — and they rarely make the first draft of anyone's comparison.

Trust & provenance
  • Weights supply chain — tens of GB of numbers from a model hub; who attests they match the paper? Poisoned fine-tunes are a real class.
  • Licensing — “open” spans a real range: GLM-4.5-Air is MIT — genuinely permissive, credit where due — while others ship Apache-2.0, custom acceptable-use (Llama-style), or research-only terms. The point isn't that open licensing is bad; it's that it's heterogeneous — legal review per model, per version.
  • Alignment & safety — labs publish safety and stage rollouts; an open fine-tune has whatever its last fine-tuner gave it.
  • Jurisdiction — some open carry procurement / geopolitical questions a US-based vendor doesn't.
Updates as depreciation

Local weights are a depreciating asset. Hosted: the model improves under a stable API, and migration is a one-string change plus a re-run of your . Local: every release is a multi-GB re-download, a re-, a fresh , and possibly an engine upgrade. Security patches to llama.cpp or MLX become your patch cadence.

The you ran last quarter is stale the day a better open model drops — and your switching cost is measured in downloads and ops, not a config line.

⚠️The “self-learning” myth-buster — say this one carefully

No deployed self-learns. Weights are frozen at training time. A chat that “remembers” is doing context management — retrieval, memory files, caching — not learning. True for both local and hosted. What people actually mean, and the honest answer to each:

  • “Adapt to our data” / context engineering. Works with either stack.
  • “Get better over time” → hosted: the vendor ships better models. Local: you fine-tune (/) — real, but an project with a data pipeline, harness, regression risk, and catastrophic-forgetting hazards.
  • “Learn from each conversation” → a memory architecture (explicit, auditable stores) — an application-layer concern, not a model property.
💬“Your data becomes their feature”

A version of this argument made the rounds on a major tech podcast recently: to use a frontier API, you ship your data to the vendor with every session — and the vendor may learn from your usage and ship your workflow back to the world as a feature.

Concede what's true first. Data does cross the wire. And vendors do learn from aggregate usage patterns — which tools get called, where models fail, what people build. That's product telemetry, and it is how every platform (AWS, GitHub, Figma) has always evolved. The contractual line: enterprise API terms carry no-train commitments and bounded retention for your verbatim data. The distinction that matters is verbatim training (contractually barred) versus aggregate pattern-learning (real — and universal to SaaS).

The part the argument skips: the flywheel spins whether you join it or not. Opting out doesn't stop the vendor from learning — it removes you from the compounding, while everyone else's usage keeps improving models you no longer benefit from. Meanwhile the local weights you downloaded learn from no one — not even you. Six months later the frontier has compounded; your local model is exactly where you left it. You didn't protect your edge; you froze it.

The engineering answer is routing, not boycott: classify your data, keep the truly-sensitive workloads local (the legitimate data-gravity case), and ship the rest through contractual controls — the same committee/ pattern as everywhere else in these notes.

discipline

Whichever stack you pick: no means no . Vibes are not a benchmark. Task-specific golden sets, regression runs on every model, quant, and engine change. And the silent trap: is a quality knob — Q4 vs Q8 vs MLX-4bit of the same model are, for purposes, different models.

This is exactly the discipline the Observability & survey is about; a local without a harness is just a demo.

Honest cost math
  • Local — hardware CapEx, electricity, and the expensive part: engineer time on ops. Zero marginal token cost.
  • Hosted — linear per-token OpEx, zero idle cost, zero ops.
  • Crossover exists only at sustained high volume with a stable model choice — which the depreciation problem actively undermines.

🟢Where local genuinely wins

Local isn't a loser — it's a specialist tool. It wins decisively in four situations, and pretending otherwise is as lazy as pretending it's always better.

Data-gravity / compliance
PHI, air-gapped networks, data that contractually cannot leave the building. When the data can't move, the model comes to the data.
Offline / edge
No connectivity, and a deterministic latency floor with no network variance.
Unlimited-volume tasks
Classification, extraction, synthetic-data generation where mid-tier quality is fine and token volume is enormous. Zero marginal cost finally pays off.
Negotiating leverage
Real local evals keep vendor pricing honest and prove the multi-model routing story — see the Model Committee routing patterns.

Recommendation

The credible recommendation is the one that measured the alternative. Mine, in three moves.

1

Default to the frontier API for production

Frontier capability, a published safety posture, US jurisdiction, zero ops surface, continuous improvement under a stable API. Production velocity and trust are the whole game, and the API wins both.

2

Run the local anyway

Actually stand up GLM-4.5-Air on both Ollama and LM Studio/MLX and run it through the same harness. Not to deploy it — to earn the recommendation. A vendor recommendation with no measured alternative is an opinion; one with a local behind it is a finding.

3

Design so the decision stays reversible

Wire the application to OpenAI-compatible endpoints and a model-routing layer so the local-versus-hosted choice is a config change, not a rewrite. Architecture is the hedge, not vendor loyalty. This is the posture — and it's why Mnemos, my local-first personal , can swap between a local Ollama model and a frontier vendor per question with a single setting.

🎯

Leadership Takeaway

The instinct to “just run open-source locally to save money and keep data private” is half-right in a way that costs teams months. Privacy and cost are real advantages — but they arrive bundled with an ops, provenance, , and depreciation bill that the leaderboard screenshot never shows. The mature move is to design so the choice is reversible, default to the frontier API for production velocity and trust, and reserve local for the genuine data-gravity and compliance cases where the data simply cannot move. Measure the alternative, price the whole bill, and keep the architecture so next quarter's better model is a config line — not a migration.