H繁中版
<!-- Source: https://hermesbible.com/docs/guides/local-llm-on-mac -->

本指南將引導你在 macOS 上設定一個具有 OpenAI 相容 API 的本地 LLM 伺服器。你將獲得完整的隱私、零 API 成本,以及在 Apple Silicon 上令人驚訝的良好效能。

我們涵蓋兩種後端:

後端安裝方式最佳用途格式
llama.cppbrew install llama.cpp最快的首 token 時間,量化 KV 快取以降低記憶體使用GGUF
omlxomlx.ai最快的 token 產生速度,原生 Metal 最佳化MLX(safetensors)

兩者都提供 OpenAI 相容的 /v1/chat/completions 端點。Hermes 可以與任一後端搭配使用——只需將其指向 http://localhost:8080http://localhost:8000

資訊 — 僅限 Apple Silicon

本指南針對搭載 Apple Silicon(M1 及之後)的 Mac。Intel Mac 可以使用 llama.cpp 但沒有 GPU 加速——預期效能會明顯較慢。


選擇模型

入門推薦 Qwen3.5-9B——這是一個強大的推理模型,在 8GB+ 的統一記憶體中搭配量化可輕鬆運行。

變體磁碟大小所需 RAM(128K 上下文)後端
Qwen3.5-9B-Q4_K_M(GGUF)5.3 GB約 10 GB(量化 KV 快取)llama.cpp
Qwen3.5-9B-mlx-lm-mxfp4(MLX)約 5 GB約 12 GBomlx

記憶體經驗法則: 模型大小 + KV 快取。9B Q4 模型約 5 GB。在 128K 上下文中使用 Q4 量化的 KV 快取額外增加約 4-5 GB。使用預設(f16)KV 快取時,這會膨脹到約 16 GB。llama.cpp 中的量化 KV 快取標誌是記憶體受限系統的關鍵技巧。

對於較大的模型(27B、35B),你需要 32 GB+ 的統一記憶體。9B 是 8-16 GB 機器的最佳選擇。


選項 A:llama.cpp

llama.cpp 是最具可攜性的本地 LLM 運行時。在 macOS 上它使用 Metal 進行 GPU 加速,開箱即用。

安裝

brew install llama.cpp

這會全域提供 llama-server 命令。

下載模型

你需要一個 GGUF 格式的模型。最簡單的來源是透過 huggingface-cli 從 Hugging Face 下載:

brew install huggingface-cli

然後下載:

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

啟動伺服器

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將金鑰快取量化為 4 位元。這是最大的記憶體節省。
--cache-type-v q4_0將值快取量化為 4 位元。與上述結合,可將 KV 快取記憶體較 f16 減少約 75%。
--host 0.0.0.0監聽所有介面。如果不需要網路存取,使用 127.0.0.1

當你看到以下內容時,伺服器已就緒:

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 快取類型KV 快取記憶體(128K ctx,9B 模型)
f16(預設)約 16 GB
q8_0約 8 GB
q4_0約 4 GB

在 8 GB 的 Mac 上,使用 q4_0 KV 快取並選擇一個仍然能符合 Hermes 64K 最低上下文的較小模型。在 16 GB 上,你可以舒適地使用 128K 上下文。在 32 GB+ 上,你可以運行較大的模型或多個並行槽位。

如果你仍然記憶體不足,請減少上下文但保持在或高於 Hermes 的 64K 最低要求;否則切換到較小的模型或較小的量化(Q3_K_M 代替 Q4_K_M)。

測試

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

取得模型名稱

如果你忘記了模型名稱,請查詢 models 端點:

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(如果可用)。

測試

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 可以同時提供多個模型的服務:

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

基準測試:llama.cpp vs MLX

兩種後端在同一台機器(Apple M5 Max,128 GB 統一記憶體)上運行相同的模型(Qwen3.5-9B),使用相近的量化等級(GGUF 使用 Q4_K_M,MLX 使用 mxfp4)。使用 5 個不同的提示,每個執行 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 在提示處理方面表現出色——其 flash attention + 量化 KV 快取管線讓你在約 64ms 內獲得首個 token。如果你正在建構需要感知回應速度的互動式應用程式(聊天機器人、自動完成),這是一個有意義的優勢。

  • MLX 一旦開始產生 token,速度約快 37%。對於批次工作負載、長文本產生或任何更看重總完成時間而非初始延遲的任務,MLX 會更早完成。

  • 兩種後端都極為一致——跨執行的方差可以忽略不計。你可以信賴這些數據。

你應該選擇哪一個?

使用情境建議
互動式聊天、低延遲工具llama.cpp
長文本產生、批量處理MLX(omlx)
記憶體受限(8-16 GB)llama.cpp(量化 KV 快取無可匹敵)
同時提供多個模型的服務omlx(內建多模型支援)
最大相容性(也支援 Linux)llama.cpp

連接到 Hermes

一旦你的本地伺服器運行:

hermes model

選擇 Custom endpoint 並按照提示操作。它會要求輸入基礎 URL 和模型名稱——使用你上面設定的後端對應的值。


逾時設定

Hermes 會自動偵測本地端點(localhost、區域網路 IP)並放寬其串流逾時。大多數設定不需要配置。

如果你仍然遇到逾時錯誤(例如在較慢的硬體上使用非常大的上下文),你可以覆寫串流讀取逾時:

# 在你的 .env 中 — 從預設的 120 秒提高到 30 分鐘
HERMES_STREAM_READ_TIMEOUT=1800
逾時設定預設值本地自動調整環境變數覆寫
串流讀取(socket 層級)120s提高至 1800sHERMES_STREAM_READ_TIMEOUT
過時串流偵測180s完全停用HERMES_STREAM_STALE_TIMEOUT
API 呼叫(非串流)1800s無需更改HERMES_API_TIMEOUT

串流讀取逾時是最可能導致問題的——它是在接收下一個資料區塊時的 socket 層級期限。在大型上下文的預填充期間,本地模型在處理提示時可能長達數分鐘沒有輸出。自動偵測可以透明地處理此情況。



教學:每日簡報機器人