一台搭載 Apple Silicon 的 Mac mini、24GB 統一記憶體、開源的 Gemma 4 模型——這不是某個實驗室的配備,而是任何人都可以在家裡搭建的本地 AI 環境。但問題是:裝好之後,每次重開機都要重新載入模型、每次閒置五分鐘就自動卸載,這種體驗真的好用嗎?

如果有一個辦法,能讓你的 Mac mini 重開機後自動啟動 Ollama、預先載入 Gemma 4 模型、並且永久保持記憶體中熱候命,你會不會想試試看?

為什麼要自己跑本地 AI?

用 API 調用 ChatGPT 或其他雲端 AI 模型很方便,但也有一些問題:每次請求都要上網、資料會傳到第三方伺服器、用量超過就要付費。對於只想在開發測試或日常使用中快速產生文字的場景來說,這些都是不必要的開銷。

Ollama 是一個開源工具,專門為 Apple Silicon 優化,可以讓你在 Mac 上本地執行各種開源 LLM。而 Google 的 Gemma 4 是一個強大的開源語言模型,提供從 8B 到 26B 不同規格的版本,完全免費使用。

但本地部署最大的痛點不是「裝不上」,而是「用起來不順手」。每次你想用它的時候,它可能還在冷啟動;或者你剛用完五分鐘,下次再來又要重新載入。這篇文章就是要解決這些問題——讓你的本地 AI 像 App 一樣,開機就在、隨時待命。

硬體需求:你需要什麼規格?

在開始之前,先確認你的 Mac mini 符合以下要求:

為什麼記憶體這麼重要?因為 Gemma 4 8B 版本載入後需要約 9.6GB 的記憶體。如果你的 Mac mini 只有 8GB 或 16GB,運行模型後系統可能會開始 swap,導致整體效能大幅下降。24GB 的配置可以讓模型和 macOS 並存,還有足夠的餘裕處理並發請求。

根據原作者的實測,26B 版本的 Gemma 4 需要約 17GB 記憶體,在 24GB 的 Mac mini 上運行會留下約 7GB 給系統。這不是不能跑,但在並發請求時會導致頻繁 swap、系統變慢,甚至被 macOS 殺掉進程。對於 24GB 的機器來說,8B 版本的體驗好很多。

第一步:安裝 Ollama

Ollama 提供了 macOS 原生應用程式,透過 Homebrew cask 安裝是最簡單的方式:

brew install --cask ollama-app

這個指令會做兩件事:
1. 將 Ollama.app 安裝到 /Applications/ 目錄
2. 在 /opt/homebrew/bin/ 下放置 ollama CLI 工具

安裝完成後,打開 Ollama 應用程式:

open -a Ollama

這時你的選單列會出現 Ollama 的圖示。等待幾秒鐘,讓它的伺服器初始化完成。

接下來驗證 Ollama 是否正常運作:

ollama list

這個指令應該會顯示一個空的模型列表,表示 Ollama 已經啟動並準備接收指令。

第二步:下載 Gemma 4 模型

Ollama 使用 pull 指令從其模型倉庫下載模型:

ollama pull gemma4

這會下載約 9.6GB 的數據,具體大小取決於網速。完成後再確認一下:

ollama list

輸出應該會類似這樣:

NAME           ID        SIZE      MODIFIED
gemma4:latest  ...       9.6 GB    ...

注意,如果你不指定版本,Ollama 預設會下載 gemma4:latest,也就是 8B 版本(Q4_K_M quantization)。這是最平衡的選擇:效能夠用、記憶體佔用合理。

如果你非要用 26B 版本(假設你的 Mac mini 有 32GB 或更多記憶體),可以明確指定:

ollama pull gemma4:26b

但請記住,26B 版本的記憶體佔用是 17GB,在 24GB 的機器上運行體驗不佳。

第三步:測試模型是否正常運作

下載完成後,先試跑一次,確認一切正常:

ollama run gemma4:latest "Hello, what model are you?"

模型應該會回覆,告訴你它是 Gemma 4。這時我們需要確認它是否使用了 GPU 加速,而不是只在 CPU 上跑:

ollama ps

輸出會顯示當前運行的模型和資源使用情況:

NAME           ID        SIZE      PROCESSOR    CONTEXT     UNTIL
gemma4:latest  ...       9.6 GB    14%/86% CPU/GPU  4096    5m

關鍵是 PROCESSOR 欄位,它應該顯示類似「14%/86% CPU/GPU」的分割,表示 GPU 在做大部分運算。如果你的輸出是「100% CPU」,表示 GPU 加速沒有啟動,需要檢查 Ollama 的設定或 Apple Silicon 的版本。

第四步:讓 Ollama 開機自動啟動

這一步是讓體驗從「好用到」變成「好用」的關鍵。有兩種方式:

方法一:透過 Ollama 應用程式設定

  1. 點擊選單列的 Ollama 圖示
  2. 選擇「Launch at Login」並啟用它

這是最簡單的方式,以後每次登入 macOS,Ollama 都會自動啟動。

