MLX vs Core ML vs llama.cpp in 2026
If you are running LLMs on Apple Silicon in 2026, these are the three most relevant runtimes. They differ in ownership (Apple vs Apple vs community), model format (MLX vs Core ML vs GGUF), and target use case (research vs iOS apps vs general-purpose).
Overview
| MLX | Core ML | llama.cpp | |
|---|---|---|---|
| Owner | Apple | Apple | community (ggml-org) |
| Target | research + Mac dev | iOS / macOS app dev | general-purpose |
| Model format | MLX (own) | .mlpackage (own) | GGUF |
| Mac support | ✓ (native) | ✓ | ✓ |
| iOS support | partial (mlx-swift) | ✓ (first-class) | ✓ (via llama.cpp-iOS) |
| Model coverage | most popular open models | needs conversion | widest of any format |
| License | MIT | Apple (proprietary tooling, MIT models) | MIT |
| Quantization | 4-bit, 8-bit, fp16 | 4-bit, 8-bit, palettization | Q2_K – Q8_0, i-quants |
| Tools | mlx-lm, mlx-vlm | Xcode, coremltools | Ollama, Mullama, LM Studio, llama-cpp-python |
Performance
Tokens per second on M4 Max 64GB, batch 1, 2048-token context, Q4-equivalent:
| Model | MLX | Core ML | llama.cpp |
|---|---|---|---|
| Llama 3.2 3B | 88 | 75 | 85 |
| Qwen 2.5 7B | 52 | 45 | 48 |
| Llama 3.1 8B | 45 | 38 | 42 |
| Mistral Nemo 12B | 32 | 26 | 28 |
| Qwen 2.5 14B | 30 | 22 | 24 |
| Qwen 3 32B | 16 | 10 | 14 |
| Llama 3.1 70B (offload) | 9 | 5 | 6 |
MLX has the consistent lead because it is purpose-built for Apple Silicon’s unified memory architecture. llama.cpp is 5-15% behind. Core ML is the slowest for LLM inference because it is optimized for classification and smaller models, not text generation.
Model format and conversion
| MLX | Core ML | llama.cpp | |
|---|---|---|---|
| Hugging Face → MLX | mlx_lm.convert | N/A | N/A |
| Hugging Face → Core ML | N/A | coremltools (manual) | N/A |
| Hugging Face → GGUF | manual / llama.cpp | N/A | convert_hf_to_gguf.py |
| GGUF → MLX | manual | N/A | N/A |
| MLX → Core ML | N/A | manual | N/A |
| GGUF → Core ML | N/A | manual | N/A |
GGUF has the smoothest conversion path. MLX is one command. Core ML is the hardest (manual script per model).
When to use each
Choose MLX when…
- You are on Mac only and want the fastest inference.
- You are doing research on Apple Silicon and want direct access to Apple’s ML primitives.
- You run large models (14B+) where MLX’s unified-memory advantage matters most.
- You are okay with one-step conversion from Hugging Face.
Choose Core ML when…
- You are building an iOS or macOS app that needs to ship an LLM inside the app bundle (no download at runtime).
- You need Apple Neural Engine acceleration for power efficiency.
- You are using Xcode and want first-class Apple tooling.
- You are doing on-device classification, vision, or audio in addition to LLM.
Choose llama.cpp when…
- You want the widest model coverage (GGUF is the lingua franca).
- You use Ollama, Mullama, or LM Studio as your daily driver.
- You run on mixed Apple + NVIDIA + AMD hardware.
- You want the most community-tested code path.
Decision matrix
| Your situation | Use |
|---|---|
| Mac-only, max performance, research | MLX |
| iOS app, ship a model in the bundle | Core ML |
| Daily driver across Mac and non-Mac | llama.cpp |
| Use Ollama or Mullama | llama.cpp (Ollama picks MLX on Mac) |
| Large model (32B+) on Mac | MLX |
| Production iOS app with privacy | Core ML |
| On-device classification + LLM | Core ML + llama.cpp hybrid |
| Build a Flutter app with on-device LLM | Llamafu (on llama.cpp) |
| Vision / multimodal | MLX (mlx-vlm) or llama.cpp |
See also
- llama.cpp tool page — full feature list
- MLX tool page — full feature list
- Llamafu tool page — Flutter mobile on llama.cpp
- MLC LLM vs Llamafu — mobile-specific comparison
- Local LLM on Apple Silicon guide — full setup walkthrough