24GB M4 跑本地模型的實測策略
最近認真評估了一輪在 M4 MacBook 上跑本地模型的可行性。先說結論:可行,但邊界比你想的窄很多。
模型選型:不是「塞得下」就好
24GB 聽起來很多,實際上你要扣掉 macOS、其他應用(Electron 全家桶),剩下能給模型用的不到一半。我試過幾個:
- Devstral Small 24B:塞得下,但跑起來慢到無法使用
- Qwen 3.6 Q3:同樣問題,context 打滿之後 TPS 直接崩
- Gemma 4B:速度快,tool use 完全不行,幾乎廢物
最後跑起來真正可用的是 Qwen 3.5-9B Q4_K_S,大約 40 tok/s,128K context,tool use 基本堪用。
重點是那個「基本」。用 Q4_K_S 量化的原因是在速度跟品質之間取了個折衷,換成更高壓縮比(Q3、Q2)雖然能塞更大的模型,但品質掉到讓人沮喪的程度。「塞得下 24B 模型」≠「能跑 24B 模型」,這是第一個要想清楚的事。
TPS 跟 Context 長度的取捨
40 tok/s 是什麼感覺?寫 code 或做研究的時候沒什麼問題,回應流暢;但要跑 agent loop——有 tool call、多輪對話、context 漸漸累積——速度會隨著 context 增長下降。
128K context 理論上很夠用,但實際上你要想好「你的 context 窗口是不是你的瓶頸」。長 context 對本地模型是雙重負擔:memory bandwidth 吃更多,attention 計算也更慢。我跑過一個 session,從 8K context 到 64K context,TPS 從 42 掉到 22。如果你習慣把整個 codebase 塞進去問問題,在本地模型上這個策略會讓你很痛苦。
建議的方式是主動管理 context:把不相關的對話輪清掉、用 system prompt 壓縮背景知識、不要讓 agent 把整個檔案拉進來再慢慢讀。跑本地模型讓我意識到自己在用雲端模型時有多不在乎 context 浪費。
Tool Use:可以,但容易出事
Qwen 3.5-9B 的 tool use 是可以的,但有兩個習慣讓我很抓狂:
第一,容易分心。 你給它一個任務,它有時候會突然去呼叫一個不相關的 tool,然後繼續原本的任務,像在走神。雲端模型偶爾也會這樣,但頻率明顯更高。
第二,容易進迴圈。 特別是 agentic workflow 裡,它有時候會重複呼叫同一個 tool 三四次,不是因為真的需要,是因為它在「驗證」,然後卡死在那裡。我在接 OpenCode 的時候遇到一個 case:rebase 之後請它繼續,它成功辨識了衝突、給了正確的解法,但執行時忘記實際編輯檔案,直接跑 git add 然後 git rebase --continue,然後編輯器打開它不知道怎麼辦,整個 session hang 住。
這種問題在雲端模型裡也存在,只是本地模型更常見、更難預測。
工作流程要更嚴格
這是核心結論,也是最多人忽略的地方。
用 Claude 或 GPT-4o 的時候,你可以說「幫我把這個 feature 做完」然後去倒杯咖啡。用本地模型不行。你必須要 step-by-step 引導它:
- 先讓它分析問題,不要讓它直接動手
- 確認它的分析正確後,只授權一個步驟
- 看輸出、確認對了再繼續
聽起來很繁瑣。但我反而覺得這是一個好的紀律訓練。用 SOTA 模型很容易變成「AI 使用者」而不是「工程師」——你在等結果、審批輸出,自己的技術直覺漸漸鈍掉。用本地模型你沒辦法偷懶,必須真的理解每個步驟在幹嘛。
說這個不是在浪漫化限制,是真的在說一個務實的取捨。如果你的目標是最大化 throughput,繼續用雲端模型。如果你想維持技術判斷力,本地模型的「阻力」是有意義的。
跟 SOTA 雲端模型的協作邊界
我目前的使用方式是混合策略:
- 本地模型負責:快速探索、lint 修復、小範圍 refactor、git 操作、查 API 用法這種「有標準答案」的任務
- 雲端模型負責:架構設計、跨多個系統的 reasoning、任何需要「不犯錯」的長任務
實際的切換 signal 是:如果我能在 30 秒內驗證輸出對不對,用本地模型。 如果驗證成本高、或需要模型自己維持長時間的 context coherence,切雲端。
這條線不是固定的,會隨著你對本地模型的熟悉度調整。但核心邏輯不會變:本地模型適合有快速反饋迴路的任務,不適合需要長期自主性的任務。
配置備忘
給有興趣試
的人,我跑的是 LM Studio + Qwen 3.5-9B Q4_K_S,thinking mode 設定:
temperature=0.6, top_p=0.95, top_k=20, min_p=0.0
presence_penalty=0.0, repetition_penalty=1.0
Prompt Template 底部加 {%- set enable_thinking = true %}。
OpenCode 的 config 大概這樣:
{
"provider": {
"lmstudio": {
"npm": "@ai-sdk/openai-compatible",
"options": { "baseURL": "http://127.0.0.1:1234/v1" },
"models": {
"qwen3.5-9b@q4_k_s": {
"tools": true,
"context_length": 131072,
"max_tokens": 32768
}
}
}
}
}
最後要說的是:本地模型不是雲端模型的替代品,是補充。如果你覺得用本地模型可以省掉雲端訂閱費、同時維持生產力,那你一定會失望。但如果你把它當成一個「可以隨便玩、不用擔心帳單、訓練自己技術直覺」的工具,它的定位就很清楚了。
作者:鍵盤工人