Module FT20 — Serving Stacks

Serving Stacks

The serving runtime decision matrix and the no-telemetry/air-gap rules that gate sensitive deployments. vLLM for production, llama.cpp for air-gap, Ollama for dev (it collapses at ~5 concurrent users), MLX for Mac fleets — and the pre-load-then-sever recipe that makes any of them acceptable in a regulated subnet.

60
minutes
8
artifacts
4
sub-sections
You arrive with a quantized model from FT19. The question is what you run it with — and the answer is a routing function over three variables: audience (one user vs hundreds), hardware (CUDA vs Mac vs CPU), and telemetry posture (open vs regulated vs air-gap). Get the telemetry variable wrong in a healthcare or classified deploy and the model never ships, or it ships and you fail the audit. llama.cpp and vLLM never need to phone home; Ollama needs the network only for ollama pull; for a true air-gap you pre-load then sever.
Key Claims
Load-Bearing Claims

The serving choice is a routing function over three variables, not a ranking. Ask audience (one dev? team? hundreds?), then hardware (CUDA? Mac? CPU?), then telemetry posture (open? regulated? air-gap?). The runtime your variables point at: vLLM for NVIDIA production, llama.cpp for air-gap, Ollama for dev, MLX for Mac.

Ollama is a dev tool, not a production server — it collapses at ~5 concurrent users. Measured and reproducible: response times go from ~3s at one user to over a minute at five, because Ollama serializes requests and duplicates context per request (no PagedAttention, no real continuous batching). vLLM on the same hardware holds the workload at stable latency. The moment you have real concurrency, move to vLLM or TGI.

llama.cpp and vLLM genuinely never need to phone home. llama.cpp is a single binary with no network telemetry code path (safe by construction). vLLM is OpenTelemetry-native: it emits to a collector YOU configure — no vendor phone-home, no license check (safe by configuration). Ollama needs the network only for ollama pull; once local, block the network and bind OLLAMA_HOST=127.0.0.1. For a true air-gap, pre-load the models, then sever the network.

For Apple Silicon fleets, the runtime is MLX — and the architecture is federated local serving. MLX is built for unified memory (CUDA runtimes can't exploit it). 4-bit quantization (~75% reduction, minimal quality loss) from the mlx-community on HF. ~143 tok/s on Qwen3-VL-4B. Run MLX on each Mac, not one central server — there is no central target to breach, so the privacy property is structural.

After This Module
01
Place each major serving runtime — vLLM, llama.cpp server, Ollama, TGI, localai, MLX, SGLang, TensorRT-LLM — on the decision matrix (production vs dev, hardware breadth vs throughput, telemetry posture) and justify a pick for a given target environment.
02
State the no-telemetry rule of thumb: which stacks genuinely never phone home (llama.cpp, vLLM), which need the network only for model pulls (Ollama), and the pre-load-then-sever recipe for a true air-gap.
03
Predict when Ollama collapses (~5 concurrent users) and explain why (no PagedAttention, request serialization, per-request context duplication), then route that workload to vLLM or TGI.
04
Configure a production deploy pattern: bind to 127.0.0.1, expose an OpenAI-compatible endpoint, add concurrency limits and queueing, and choose the right Apple Silicon path (mlx-lm, 4-bit) for Mac fleets in regulated domains.
Artifacts