| I want to… | Use |
|---|---|
| Run models with minimal setup, pull from a registry | Ollama |
| Maximum generation speed for a coding agent (Claude Code, Cursor, Aider) | Rapid-MLX |
| Serve a specific HuggingFace model not in Rapid-MLX’s alias list | mlx-lm |
| Add embeddings or reranking to a RAG pipeline | Infinity |
| Pool multiple Macs to run a model too large for one machine | Exo |
| Setup | Tools |
|---|---|
| Solo node, general use | Ollama only |
| Solo node, coding agent (Claude Code / Cursor) | Rapid-MLX + Infinity |
| Solo node, RAG app | Ollama + Infinity |
| Solo node, custom HuggingFace models | mlx-lm + Infinity |
| Multi-Mac cluster | Exo + Infinity on a dedicated node |
| Dimension | Ollama | Rapid-MLX | mlx-lm | Infinity | Exo |
|---|---|---|---|---|---|
| Primary use | General inference + model management | Max speed + tool calling | Raw HF model serving | Embeddings + reranking | Distributed inference |
| API | OpenAI-compatible | OpenAI-compatible | OpenAI-compatible | OpenAI-compatible | OpenAI-compatible |
| Default port | 11434 | 8000 | 8080 | 7997 | 52415 |
| Install method | curl install.sh |
brew / pip3 |
pip3 |
pip3 |
brew / pip3 |
| Model source | ollama pull <model> |
Alias-based (rapid-mlx models) |
HuggingFace repo ID | HuggingFace repo ID | Auto via cluster |
| Apple Silicon acceleration | Metal (MLX backend preview) | Native MLX | Native MLX | MPS (--device mps) |
MLX per node |
| Prompt caching | Partial | Yes, incl. DeltaNet for RNN hybrids | No | N/A | Partial |
| Tool calling | Basic | 17 parsers + auto-recovery | No | N/A | Basic |
| Reasoning separation | No | Yes (Qwen3, DeepSeek-R1) | No | N/A | No |
| Built-in diagnostics | Log inspection | rapid-mlx doctor |
Log inspection | Log inspection | Log inspection |
| Runs as | LaunchDaemon (root) | LaunchDaemon (root) | LaunchDaemon (root) | LaunchDaemon (root) | LaunchAgent (user) |
| Maturity | Stable | Beta (v0.6, April 2026) | Stable | Stable | Beta |
| Best for | General use, easy model management | Coding agents, max speed | Custom HF models | RAG embeddings | Multi-Mac clusters |
Strengths
ollama pull, ollama list, ollama runnum_ctx and sampling parameters into model metadata — the only
way clients see the correct context window (see docs/modelfile-guide.md)Weaknesses
num_ctx must be set via Modelfile, not the UI — Ollama UI override does not update
the metadata that clients readWhen to choose Ollama
Rapid-MLX is a production-grade MLX-based inference server built specifically for Apple Silicon. It reimplements the serving stack with continuous batching, optimised prefill chunking, DeltaNet state snapshots, 17 tool-call format parsers with auto-recovery, and reasoning/content separation for Qwen3 and DeepSeek-R1.
Previously benchmarked at 2–4.2× faster than Ollama. Since Ollama 0.19 adopted the MLX backend on Apple Silicon (March 2026), the raw generation speed gap has narrowed to ~15–30%. Rapid-MLX retains meaningful advantages in serving sophistication over Ollama 0.19.
Strengths
--no-thinking flag strips reasoning tokens)rapid-mlx doctor built-in self-diagnostic--prefill-step-size 8192 fixes slow cold-start on long promptsWeaknesses
rapid-mlx models) don’t cover every HF model — use mlx-lm for thoseserve downloads the model — API unavailable until download completespip install 'rapid-mlx[vision]'MAX_LOADED_MODELS, or the node can be overcommitted. headless-macs
precheck warns when both are enabled together, but does not currently
adjust Ollama’s tuning for you.When to choose Rapid-MLX
Rapid-MLX vs mlx-lm Use Rapid-MLX as the default. Fall back to raw mlx-lm only when you need a specific HuggingFace model path not covered by Rapid-MLX’s model aliases.
Apple’s own ML framework serving layer. Provides an OpenAI-compatible HTTP server for HuggingFace models.
Strengths
mlx-community/ quantised modelWeaknesses
default_model is empty)When to choose mlx-lm
Important: MLX models do not respect Modelfile num_ctx. The context window is fixed
at model conversion time. If clients need to see a specific context window via model
metadata, use GGUF + Ollama instead.
Production-grade embedding and reranking server. Uses MPS (Metal Performance Shaders) for GPU-accelerated inference on Apple Silicon.
Key endpoints
POST http://host:7997/v1/embeddings — OpenAI-compatible embeddingPOST http://host:7997/v1/rerank — Cross-encoder rerankingGET http://host:7997/v1/models — List loaded modelsStrengths
openai.Embedding.create()Weaknesses
--device mps flag (set in plist — handled automatically by headless-macs install-tools)--device mps, falls back to CPU at ~10× lower throughputWhen to choose Infinity
Clusters multiple Apple Silicon Macs into a single distributed inference node. Pools unified memory across devices to run models larger than any single machine can hold.
Strengths
Weaknesses
When to choose Exo
Requirements
sysadminctl -autologin set)tools.exo.bootstrap_peers in
config.json lists other nodes’ libp2p addresses to dial on startup for
cross-network clustering; same-LAN/same-namespace nodes auto-discover
without it — see --namespace/--zenoh-port/--discovery-port in
exo’s own --help for the underlying mechanism)Corrected 2026-09: earlier versions of this doc described Tailscale- based discovery and a
--discovery-moduleflag. Neither exists in current exo — confirmed by readingexo-explore/exo’s actual CLI source while fixingheadless-macs’ Exo integration, which had been passing that flag and failing to start as a result. Peer discovery is zenoh/libp2p-based (--bootstrap-peers), not a pluggable tailscale-or-otherwise module.
Not a serving/inference backend like the five tools above — macmon is an optional hardware telemetry daemon (com.llm-server.macmon) exposing CPU/GPU/ANE power draw, temperature, and memory stats over HTTP (GET /json, GET /metrics in Prometheus format). It reads this through a private macOS API rather than powermetrics, so it needs no root privilege — confirmed to work from a system LaunchDaemon with no console session logged in.
Why you’d enable it
/metrics is a ready-made Prometheus scrape target if you’re building any observability around this nodetools.macmon.enabled defaults to falseKnown limitation
macmon build has not consistently shipped a --host/--bind flag on serve. headless-macs detects this at install time: if the flag is present, network.localhost_only is honored exactly like every other tool; if it isn’t, macmon binds all interfaces regardless of that setting, and both install-tools and verify surface a [WARN] explaining why. Upgrading macmon (brew upgrade macmon) and re-running install-tools picks up --host support automatically once a version ships it.FUTURES.md).Requirements: none beyond what install-tools handles — Homebrew install, /var/log/macmon/ log directory, and the daemon itself are all automatic once tools.macmon.enabled is true.