方法二:透過系統設定

  1. 打開「系統設定」>「一般」>「登入項目」
  2. 點擊「+」按鈕
  3. 選擇 /Applications/Ollama.app

兩種方法效果相同,選一個你習慣的即可。

第五步:讓模型預載入並永久熱候命

Ollama 預設會在五分鐘沒有請求後自動卸載模型。這對於節省記憶體是好事,但對於「隨時想用就能用」的體驗是壞事。

我們需要做兩件事:一是在 Ollama 啟動後預先載入模型,二是讓它永遠不要卸載。

首先,建立一個 Launch Agent,讓它在 Ollama 啟動後定期發送空請求,保持模型在記憶體中:

cat << 'EOF' > ~/Library/LaunchAgents/com.ollama.preload-gemma4.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.ollama.preload-gemma4</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/ollama</string>
    <string>run</string>
    <string>gemma4:latest</string>
    <string></string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>StartInterval</key>
  <integer>300</integer>
  <key>StandardOutPath</key>
  <string>/tmp/ollama-preload.log</string>
  <key>StandardErrorPath</key>
  <string>/tmp/ollama-preload.log</string>
</dict>
</plist>
EOF

這個檔案的作用是:
– 在 Launch Agent 載入時(RunAtLoad = true),立即執行一次 ollama run gemma4:latest ""(空字串請求)
– 之後每 300 秒(5 分鐘)重複一次空請求,保持模型熱候命
– 將輸出和錯誤訊息寫入 /tmp/ollama-preload.log,方便除錯

接下來載入這個 Launch Agent:

launchctl load ~/Library/LaunchAgents/com.ollama.preload-gemma4.plist

現在每 5 分鐘都會有一個空請求發送到 Ollama,確保模型不會被卸載。

但是,Ollama 還有自己的「閒置卸載」機制——即使你一直發送空請求,如果這些請求之間沒有真正的交互,Ollama 可能還是會認為模型是閒置的。我們需要改變環境變數,讓它永遠保留模型:

launchctl setenv OLLAMA_KEEP_ALIVE "-1"

這個指令設定了環境變數 OLLAMA_KEEP_ALIVE 為 -1,表示「永遠不要卸載模型」。

重要: 這個環境變數只對當前的登入 session 有效。如果你重開機或登出再登入,這個設定會消失。為了讓它永久生效,有兩個方法:

方法一:寫入 shell 設定檔

編輯你的 ~/.zshrc(如果你用 zsh)或 ~/.bash_profile(如果你用 bash):

echo 'export OLLAMA_KEEP_ALIVE="-1"' >> ~/.zshrc
source ~/.zshrc

方法二:透過另一個 Launch Agent 設定

建立一個專門用於設定環境變數的 Launch Agent:

cat << 'EOF' > ~/Library/LaunchAgents/com.ollama.setenv.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.ollama.setenv</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>setenv</string>
    <string>OLLAMA_KEEP_ALIVE</string>
    <string>-1</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
EOF

launchctl load ~/Library/LaunchAgents/com.ollama.setenv.plist

無論用哪個方法,設定好之後都需要重啟 Ollama 才會生效:

# 關閉 Ollama
killall Ollama

# 重新啟動
open -a Ollama

第六步:驗證所有設定是否正常

現在,讓我們驗證所有東西都按預期運作:

檢查 Ollama 伺服器是否運作:

ollama list

應該能看到 gemma4:latest 在清單中。

檢查模型是否載入記憶體:

ollama ps

輸出應該類似這樣:

NAME           ID        SIZE      PROCESSOR    CONTEXT     UNTIL
gemma4:latest  ...       9.6 GB    14%/86% CPU/GPU  4096    Forever

關鍵是 UNTIL 欄位應該是「Forever」,表示模型會永遠留在記憶體中。

檢查 Launch Agent 是否註冊:

launchctl list | grep ollama

應該能看到兩個 agent:
– com.ollama.preload-gemma4
– com.ollama.setenv(如果你選擇方法二的話)

檢查預載 log(可選):

cat /tmp/ollama-preload.log

這應該會顯示定期執行的空請求記錄。

第七步:透過 API 使用 Ollama

Ollama 不只是一個命令列工具,它還提供了一個本地 HTTP API,位於 http://localhost:11434。這個 API 相容 OpenAI 的 chat/completions 格式,這意味著你可以用任何 OpenAI SDK 或工具來調用它。

例如,用 curl 發送請求:

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma4:latest",
    "messages": [{"role": "user", "content": "Hello"}]
  }'

如果你使用 Python,可以這樣:

import requests

response = requests.post(
    "http://localhost:11434/v1/chat/completions",
    headers={"Content-Type": "application/json"},
    json={
        "model": "gemma4:latest",
        "messages": [{"role": "user", "content": "Hello, how are you?"}]
    }
)

print(response.json()["choices"][0]["message"]["content"])

因為 API 是 OpenAI 相容的,你也可以用現有的 OpenAI Python 套件,只需要改變 base_url:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="dummy"  # Ollama 不需要真正的 API key
)

response = client.chat.completions.create(
    model="gemma4:latest",
    messages=[{"role": "user", "content": "Hello"}]
)

print(response.choices[0].message.content)

這對於開發來說非常方便——你可以先在本地用 Gemma 4 測試程式碼,確保沒有問題後,再換成雲端的 GPT-4 或 Claude,只需要改變 model 參數和 base_url。

第八步:常用指令速查表

指令 說明
ollama list 列出已下載的模型
ollama ps 顯示當前運行的模型及記憶體使用情況
ollama run gemma4:latest 開始互動式聊天
ollama run gemma4:latest "提示詞" 直接執行一次並輸出結果
ollama stop gemma4:latest 手動卸載模型(釋放記憶體)
ollama pull gemma4:latest 更新模型到最新版本
ollama rm gemma4:latest 刪除模型(釋放硬碟空間)

如果你想知道有哪些其他模型可用:

ollama list

如果你想下載其他開源模型,Ollama 支援很多,包括 Llama、Mistral、Qwen 等系列。具體清單可以查看 Ollama 官方網站的模型庫。

第九步:清除和卸載

如果你決定不再用 Ollama,可以這樣清理:

卸載預載的 Launch Agent:

launchctl unload ~/Library/LaunchAgents/com.ollama.preload-gemma4.plist
rm ~/Library/LaunchAgents/com.ollama.preload-gemma4.plist

# 如果你有用方法二
launchctl unload ~/Library/LaunchAgents/com.ollama.setenv.plist
rm ~/Library/LaunchAgents/com.ollama.setenv.plist

卸載 Ollama 應用程式:

brew uninstall --cask ollama-app

清理模型數據(如果有需要):

# 刪除 Gemma 4 模型
ollama rm gemma4:latest

# 或者刪整個 Ollama 目錄(這會刪除所有模型)
rm -rf ~/.ollama

關於 Apple Silicon 和 GPU 加速

Ollama 在 Apple Silicon 上的運行效率非常出色,這歸功於 Apple 的 MLX 框架。MLX 是 Apple 為機器學習設計的高效能框架,能夠充分利用 Neural Engine 和 GPU。

根據 Ollama 官方的說明,不同代的 Apple Silicon 晶片有不同的加速特性:

你不需要手動配置任何東西——Ollama 會自動檢測你的硬體並使用最佳配置。這就是為什麼 ollama ps 會顯示 GPU 分割比:它自動在 CPU、GPU 和 Neural Engine 之間分配計算。

關於記憶體管理

Ollama 有一個很有用的特性:它會在多個對話之間重用快取。假設你先用「你是一個 Python 專家」作為系統提示詞,然後問了三個問題;接著你用「你是一個 JavaScript 專家」又問了三個問題。Ollama 不會重新處理那兩個系統提示詞,而是用快取直接跳到具體問題,這樣可以大幅提升效能。

另外,Ollama 會在對話的「聰明位置」建立檢查點。什麼是聰明位置?就是那些可以重複利用的地方。例如,如果你用分支的方式追蹤多個不同的思考路徑,Ollama 會在分支點建立檢查點,這樣當你回溯或切換分支時,不需要重新計算。

對於 Gemma 4 8B 版本來說,載入記憶體後佔用約 9.6GB。在 24GB 的 Mac mini 上,這會留下約 14GB 給 macOS 和其他程式。這是一個非常舒適的配置,可以支援並發請求而不會導致系統卡頓。

為什麼 26B 版本在 24GB 的機器上體驗不好?因為 17GB 的模型載入後,只留下約 7GB 給系統。這在日常使用或許還夠,但一旦你開啟瀏覽器、編輯器、多個終端機,再加上 Ollama 的並發請求,就很容易觸發 macOS 的記憶體壓力機制,開始 swap 或殺掉進程。所以對於 24GB 的 Mac mini,8B 版本是最實際的選擇。

結語:本地部署的真正價值

設定好這一切之後,你的 Mac mini 就變成了一個「開機即用」的本地 AI 伺服器。重開機之後不用手動啟動,模型永遠在記憶體中熱候命,API 隨時可以調用——這種體驗,和雲端 API 是一樣的,但多了一份掌控感。

你不必擔心上網延遲,不必擔心用量計費,不必擔心資料被傳到第三方。所有的運算都在你的機器上完成,所有的記憶體和硬碟都是你自己的。這對於開發測試、個人筆記、日常寫作來說,足夠了。

有些人會說,雲端模型的能力更強,為什麼要自己跑一個「次一級」的模型?這個問題本身就很奇怪——就像問「為什麼要自己煮飯,外面有餐廳」一樣。有時候,方便和掌控不是二選一,而是可以兼得的。

對於台灣的開發者來說,本地部署的意義可能更實際:它提供了一個低成本的測試環境。你可以在本地用 Gemma 4 測試你的程式碼,確定邏輯無誤後,再切換到雲端的 GPT-4 或 Claude 進行最終優化。這樣不僅節省 API 費用,還可以避免在測試階段浪費 tokens。

如果你已經有一台 Mac mini,為什麼不試試看呢?也許你會發現,本地 AI 的體驗,比你以想的要好得多。