进阶 13 分钟Mac

MLX 与 llama.cpp 在 Mac M 系列上的对比:2026 年谁更胜一筹 ?

在 Mac M 系列上,您有两个本地运行大语言模型(LLM)的选择:Apple 的官方框架 MLX,或使用 Metal 后端的 llama.cpp。两者均利用集成 GPU 和统一内存,但设计理念截然不同。本对比测试 mlx 与 llama.cpp 在 Mac 上的性能,涵盖每秒处理 token 数、支持模型类型、量化方式以及 Python 使用体验,最终根据您的使用场景给出明确结论。

作者: Marie L.·更新于 2026-08-27·已在 macOS 14+ 上测试

#2026 年的两大阵营

MLX 于 2023 年底发布,由 Apple 的机器学习团队开发。它是一个类似 NumPy 与 PyTorch 融合的 Python 框架,从一开始就为统一内存和 Metal 而设计。其适用范围广泛,包括 LLM、视觉、音频和微调。mlx-lm 包专门负责语言模型的推理与训练。

llama.cpp 是一个诞生于 2023 年的 C++ 项目,已成为各平台本地 LLM 推理的事实标准。在 Mac 上,其 Metal 后端会生成计算着色器,以利用 Apple Silicon 的 GPU。Ollama、LM Studio 和大多数面向普通用户的工具都由 llama.cpp 驱动。模型格式:GGUF。

i
它们为何共存
MLX 是 Apple 原生框架,llama.cpp 则可以跨平台运行。前者针对 Metal 的每一条指令都进行了优化;后者则让同一套代码在 CUDA、Vulkan 和 ROCm 上运行。在 Mac 上,两者直接竞争;在其他平台上,选择则毫无悬念。

#1. 安装

Mac 套装

在你的 Mac 上充分利用本地 AI:统一内存、MLX 与 GGUF、适合你芯片的模型、为 Apple Silicon 调优的 Ollama 和 LM Studio。

  • 在线空间,终身可用
  • PDF + 文件
  • 30 天内退款

在 MLX 方案中,所有操作均通过 pip 完成。运行时 mlx-lm 负责从 Hugging Face 下载模型、转换、量化及推理。

MLX
pip install mlx-lm

# Premier test : Qwen 3.5 4B 4-bit en une commande
mlx_lm.generate --model mlx-community/Qwen3.5-4B-Instruct-4bit \
  --prompt "Explique la mémoire unifiée Apple en 3 phrases."

对于 llama.cpp,您有三种使用方式:从源码编译并启用 Metal、通过 Homebrew 安装,或使用 Ollama、LM Studio 这类封装工具。为了公平比较,我们使用从源码编译得到的二进制文件。

llama.cpp
brew install llama.cpp

# Inférence sur un modèle GGUF déjà téléchargé
llama-cli -m ./Qwen3.5-4B-Instruct-Q4_K_M.gguf \
  -p "Explique la mémoire unifiée Apple en 3 phrases." \
  -n 256 -ngl 99
→
ngl 99 = 全部使用 GPU
在 Mac 上使用 -ngl(GPU 层数量)标志,需始终设置为 99 或更高。所有层均通过 Metal 使用集成显卡,统一内存使得带宽开销为零。

#2. M3 Max 和 M4 Pro 上的生成速度(tokens/秒)

以下是 2026 年两款常见设备上具有代表性的性能量级:一台配备 M3 Max 和 64 GB 内存的 MacBook Pro(内存带宽 400 GB/s),以及一台配备 M4 Pro 和 48 GB 内存的 Mac mini(内存带宽 273 GB/s)。模型在等效量化条件下进行比较——4-bit MLX 对比 Q4_K_M GGUF——使用 200 个 token 的提示词,并生成 256 个 token。

Qwen 3.5 4B — M3 Max
MLX 4-bit:150 tok/s · llama.cpp Q4_K_M:135 tok/s。MLX 略快约 11%。
Qwen 3.5 9B — M3 Max
MLX 4位:72 tok/s · llama.cpp Q4_K_M:66 tok/s。性能差距约9%,MLX略占优势。
Gemma 4 12B — M3 Max
MLX 4-bit:48 tok/s · llama.cpp Q4_K_M:44 tok/s。MLX 提升 9%。
Mistral Small 24B — M3 Max
MLX 4位:24 tok/s · llama.cpp Q4_K_M:22 tok/s。MLX 提升9%。
Qwen 3.8 27B — M3 Max
MLX 4-bit:21 tok/s · llama.cpp Q4_K_M:19 tok/s。MLX +10%。
Qwen 3.5 9B — M4 Pro
MLX 4位:50个token/秒 · llama.cpp Q4_K_M:46个token/秒。MLX +9%。

