# 當你的 Mac 終於能跑 AI Coding Agent 了:oMLX 如何用一顆 SSD 解決所有人忽略的問題 ![omlx-cover-apple-silicon-kv-cache](https://hackmd.io/_uploads/ryRR8zXqbe.jpg) <!-- SEO Meta Description: oMLX 是專為 Apple Silicon 打造的本地 LLM 推論伺服器,透過分層式 SSD KV Cache 將 coding agent 的 TTFT 從 90 秒降到 3 秒。完整技術架構解析與實戰設定指南。 Keywords: oMLX, Apple Silicon LLM, 本地推論, MLX inference, SSD KV cache, Claude Code 本地模型 --> 凌晨兩點,我盯著終端機裡 Claude Code 的游標閃了整晚。 不是網路斷了,不是 API 炸了——是我前幾天搭的本地推論伺服器,在處理第十二輪 tool calling 之後,終於撐不住了。每一輪對話,context 越疊越長,每次都要從頭算一遍 prefill。50K token 的 context,等個一分半鐘才吐出第一個字。 說真的,這種體驗還不如直接用 API。 然後我在 Hacker News 上看到一個帖子:「SSD-backed KV cache cuts coding agent TTFT from 90s to 1s on Mac」。 一秒?我差點從椅子上摔下去。 --- ## 問題到底出在哪 ![omlx-before-after-ttft](https://hackmd.io/_uploads/H1Bkwf79bx.jpg) 先說清楚,為什麼本地跑 LLM 搭配 coding agent 這麼痛苦。 用過 Claude Code、OpenClaw、Codex 這類工具的人應該都有感覺——它們和一般聊天不一樣。一般聊天是你一句我一句,context 長度很穩定。但 coding agent 不是。它會讀檔案、呼叫工具、拿到結果、再決定下一步,一來一回之間 context 像吹氣球一樣膨脹。 關鍵在於:每一輪的 prompt prefix 都在變。 你讀了一個檔案,context 裡多了 2000 行程式碼。你呼叫了 grep,結果塞進去又多了 500 行。但 system prompt、之前的對話歷史——這些佔了 80% 的 context,根本沒變。 傳統推論伺服器怎麼做?**全部重算。** 每次 prefix 變了,KV cache 直接作廢,從第一個 token 重新做 prefill。在 50K-100K token 的 context 下,這意味著 30 到 90 秒的等待。每一輪都是。 oMLX 的作者 Jun Kim(首爾的一位資料工程師)顯然也被這件事搞瘋了。他在 GitHub 上寫道: > "I build the tools I wish existed for my Mac — then open-source them." 於是他做了一個非常簡單但巧妙的設計:**把 KV cache 存到 SSD 上。** --- ## 分層式 KV Cache——這才是真正的創新 ![omlx-tiered-cache-architecture](https://hackmd.io/_uploads/H1i1wzX5Zg.jpg) 說到 oMLX 的核心技術,不需要什麼高深的論文才能理解。它的設計邏輯就像你電腦裡的記憶體階層——CPU cache、RAM、SSD、硬碟,各有各的速度和容量。 oMLX 把同樣的思路搬到了 LLM 推論上。 ```mermaid graph TD A[新請求進入] --> B{前綴是否已快取?} B -->|是| C[從 Hot/Cold Tier 還原 KV blocks] B -->|否| D[完整 Prefill 計算] C --> E[只計算新增的 tokens] D --> F[將 KV blocks 存入 Hot Tier] E --> G[生成回應] F --> G G --> H{Hot Tier 超過容量?} H -->|是| I[LRU 淘汰至 Cold Tier SSD] H -->|否| J[保持在記憶體] ``` **Hot Tier**(熱層)住在 GPU 統一記憶體裡,放最近、最常用的 KV blocks。你可以用 `--hot-cache-max-size 20%` 控制它佔多少記憶體。 **Cold Tier**(冷層)住在 SSD 上,用 safetensors 格式存。那些暫時不用但以後可能用到的 KV blocks,不是被丟掉,而是被「冷藏」起來。 **Prefix Matching Engine** 負責比對:下一個請求的前綴跟之前的有多少重疊?重疊的部分直接從快取還原,只有新增的 tokens 需要計算。 效果有多誇張?根據 [oMLX 官網](https://omlx.ai/) 和 [Hacker News 討論](https://news.ycombinator.com/item?id=47247294)的數據: | 場景 | 無 SSD Cache | 有 SSD Cache | |------|-------------|-------------| | **TTFT(第二輪起)** | 30-90 秒 | < 5 秒 | | **重啟後快取** | 全部遺失 | 從 SSD 還原 | | **10+ 輪 agent 對話** | 越來越慢 | 穩定快速 | 而且——伺服器重啟後快取還在。因為它存在磁碟上啊。這聽起來很理所當然,但之前沒人這麼做。 --- ## 不只是 KV Cache:一台完整的推論伺服器 ![omlx-macbook-dashboard](https://hackmd.io/_uploads/HJMxDz7qWg.jpg) 如果 oMLX 只是一個 KV cache 的 hack,它不會在一個月內拿到 [4,500 顆星](https://github.com/jundot/omlx)。它是一台功能完整的推論伺服器,而且體驗做得出乎意料地好。 ### EnginePool:同時跑五種模型 不只是 LLM。oMLX 的 EnginePool 能同時管理五種類型的模型: - **LLM**(Qwen、Llama、DeepSeek、Mistral) - **VLM** 視覺語言模型(Qwen3.5-VL、GLM-4V) - **Embedding**(BGE-M3、ModernBERT) - **Reranker**(Qwen3-Reranker、XLM-RoBERTa) - **OCR**(DeepSeek-OCR、GLM-OCR) 用 LRU 策略自動管理記憶體,用完自動卸載,常用的可以 pin 住。8GB 的 MacBook Air?v0.2.10 之後也能用了——之前的版本會預留 8GB 給系統,等於 8GB 機器 0 可用,後來改成百分比制才解決。 ### API 相容:OpenAI + Anthropic 都支援 這很關鍵。oMLX 同時支援 OpenAI 和 Anthropic 兩種 API 格式,意味著你不管用 Claude Code、OpenClaw、Codex 還是 OpenCode,都能直接接上去。 ```bash # Claude Code 接本地 oMLX export ANTHROPIC_BASE_URL=http://localhost:5050/v1 # 或者任何 OpenAI 相容的工具 export OPENAI_BASE_URL=http://localhost:5050/v1 ``` 在 Admin Dashboard 裡甚至可以一鍵設定這些整合——不用手動改 config 檔。 ### macOS Menu Bar 原生應用 下載 DMG,拖進 Applications,系統列多一個圖示,搞定。不是 Electron,是原生的。自動更新會根據你的 macOS 版本(Sequoia 或 Tahoe)選對應的 DMG。M5 用戶還有 Neural Accelerator 專屬支援。 --- ## 實測效能:數字說話 Reddit 上一位 M3 Ultra 512GB 的用戶[分享了他的 benchmark](https://www.reddit.com/r/LocalLLaMA/comments/1rdkze3/),這些數字相當有參考價值: | 模型 | Prompt TPS | Generation TPS | Batching 加速比 | |------|-----------|----------------|----------------| | Qwen3-Coder-Next 8bit | 1,462-2,009 | 45-59 | **4.14x** @ 8 concurrent | | Qwen3.5-122B-A10B 4bit | 768-941 | 42-57 | — | | MiniMax-M2.5 8bit | 426-704 | 15-34 | **3.71x** | | GLM-5 4bit | 78-187 | 11-17 | **3.61x** | *測試環境:M3 Ultra 512GB,oMLX v0.2.x* 另一位用戶在 [Reddit](https://www.reddit.com/r/LocalLLaMA/comments/1r3qwyi/) 上的評價更直白: > "Claude Code is actually **usable on M4 Max 128GB with 6-bit Qwen3-Coder-Next**. This is the wow factor frankly; I had given up on trying to use agentic CLI locally because it's so damn slow." 根據學術研究([arxiv: 2511.05502](https://arxiv.org/abs/2511.05502)),MLX 在 Apple Silicon 上的推論吞吐量已經比 llama.cpp 高 21%-87%。oMLX 在這個基礎上再加分層 KV cache,在多輪 agent 場景下的體驗差距就更大了。 --- ## 跟 Ollama、LM Studio 比,到底選誰 ![omlx-competition-comparison](https://hackmd.io/_uploads/HyPgPf7qWe.jpg) 這是大家最想知道的問題。直接上表: | 特性 | oMLX | Ollama | LM Studio | |------|------|--------|-----------| | **推論後端** | MLX 原生 | llama.cpp (GGUF) | llama.cpp + MLX | | **KV Cache 持久化** | SSD 分層 | 無 | 無 | | **Continuous Batching** | 有 | 無 | 部分 | | **API 格式** | OpenAI + Anthropic | OpenAI | OpenAI | | **Coding Agent 整合** | 一鍵設定 | 手動 | 手動 | | **MCP 工具** | 有 | 無 | 無 | | **跨平台** | macOS only | 全平台 | 全平台 | | **GUI** | Menu Bar + Web | CLI | 桌面應用 | | **模型格式** | MLX safetensors | GGUF | GGUF + MLX | 怎麼選?其實很簡單: **用 Mac + 跑 coding agent = oMLX。** SSD KV cache 在這個場景下是不可取代的優勢,其他工具做不到。 **需要跨平台或 NVIDIA GPU = Ollama / LM Studio。** oMLX 只吃 Apple Silicon,不吃別的。 **想要最簡單的上手體驗 = LM Studio。** GUI 做得最好,適合入門。 **想要極致控制 = Ollama。** 純 CLI,Docker 友善,伺服器場景首選。 --- ## 30 天 30 個版本:這個開發速度有點誇張 ![omlx-rocket-growth](https://hackmd.io/_uploads/HyMZPf7qZg.jpg) oMLX 在 2026 年 2 月 13 日上線。到我寫這篇文章的今天(3 月 15 日),已經發了 30 個 release。 沒有打錯,**幾乎每天一版。** 光看最近一週的更新就很驚人——Agent session stall 修復、M5 Neural Accelerator 支援、Qwen3-Reranker 整合、OpenAI Responses API、繁體中文 locale(台灣開發者 @JianShan-1214 貢獻的)、8GB 裝置支援修復、[oMLX.ai 效能比較平台](https://omlx.ai/)上線,社群已經提交了近一萬筆 benchmark 數據。 但說實話,這種開發節奏也讓我有點緊張。 --- ## 踩坑紀錄:這些問題你會遇到 快速迭代的另一面就是穩定性還在路上。從 GitHub Issues 和社群回報整理幾個已知的坑: **Context Compacting 導致模型遺失(#230)**——多輪對話後,context 壓縮機制偶爾會觸發模型狀態丟失。如果你發現 agent 突然「失憶」,很可能是這個問題。 **Tool Call Streaming 洩漏(#159, #172, #174)**——Claude Code 使用時,tool call 的封裝標記 `[Tool call: ...]` 有時會作為純文字洩漏到輸出中,造成對話卡住。v0.2.8 和 v0.2.9 陸續修了好幾波,但邊界情況可能還有。 **VLM 位置編碼汙染(#131)**——如果第一個請求包含圖片,第二個純文字請求可能輸出亂碼。原因是 mRoPE position state 沒清乾淨。v0.2.8 已修復。 **8GB 裝置完全無法載入模型(#137)**——原本的 `max_model_memory: auto` 會固定保留 8GB 給系統,8GB 機器等於零可用。v0.2.10 改成百分比制解決。 > **踩坑提醒**:如果你用 Homebrew 安裝遇到 pydantic-core dylib fixup failure,那是因為 bundled wheel 的動態連結庫有問題。v0.2.8 之後改為從原始碼編譯 pydantic-core。 --- ## 快速上手:從安裝到跑起來 > **前置條件** > - macOS 15.0+(Sequoia 或 Tahoe) > - Apple Silicon(M1 / M2 / M3 / M4 / M5) > - 16GB RAM 最低需求,64GB+ 建議 > - Python 3.10+(僅原始碼安裝需要) 三種安裝方式,選最適合你的: ```bash # 方法一:DMG(最快,推薦一般用戶) # 從 https://github.com/jundot/omlx/releases 下載 # M5 用戶務必選 macos26-tahoe 版本 # 方法二:Homebrew brew tap jundot/omlx https://github.com/jundot/omlx brew install omlx # 方法三:原始碼安裝(開發者用) git clone https://github.com/jundot/omlx.git cd omlx pip install -e ".[mcp]" # 包含 MCP 支援 ``` 啟動伺服器: ```bash # 基本啟動 omlx serve --model-dir ~/models # 完整設定:啟用 SSD cache + 記憶體限制 + batch 調優 omlx serve \ --model-dir ~/models \ --paged-ssd-cache-dir ~/.omlx/cache \ --max-process-memory 80% \ --prefill-batch-size 8 \ --completion-batch-size 32 ``` 接上 Claude Code: ```bash # 方法一:Admin Dashboard 一鍵設定 # 打開 http://localhost:5050/admin → Integrations → Claude Code # 方法二:手動設定 export ANTHROPIC_BASE_URL=http://localhost:5050/v1 ``` 如果你已經有 [LM Studio](https://lmstudio.ai/) 下載的模型,可以直接把 `--model-dir` 指向 LM Studio 的模型目錄,oMLX 會自動偵測。 --- ## 該不該現在就用 我的看法很直接。 如果你是 Mac 用戶,重度使用 Claude Code 或類似的 coding agent,而且受夠了每輪等一分鐘的推論延遲——現在就試。SSD KV cache 的體驗差距是量級上的,不是微調等級的改善。 但如果你需要穩定的生產環境,再等等。這個專案才一個月大,Issues 裡還有系統崩潰(#234)和 context 遺失(#230)這種等級的問題。單一維護者主導的專案,長期可持續性也是個問號——雖然社群貢獻正在快速增長。 我會建議在非關鍵的開發場景先用起來,等 v0.3.x 穩定之後再考慮更正式的使用。 這個專案填補了一個非常精確的市場空白。不是更快的推論引擎(那是 MLX 本身的功勞),而是**讓本地推論在 agent 場景下真正可用的那最後一塊拼圖**。有時候,改變遊戲規則的不是什麼 breakthrough,只是有人看到了一個所有人都忽略的問題,然後用最直覺的方式解決它。 把 KV cache 存到 SSD 上。就這麼簡單。 --- ## 延伸閱讀 - [GitHub: jundot/omlx](https://github.com/jundot/omlx) — 原始碼與文件 - [oMLX.ai](https://omlx.ai/) — 官網與社群 benchmark 資料庫 - [Hacker News: Show HN 討論串](https://news.ycombinator.com/item?id=47247294) — 作者與社群的技術問答 - [vllm-mlx 研究論文](https://arxiv.org/abs/2511.05502) — Apple Silicon 推論效能研究 - [Reddit: r/LocalLLaMA oMLX 討論](https://www.reddit.com/r/LocalLLaMA/comments/1r3qwyi/) — 社群使用回饋 - [Ken Huang: 本地跑 35B Coding Agent](https://kenhuangus.substack.com/p/i-ran-a-35b-ai-coding-agent-locally) — 實戰經驗分享