在 Apple Silicon 上,瓶頸很少是「哪個模型最聰明」,幾乎永遠是:在統一記憶體不觸發過度壓縮的前提下,上下文長度、解碼批大小、量化位階與並行連線數如何組合。本文是給 2026 年 Mac mini M4 等級硬體的速查:llama.cpp 進階使用者與 Ollama 維運並用。

若你同時做生成與檢索,請先對齊本機 RAG:分塊、Embedding 批次與向量配額矩陣,避免索引器與對話執行緒搶同一包 RAM。產品與區域說明見LlmMac 首頁;需要徹夜跑評測或批次基準時,可到購買/方案頁比對專用 Mac mini M4 節點,無需登入即可瀏覽方案。

硬體邊界

Mac mini M4 採統一記憶體:GPU、Neural Engine 與 CPU 共用同一池。好處是減少拷貝;代價是上下文、KV cache、批大小與並行請求共用同一預算。實務上壓力大致隨「在飛 token」成長:更長提示、更寬批次、更多平行對話,都會讓記憶體控制器必須維持更大的工作集。

蘋果會公布各晶片層級的記憶體頻寬數字;對本機 LLM 而言,穩態解碼常受權重與 KV 位元組能否被快速餵進運算單元限制,而非單一 TFLOPS 標題數字。把上下文從 8k 拉到 32k,不只是「多用 RAM」——KV 張量的常駐型態與 Metal kernel 的占空比都會變。若活動監視器顯示記憶體壓力偏高但 token 仍在輸出,多半已過膝點:先降量化階、縮 num_ctx,或減少並行,再談更新 flash-attention 類建置。

mini 機型仍建議以連續 10 分鐘穩態當驗收,而非只看 60 秒排行榜截圖。

GGUF/量化選型

GGUF 仍是 llama.cpp 生態的交換格式首選;Ollama 底層同樣吃相容權重。2026 年多語或程式碼場景,常見預設落在 Q4_K_MQ5_K_M:多數任務主觀品質接近 FP16,同時壓低每位元組頻寬。IQ 系量化(如 IQ4_XS)在統一記憶體吃緊時能贏在純容量,但務必用自家評測提示驗證——工具呼叫 JSON、長表格往往最先退化。

MoE 模型要另算尖峰;量化須與建置對齊,舊 GGUF 配新 tokenizer/template 常釀成「昨天還能跑」。Runbook 請固定模型修訂、量化型別與模板

# llama.cpp 範例骨架(路徑與旗標請依你的建置調整) ./llama-cli -m ./models/model.Q4_K_M.gguf -c 8192 -b 512 -ngl 99

並發與批大小

llama.cpp 直接暴露批次與卸載:上下文用 -c--ctx-size,批次用 -b--batch-size,Metal 層數用 -ngl(server 模式有對應項)。加大批次有助提示階段(prefill)吞吐,但會抬高峰值記憶體;過小的 micro-batch 則吃不滿 GPU、浪費頻寬。實務迴圈:先鎖定目標上下文,掃描批次 {128, 256, 512, 1024},在 RSS 峰值低於安全邊界下取最大可用值(24 GB 機型若仍開桌面應用,常預留約 8–12 GB 餘裕)。

Ollama 以操作簡化換較少裸旗標。可在 ModelfilePARAMETER num_ctxnum_batchnum_gpu(視版本支援),並以 OLLAMA_NUM_PARALLEL 等環境變數控制並行。每增加一個並行槽,峰值時約等於多複製一份 KV 預算;可類比「同一顆 GPU 上多開 llama.cpp」。API 突刺流量時,寧可在客戶端排隊,也別讓 daemon 一次開滿導致記憶體壓縮。

同一台 Mac 若還跑 embedding 或建索引,請序列化重活或改到其他主機——前文 RAG 矩陣已說明 embedding 批次尖峰與對話服務 naive 排程時的衝突。

關注點 llama.cpp(典型 CLI/server) Ollama(daemon+API) M4/統一記憶體備註
上下文視窗 -c--ctx-size;若模型支援 YaRN 等映射可再切圖 ModelfilePARAMETER num_ctx 或拉取預設 更長 ctx 使 KV 位元組約線性成長;盯統一記憶體壓力,而非只看 GGUF 磁碟大小
Prefill/微批次 -b--batch-size(及版本支援的 -ub 等) PARAMETER num_batch;可能受模型預設上限 批次加大到首字延遲(TTFT)改善趨平即停;RSS 尖峰過高則回退
GPU 卸載 -ngl 指定層數上 Metal 多為自動;部分建置可給 num_gpu 提示 部分卸載省 RAM 但可能挪移瓶頸;以端到端 tokens/s 為準
並行對話/API RAM 允許才多程序;分埠隔離 OLLAMA_NUM_PARALLEL;客戶端維持佇列 每條連線峰值時近似多一份 KV 預算;寧可排隊勿過度超賣
頻寬代理指標 對照 tokens/s 與活動監視器;flash-attn 類建置降低 KV 流量 訊號類似;可調參數較少、較依版本組合 解碼停滯但 GPU 有閒隙時,先懷疑記憶體頻寬或批次設定

本機推理上線清單

  • 模型清單:記錄 GGUF 檔名、量化型別、SHA-256、tokenizer 模板、執行時版本(llama.cpp commit 或 Ollama App 版號)。
  • 記憶體包絡:冷啟動、首請求、以及預期並行下連續 10 分鐘 soak;記錄峰值 RSS 與是否換頁。
  • 上下文政策:各環境(dev/stage/prod)上限 num_ctx,以及客戶端硬上限 token。
  • 批次掃描:留存勝出的 -bnum_batch 與測得 prefill p95 延遲。
  • 降級路徑:記憶體壓力持續超過門檻逾 60 秒時,自動改較小量化或較短上下文。
  • 可觀測性:提示與生成 token 數、錯誤皆帶時間戳;日誌輪替於 ~/Library/Logs 或服務目錄。

穩定性 FAQ

為何幾分鐘後吞吐崩跌? 常見是熱平均降頻,或並行尖峰後背景記憶體壓縮。請減並行、關閉與推理搶磁碟/CPU 的 Spotlight、Time Machine 或 Xcode 索引後再量。

Ollama 隔夜更新後延遲變了? daemon 與模型 blob 常一起變。正式環境請釘版本;法遵若要求不可變,可鏡像到內部路徑。

批次愈大愈好嗎? 否。過膝點後 prefill 增益有限,但混合提示長度時 OOM 風險上升。寧可 bounded 批次+客戶端切碎巨大 system prompt。

該關 Metal 除錯嗎? 僅短暫。CPU 路徑有助切分數值/模板問題,但無法代表容量規劃。

多人共用一台 Mac? 請序列化或拆機;多條長上下文並行往往遠比帳面數字昂貴,優先排隊或另租節點。

摘要:上下文、批次、量化與並行是同一記憶體頻寬預算上的聯動桿;以穩態量測取代尖峰截圖,固定模型清單,並避免索引與對話在同一包絡內無序重疊。