这一规律明确且可复现:在纯文本生成方面,MLX 的性能领先 8% 至 15%。差异在于,MLX 的 Metal 内核由 Apple 直接编写和优化,充分利用了对 GPU 调度器及 L1/L2 缓存的深入了解。llama.cpp 也使用 Metal 内核,但这些内核更为通用。

!
提示处理可能推翻判断结果
在处理初始提示(prefill)时,启用 Flash Attention(-fa)的 llama.cpp 往往能赶上 MLX,在长上下文下甚至能超过它。如果您向 RAG 系统输入 16k tokens,请分别测量两个阶段后再作判断。

#3. 支持Hugging Face模型

这是两个生态系统在实际使用中的差异之一。MLX 有自己的权重格式(.safetensors,附带 MLX 配置),而 llama.cpp 使用 GGUF。

MLX — 可用性
Hugging Face上的mlx-community组织发布大多数热门模型(Qwen 3.5/3.8、Gemma 4、Mistral、Granite 4.2)的4位和8位版本,通常在模型发布后的一周内推出。
MLX — 罕见模型
对于不常见的微调版本或鲜为人知的模型,您需要自行使用 mlx_lm.convert 进行转换。典型转换时间为 2 至 10 分钟,具体取决于模型大小。
llama.cpp — 可用性
GGUF 文件随处可见。对于许多模型,Bartowski、TheBloke(历史存档)、Unsloth 和官方发布方都会先发布 GGUF 格式,甚至早于 MLX 格式。
llama.cpp — 刚发布不久的模型
当新架构发布时(例如全新的 MoE 或异类注意力机制),llama.cpp 必须用 C++ 实现它。典型耗时:几天到两周。MLX 基于 Python + Metal,有时跟进更快,前提是 Apple 已提前做好准备。
将Hugging Face模型转换为4位MLX格式
mlx_lm.convert \
  --hf-path Qwen/Qwen3.5-9B-Instruct \
  --mlx-path ./qwen3.5-9b-mlx-4bit \
  -q --q-bits 4 --q-group-size 64

#4. 可用的量化方式

这可能是llama.cpp完全占优的领域。GGUF提供了十余种量化变体(Q2_K、Q3_K_S/M/L、Q4_K_S/M、Q5_K_M、Q6_K、Q8_0,以及I-quants IQ2_XXS至IQ4_NL),可精细调节模型在大小与质量之间的平衡。

MLX
4 位、6 位和 8 位量化。主要参数:group-size(分组大小,32、64、128)。没有混合精度 K-quants 的直接对应方案(Q4_K_M 在某些层上保留更高精度)。
llama.cpp
推荐使用 GGUF Q4_K_M,也可选择 Q5_K_M、Q6_K、Q8_0、FP16,以及 I-quants 以进一步降低模型大小。可通过 imatrix 进行校准。
观察到的质量
在大小相当的情况下,GGUF Q4_K_M 和 MLX 4-bit 得到的困惑度非常接近(差异小于 1%)。要将大型模型装入有限的 RAM(例如在 16 GB 内存上加载 Qwen 3.8 27B),llama.cpp 的 I-quants 仍能提供更细致的量化。
i
Q4_K_M 仍是首选
对于大多数使用场景,llama.cpp 的 Q4_K_M 和 MLX 的 4-bit group-size 64 在实际效果上表现一致。只有精细地进行 MMLU 或困惑度基准测试,才能观察到差异。

#5. 统一内存:谁能更好地利用它?

在 Mac M 系列上,CPU 和 GPU 共享同一块 RAM。没有复制,没有 PCIe 传输,只是共享一个内存池。这是 Apple 芯片在 LLM 推理场景下的结构优势,两个框架都能受益——但方式不同。

MLX
原生面向统一内存设计。张量存储在 CPU 和 GPU 均可寻址访问的同一空间中,不作区分。NumPy 与 MLX 之间可以进行零拷贝转换。这是 Apple 在架构上的主要优势。
llama.cpp Metal
分配共享的 MTLBuffer。可以运行,但增加了一层抽象。对于超出默认显存分配额度的模型,有时需要通过 sudo sysctl iogpu.wired_limit_mb 手动调整上限。
在 64 GB 内存上运行大型模型
2026年,即便是通用旗舰模型Qwen 3.8 27B,在4位量化下仅重约18 GB:64 GB统一内存足以支持大型MoE模型如Qwen 3.6 35B-A3B(约23 GB)或同等规格的Q8版本以获得最高质量。在128 GB(M3 Max顶级配置或M2 Ultra)内存平台上,可并行加载多个模型而无需妥协。
→
提升macOS的VRAM限制
默认情况下,macOS 为 GPU 预留约 75% 的 RAM。在一台配备 64 GB 内存的机器上,约有 48 GB 可供 GPU 使用。要将这一上限提高到 56 GB,可执行:sudo sysctl iogpu.wired_limit_mb=57344——这有助于加载采用更高量化位数(Q5_K_M 或 6-bit MLX)的大型 MoE 35B 模型,或同时加载多个模型。

