"Should we self-host our LLMs?" stopped being a hobbyist question somewhere in late 2025 and became a real infrastructure decision. The tools got dramatically better this year, the cost crossover moved, and the failure modes are finally well-documented, because people have been running this in production long enough to hit them.

We've been running a hybrid inference stack at Adroit for months: cloud models for agentic workloads, a local llama.cpp server for background subsystems. Here's what changed in 2026, what the economics actually look like, and the four lessons our own infrastructure burned into us.

What changed in 2026: the tooling caught up

Three developments this year made "local" a defensible choice instead of a compromise.

Ollama shipped an MLX backend. On March 30, 2026, Ollama previewed 0.19 powered by MLX (Apple's unified-memory framework) instead of llama.cpp. On M5-class chips, their benchmarks show 1,851 tokens/s prefill and 134 tokens/s decode running Qwen3.5-35B-A3B with int4 quantization, versus 1,154/58 on the previous version. It also added NVFP4 quantization support and explicitly recommends a Mac with more than 32 GB of unified memory. 1

vLLM turned tool-calling into a first-class serving concern. vLLM 0.26.0 (July 27, 2026) shipped a new Streaming Parser Engine, a unified framework for parsing tool calls and reasoning traces as they stream, with parsers for Kimi k2.x, Seed-OSS, and DeepSeek V4. The same release pushed DeepSeek-V4 serving performance and matured KV offloading to secondary storage. 2 This matters because the hardest part of serving models for agents isn't throughput; it's reliably extracting structured tool calls from token streams. vLLM is treating that as a core feature now, not an integration problem.

Continuous batching finally reached Apple Silicon. A research implementation (vllm-mlx) reports 21–87% higher throughput than llama.cpp across models from Qwen3-0.6B to Nemotron-30B, with continuous batching scaling to 4.3× aggregate throughput at 16 concurrent requests. 3 The maintained project exposes OpenAI- and Anthropic-compatible APIs with paged KV cache, prefix cache, and SSD tiering. 4 Caveat: this is a community project, and mainstream vLLM on Apple Silicon is still not considered production-ready; the consensus framework is llama.cpp/MLX for local Macs, vLLM for GPU servers. 5

The economics: TCO, not token price

Comparing local vs cloud on per-token price alone is a trap; that's the through-line of every serious 2026 cost analysis. The real line items are electricity, operations labor, hardware depreciation, and the opportunity cost of a GPU failing at 2 AM. 6

The break-even point moved 40% lower since 2024. SitePoint's modeling puts medium-usage teams (3–5M tokens/day) reaching break-even against proprietary API pricing in roughly 18–24 months on consumer hardware, but the same analysis is blunt that cloud remains the rational choice for light usage, burst scaling, and frontier-model needs, and that hosted open-weight APIs (Together, Fireworks) undercut both proprietary APIs and self-hosting at light and medium tiers. 6

Two practical heuristics from the research:

  • Under ~1M tokens/day: cloud is almost always cheaper. Below $500–700/month of API spend, local hardware won't pay for itself inside 18–24 months. 7
  • At sustained volume, routing beats single-model math: a workload costing $50K/month at frontier rates can fall to $8–15K/month when 70% of calls route to smaller local models with quality-equivalent outputs. Cloud prices flattened in 2026, which is exactly why hybrid routing became the dominant cost story. 8

Adroit on the Ground: four lessons from a hybrid stack

We run a two-tier model architecture: cloud models for kanban agent workers (tool-calling, structured completion gates), and a local llama.cpp server (Qwen 35B-A3B MoE, Q4_K_M, port 8080) for background subsystems: context compression, title generation, triage, monitoring. That division wasn't theoretical. It's the result of four real failures.

Adroit's hybrid inference stack: requests from kanban agent workers and background subsystems hit a router that picks tiers by latency, cost, and data sensitivity, sending tool-calling and structured completion gates to cloud models, and free-text background work (context compression, title generation, triage, monitoring) to a local llama.cpp server running Qwen 35B-A3B MoE.
Adroit's hybrid inference stack: requests from kanban agent workers and background subsystems hit a router that picks tiers by latency, cost, and data sensitivity, sending tool-calling and structured completion gates to cloud models, and free-text background work (context compression, title generation, triage, monitoring) to a local llama.cpp server running Qwen 35B-A3B MoE.

Lesson 1: Memory is the budget you never plan for. A 22 GB model on a 64 GB Mac doesn't leave 42 GB of headroom; on macOS, -ngl 99 pins model weights as wired GPU memory that the OS can never page out. We've documented two distinct failure modes: a Jetsam kill (memory-pressure killer terminates the model process; wired memory at ~49 GB, only ~41 MB free at the moment of kill) and a full kernel panic (swap files past 10, memory compressor at 100%, forced reboot). The deeper root cause turned out to be a macOS GPU-driver bug (IOGPUFamily 130.15.2, July 13, 2026) that leaks wired memory over hours of inference; both oMLX and llama.cpp hit it. Our mitigation is a wired-memory watchdog that restarts the server when wired usage crosses 35 GB, flushing accumulated Metal allocations, per our infrastructure runbook's local-llm-hosting playbook (JetsamEvent 2026-07-22).

Lesson 2: KV cache math is unforgiving. For a 35B model, the KV cache runs roughly 1.3 MB per token. A 98K context window means a worst-case ~128 GB of KV cache per request, on a 64 GB machine that always swaps. The fix was boring and effective: cap the context window (32K), cap concurrency to 1, quantize the KV cache to 8-bit. If you self-host, compute this before you buy hardware, not after you start crashing; the math is worked out in our infrastructure runbook's oMLX/llama.cpp KV cache analysis.

Lesson 3: Tool-calling is the reliability boundary, and local models fail it. The single most expensive bug in our pipeline: a local Qwen Q4_K_M model began emitting empty {} objects for nested tool-call arguments, which silently broke the kanban completion gate; tasks could never validate as complete. Free-text reasoning stayed correct; structured tool-call JSON was broken. We moved every structured/tool-calling workload to cloud models and kept local for free-text subsystems. The industry is converging on this problem (see vLLM's streaming parser engine above), but in 2026, if your workload depends on strict structured output, test it on your chosen local model before committing, and plan a validation layer, as we documented after our kanban completion-gate failure (t_db6b0a22).

Lesson 4: Pin versions and check "what changed" first. Our oMLX server (MLX-format, port 8000) worked for weeks, then started exhausting swap. Three days of symptom-level fixes (capping caches, shrinking context, limiting concurrency) didn't help, because the trigger was an upgrade: oMLX 0.5.1 changed cache eviction behavior so the in-memory KV cache stopped being evicted under memory pressure. The fix was rolling back to 0.4.4, then migrating to llama.cpp entirely. When a working system breaks, diff the upgrade history and release notes before touching config, as our infrastructure runbook's oMLX 0.5.1 memory-regression entry (July 2026) documents.

A decision framework for clients

Putting it together, here's how we'd advise a team asking "should we self-host?" in 2026:

Adroit's 2026 self-hosting decision framework: under 500K tokens/day with no compliance constraint stays on cloud APIs, 1–10M tokens/day models the numbers with hosted open-weight likely winning on cost, and over 10M tokens/day or PII/regulated data takes local seriously via hybrid routing, with validation layers for agent tool-call workloads, and llama.cpp or mlx-lm on Apple Silicon dev nodes versus vLLM on GPU servers for production.
Adroit's 2026 self-hosting decision framework: under 500K tokens/day with no compliance constraint stays on cloud APIs, 1–10M tokens/day models the numbers with hosted open-weight likely winning on cost, and over 10M tokens/day or PII/regulated data takes local seriously via hybrid routing, with validation layers for agent tool-call workloads, and llama.cpp or mlx-lm on Apple Silicon dev nodes versus vLLM on GPU servers for production.

Your situationRecommendation
Under 500K tokens/day, no compliance constraintCloud API or hosted open-weight. Zero capex, no ops.
1–10M tokens/dayModel the numbers. Hosted open-weight likely wins on cost; go local for data-residency or latency reasons.
Over 10M tokens/day, or PII/regulated dataTake local seriously; hybrid routing (70% to smaller local models) is the cost story.
Agent / tool-call workloadsBudget for validation layers or keep on cloud. Verify structured output on your local model before committing.
Hardware choiceApple Silicon dev nodes → llama.cpp or mlx-lm; production multi-tenant → vLLM on GPU servers.

For teams that already run Kubernetes, the same decision shows up at the cluster level, which is where our Kubernetes LLM serving guide picks it up.

The bottom line

Local inference in 2026 is a legitimate infrastructure option, not a party trick: the break-even moved, the runtimes matured, and continuous batching finally exists on Apple Silicon. But "local" is an ops decision with real failure modes: wired memory, KV cache math, tool-call reliability, and version regressions. The teams that win treat it like infrastructure: compute the TCO, pin versions, watch memory, and route workloads to the tier that fits.

Note: cost figures come from published 2026 analyses using mid-2025 hardware/API prices; hardware prices and rate cards shift, so re-run the numbers before making budget decisions. Fortress infrastructure references reflect Adroit's own internal systems, generalized here for confidentiality.

Sources

  1. ollama.com. ollama.com

  2. github.com. github.com

  3. arxiv.org. arxiv.org

  4. github.com. github.com

  5. contracollective.com. contracollective.com

  6. sitepoint.com. sitepoint.com 2

  7. mindstudio.ai. mindstudio.ai

  8. vdf.ai. vdf.ai