ByteNoteByteNote

字节笔记本

2026年5月16日

Hermes Agent 本地运行 LLM:Mac 上跑开源大模型完全指南

API中转
¥120

在 Mac 上运行本地 LLM 已经不再是技术极客的专属领域——借助 Hermes Agent 和合适的后端,你可以在 Apple Silicon 上获得令人惊喜的推理性能,同时享受完全的隐私保护和零 API 费用。本文将手把手带你完成从模型选择到服务部署的全流程,覆盖 llama.cpp 和 MLX 两种后端方案,并提供真实的性能基准测试数据帮助你做出选择。

两种后端方案

本指南覆盖两种后端:

后端安装方式优势模型格式
llama.cppbrew install llama.cpp首个 Token 延迟最低,量化 KV Cache 节省内存GGUF
omlxomlx.aiToken 生成速度最快,原生 Metal 优化MLX (safetensors)

两者都暴露了 OpenAI 兼容的 /v1/chat/completions 端点。Hermes 兼容两者——只需将端点指向 http://localhost:8080http://localhost:8000 即可。

本指南针对 Apple Silicon(M1 及更高版本)的 Mac。Intel Mac 可以运行 llama.cpp,但无法使用 GPU 加速——性能会显著下降。


选择模型

入门推荐 Qwen3.5-9B——这是一个强力的推理模型,量化后在 8GB+ 统一内存上运行顺畅。

变体磁盘占用所需内存(128K 上下文)后端
Qwen3.5-9B-Q4_K_M (GGUF)5.3 GB约 10 GB(量化 KV Cache)llama.cpp
Qwen3.5-9B-mlx-lm-mxfp4 (MLX)约 5 GB约 12 GBomlx

内存经验法则: 模型大小 + KV Cache。9B Q4 模型约 5 GB,128K 上下文下 Q4 量化的 KV Cache 约需 4-5 GB,而默认的 f16 KV Cache 则膨胀到约 16 GB。llama.cpp 中的量化 KV Cache 参数是内存受限系统的关键优化手段。

对于更大的模型(27B、35B),需要 32GB+ 统一内存。9B 是 8-16GB 内存的甜点选择。


方案 A:llama.cpp

llama.cpp 是最通用的本地 LLM 运行时。在 macOS 上开箱即用 Metal GPU 加速。

安装

bash
brew install llama.cpp

安装后会提供全局的 llama-server 命令。

下载模型

需要 GGUF 格式的模型。最方便的方式是通过 huggingface-cli 从 Hugging Face 下载:

bash
brew install huggingface-cli

然后下载:

bash
huggingface-cli download unsloth/Qwen3.5-9B-GGUF Qwen3.5-9B-Q4_K_M.gguf --local-dir ~/models

Hugging Face 上的部分模型需要认证。如果遇到 401 或 404 错误,先运行 huggingface-cli login

启动服务

bash
llama-server -m ~/models/Qwen3.5-9B-Q4_K_M.gguf \
  -ngl 99 \
  -c 131072 \
  -np 1 \
  -fa on \
  --cache-type-k q4_0 \
  --cache-type-v q4_0 \
  --host 0.0.0.0

各参数说明:

参数作用
-ngl 99将所有层卸载到 GPU(Metal)。使用大数字确保没有层留在 CPU 上。
-c 131072上下文窗口大小(128K Token)。内存不足时降低此值。
-np 1并行插槽数。单用户保持为 1——更多槽位会瓜分内存预算。
-fa onFlash Attention。减少内存使用,加速长上下文推理。
--cache-type-k q4_0将 Key Cache 量化为 4-bit。这是最大的内存节省手段。
--cache-type-v q4_0将 Value Cache 量化为 4-bit。与上一项配合,KV Cache 内存降低约 75%(相比 f16)。
--host 0.0.0.0监听所有网络接口。如无需网络访问,使用 127.0.0.1

服务就绪后会看到:

text
main: server is listening on http://0.0.0.0:8080
srv  update_slots: all slots are idle

内存受限系统的优化

--cache-type-k q4_0 --cache-type-v q4_0 是内存受限系统最重要的优化。在 128K 上下文下的影响:

KV Cache 类型KV Cache 内存(128K 上下文,9B 模型)
f16(默认)约 16 GB
q8_0约 8 GB
q4_0约 4 GB