#6. Python集成

如果您正在编写智能体或 RAG 流水线,或使用 LangChain / LlamaIndex / 自己的代码为 LLM 配备功能,那么 Python 开发体验与每秒生成的 token 数同样重要。

MLX — 流式推理
from mlx_lm import load, stream_generate

model, tokenizer = load("mlx-community/Qwen3.5-9B-Instruct-4bit")

prompt = tokenizer.apply_chat_template(
    [{"role": "user", "content": "Résume MLX en 3 phrases."}],
    tokenize=False, add_generation_prompt=True,
)

for chunk in stream_generate(model, tokenizer, prompt, max_tokens=256):
    print(chunk.text, end="", flush=True)

对于 llama.cpp,Python 集成通过 llama-cpp-python(官方绑定)实现。该 API 使用起来需要编写更多代码,风格更接近 C++,但启动服务器后即可提供兼容 OpenAI 的接口。

llama-cpp-python
from llama_cpp import Llama

llm = Llama(
    model_path="./Qwen3.5-9B-Instruct-Q4_K_M.gguf",
    n_gpu_layers=-1,   # tout sur Metal
    n_ctx=8192,
    flash_attn=True,
)

for chunk in llm.create_chat_completion(
    messages=[{"role": "user", "content": "Résume llama.cpp en 3 phrases."}],
    stream=True,
):
    delta = chunk["choices"][0]["delta"].get("content", "")
    print(delta, end="", flush=True)
MLX — 便捷性
API 设计简洁,语法类似 NumPy,原生支持 HF Hub。对数据科学家而言,上手非常迅速。
MLX — 限制
尚未内置官方的 OpenAI 兼容端点。若要向多个客户端提供模型服务,必须自行搭建 FastAPI 封装层。
llama.cpp — 便捷性
Python API 还算不错,但真正的生产环境使用是通过 llama-server(二进制程序)进行的,它原生提供与 OpenAI 兼容的 /v1/chat/completions 接口。
llama.cpp — 限制
llama-cpp-python 的 wheel 包必须使用正确的 Metal 编译选项重新编译(CMAKE_ARGS="-DGGML_METAL=on" pip install llama-cpp-python --force-reinstall --no-cache-dir)。这会带来使用上的麻烦。

#7. 生态系统与工具

除了运行时本身,生态系统才决定您实际能做什么。

Ollama
基于 llama.cpp。这是在 Mac 上运行 LLM,并在 localhost:11434 提供兼容 OpenAI 的 API 的最简单方式。
LM Studio
自2025年起支持两种引擎:默认使用 llama.cpp,兼容模型可选使用 MLX。一键切换。
LoRA微调
MLX 原生提供 mlx_lm.lora,实现简洁完善,可在集成 GPU 上运行,无需折腾。llama.cpp 不支持微调,必须使用 Unsloth 或 MLX。
提供模型推理服务
凭借 llama-server,llama.cpp 毫无争议地胜出:支持多客户端、批处理、槽位管理,并兼容 OpenAI API。MLX 方面,mlx_lm.server 自 2025 年起就已存在,但功能仍较基础。
视觉与音频支持
MLX 拥有良好维护的扩展(mlx-vlm、mlx-whisper)。llama.cpp 通过 LLaVA / Qwen-VL 模型支持视觉能力,具体支持情况取决于编译版本。

#各使用场景的结论

您希望在本地聊天中实现最高的每秒 token 数
MLX。无需额外成本即可提升 10% 的速度,而且模型越大,差距越明显。尤其是在 4 位量化时。
您希望提供一个供多个客户端使用的端点(团队、应用)
llama.cpp(llama-server 或 Ollama)。支持多槽位和批处理,兼容 OpenAI 接口,长期以来一直很稳定。
您每周测试大约十个不同的模型
llama.cpp。GGUF 生态在量化版本的覆盖范围和更新及时性方面无可匹敌。
您正在开发一个 Python 项目(智能体、RAG、工作流)
如果一切都在本地运行,而且只面向 Mac,就用 MLX。如果希望代码能在 Linux 和 Mac 之间移植,就用 llama-cpp-python 或 Ollama 客户端。
您想在 Mac 上对 7-13B 模型进行微调
MLX。mlx_lm.lora在M3 Max/M4 Pro(32GB及以上)上运行效果良好。
您是新手,只想使用一个能正常运行的 LLM
Ollama(因此使用 llama.cpp)。一个命令即可完成。
i
真正的答案:使用两者
在 Mac 上,完全可以通过 Ollama 以守护进程方式运行,用于日常使用(Open WebUI、Continue.dev、本地 API),同时使用 MLX 在 Python 虚拟环境中进行研究或基准测试。两者互不冲突,各自在自己的领域表现出色。

#深入了解

以下相关阅读可帮助您进一步了解这一主题:

这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。