8GB 内存的 Mac,使用 q4_0 KV Cache 并将上下文降低到 -c 32768(32K)。16GB 可以轻松跑 128K 上下文。32GB+ 可以运行更大的模型或多个并行插槽。

如果仍然内存不足,先降低上下文大小(-c),再尝试更低的量化级别(Q3_K_M 替代 Q4_K_M)。

测试服务

bash
curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.5-9B-Q4_K_M.gguf",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 50
  }' | jq .choices[0].message.content

获取模型名称

忘记模型名称时,查询模型端点:

bash
curl -s http://localhost:8080/v1/models | jq '.data[].id'

方案 B:通过 omlx 使用 MLX

omlx 是一款 macOS 原生应用,用于管理和部署 MLX 模型。MLX 是 Apple 自家的机器学习框架,专为 Apple Silicon 的统一内存架构优化。

安装

omlx.ai 下载安装。它提供模型管理的 GUI 和内置服务器。

下载模型

使用 omlx 应用浏览和下载模型。搜索 Qwen3.5-9B-mlx-lm-mxfp4 并下载。模型存储在本地(通常在 ~/.omlx/models/)。

启动服务

omlx 默认在 http://127.0.0.1:8000 上提供模型服务。从应用 UI 启动服务,或使用 CLI。

测试服务

bash
curl -s http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.5-9B-mlx-lm-mxfp4",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 50
  }' | jq .choices[0].message.content

列出可用模型

omlx 可以同时服务多个模型:

bash
curl -s http://127.0.0.1:8000/v1/models | jq '.data[].id'

性能基准测试:llama.cpp vs MLX

两种后端在同一台机器(Apple M5 Max,128GB 统一内存)上测试,运行相同模型(Qwen3.5-9B),量化级别可比(GGUF 用 Q4_K_M,MLX 用 mxfp4)。5 个多样化 Prompt,各运行 3 次,后端顺序测试避免资源竞争。

测试结果

指标llama.cpp (Q4_K_M)MLX (mxfp4)胜者
TTFT(平均)67 ms289 msllama.cpp(4.3 倍更快)
TTFT(p50)66 ms286 msllama.cpp(4.3 倍更快)
生成速度(平均)70 tok/s96 tok/sMLX(快 37%)
生成速度(p50)70 tok/s96 tok/sMLX(快 37%)
总耗时(512 Token)7.3s5.5sMLX(快 25%)

结果解读

  • llama.cpp 在 Prompt 处理方面表现出色——Flash Attention + 量化 KV Cache 管道让首个 Token 在约 66ms 内返回。如果你构建的是交互式应用(聊天机器人、自动补全),感知响应速度的领先是有意义的。

  • MLX 一旦开始生成,Token 速度快约 37%。对于批处理任务、长文本生成,或任何总完成时间比初始延迟更重要的场景,MLX 完成得更快。

  • 两种后端都非常稳定——各次运行间的方差可忽略不计。这些数据是可靠的。

如何选择

使用场景推荐方案
交互式对话、低延迟工具llama.cpp
长文本生成、批量处理MLX (omlx)
内存受限(8-16 GB)llama.cpp(量化 KV Cache 无可匹敌)
同时服务多个模型omlx(内置多模型支持)
最大兼容性(也支持 Linux)llama.cpp

连接 Hermes

本地服务运行后:

bash
hermes model

选择 Custom endpoint 并按提示操作。它会请求 Base URL 和模型名称——使用你上面配置的后端对应的值。


超时设置

Hermes 自动检测本地端点(localhost、局域网 IP)并放宽流式超时限制。大多数配置无需额外调整。

如果仍然遇到超时错误(例如在较慢硬件上处理超大上下文),可以覆盖流式读取超时:

bash
# 在 .env 中——从默认 120s 提高到 30 分钟
HERMES_STREAM_READ_TIMEOUT=1800
超时类型默认值本地自动调整环境变量覆盖
流式读取(Socket 层)120s提高到 1800sHERMES_STREAM_READ_TIMEOUT
停滞流检测180s完全禁用HERMES_STREAM_STALE_TIMEOUT
API 调用(非流式)1800s无需调整HERMES_API_TIMEOUT

流式读取超时最可能导致问题——它是接收下一块数据的 Socket 级截止时间。在大上下文的预填充阶段,本地模型可能在处理 Prompt 时数分钟无输出。自动检测机制可以透明处理这种情况。

分享: