Chuyển đến nội dung chính

第 6 課:Ollama + MLX 後端 - 結合兩個世界的優點

配置 Ollama 以使用 MLX 後端而不是 llama.cpp。詳細的基準。優化上下文視窗。何時使用 MLX 後端,何時使用 llama.cpp。

🧠 人工智慧與機器學習 — 第 2 課 第 6 課:Ollama + MLX 後端 - 良好的組合 兩個世界中最好的

在 Apple Silicon 上使用 Ollama 運行本地 AI

第 2 部分:MLX - 使用 Apple 原生框架實現 3 倍加速

亞洲開發網

簡介

您已經了解 Ollama(方便,擁有大型 API、生態系統)和 MLX(在 Mac 上更快)。自然問題:**兩者可以結合嗎? **

答:是。 Ollama 支援 MLX 後端,讓您可以使用 Ollama 的實用程式(API、模型管理),但使用 MLX 引擎進行推理。


1. Ollama 中的 MLX 後端

從版本 0.5+ 開始,Ollama 新增了對 macOS 上的 MLX 的支援。您可以匯入 MLX 模型(safetensors 格式),而不是使用 llama.cpp(GGUF 格式),Ollama 將使用 MLX 引擎。

它是如何工作的

                    ┌─────── Backend ────────┐
User ──► Ollama ──►│ llama.cpp (default)     │──► Response
         API       │ MLX (khi dùng MLX model)│
                    └────────────────────────┘

2. 根據 MLX 權重建立 Ollama 模型

第 1 步:下載模型 MLX

# Dùng huggingface-cli
pip3 install huggingface-hub
huggingface-cli download mlx-community/Llama-3.2-3B-Instruct-4bit \
  --local-dir ./models/llama-3.2-3b-mlx

第 2 步:建立模型文件

cat > Modelfile.mlx << 'EOF'
FROM ./models/llama-3.2-3b-mlx

PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096

SYSTEM """Bạn là trợ lý AI thông minh. Trả lời ngắn gọn, chính xác, bằng tiếng Việt."""
EOF

第 3 步:在 Ollama 中建立模型

ollama create llama3.2-mlx -f Modelfile.mlx

第 4 步:運行

ollama run llama3.2-mlx

現在 Ollama 將為該模型使用 MLX 引擎,但您仍然像往常一樣使用 Ollama CLI 和 API。


3. 比較:相同模型,兩個後端

基準腳本

#!/bin/bash
# benchmark-backends.sh

PROMPT="Write a Python function that implements binary search on a sorted list. Include docstring and type hints."

echo "=== Ollama + llama.cpp (GGUF) ==="
curl -s http://localhost:11434/api/generate -d "{
  \"model\": \"llama3.2\",
  \"prompt\": \"$PROMPT\",
  \"stream\": false
}" | python3 -c "
import sys, json
d = json.load(sys.stdin)
pt = d['prompt_eval_duration']/1e9
gt = d['eval_duration']/1e9
print(f'Prompt: {d[\"prompt_eval_count\"]} tok in {pt:.2f}s = {d[\"prompt_eval_count\"]/pt:.0f} tok/s')
print(f'Generate: {d[\"eval_count\"]} tok in {gt:.2f}s = {d[\"eval_count\"]/gt:.0f} tok/s')
"

echo ""
echo "=== Ollama + MLX ==="
curl -s http://localhost:11434/api/generate -d "{
  \"model\": \"llama3.2-mlx\",
  \"prompt\": \"$PROMPT\",
  \"stream\": false
}" | python3 -c "
import sys, json
d = json.load(sys.stdin)
pt = d['prompt_eval_duration']/1e9
gt = d['eval_duration']/1e9
print(f'Prompt: {d[\"prompt_eval_count\"]} tok in {pt:.2f}s = {d[\"prompt_eval_count\"]/pt:.0f} tok/s')
print(f'Generate: {d[\"eval_count\"]} tok in {gt:.2f}s = {d[\"eval_count\"]/gt:.0f} tok/s')
"

結果範例(M3 Pro 36GB)

指標駱駝.cppMLX加速
及時處理285 托克/秒640 托克/秒2.2 倍
代幣生成33 托克/秒55 托克/秒1.7 倍
記憶體使用情況6.5GB5.8GB-10%
API回應時間8.2秒4.8秒1.7 倍

4. 上下文視窗調整

上下文視窗決定了對話中文字模型「記住」的程度。增加上下文 = 消耗更多 RAM。

計算上下文的 RAM

KV Cache memory ≈ 2 × n_layers × n_heads × head_dim × context_length × 2 bytes (FP16)

Llama 3.2 8B 的上下文長度:

背景新增 KV 快取總記憶體
20482048 〜0.5 GB〜6 GB
4096〜1 GB〜6.5 GB
8192〜2 GB〜7.5 GB
16384〜4 GB〜9.5 GB
32768〜8 GB〜13.5 GB
131072131072 〜32 GB〜37.5 GB

在模型檔案中設定上下文

FROM ./models/llama-3.2-3b-mlx

# Context window
PARAMETER num_ctx 8192

# Giảm context nếu ít RAM
# PARAMETER num_ctx 2048

在運行時設定上下文

# Override context khi chạy
ollama run llama3.2-mlx --num-ctx 16384

💡 推薦:從 4096,逐漸增加,直到 RAM 耗盡或足以滿足用例。


5.優化效能

GPU 利用率

# Kiểm tra model dùng GPU hay CPU
ollama ps

理想輸出: 100% GPU。如果您看到 CPU,則表示該模型不適合 GPU 可存取記憶體。

將模型保存在記憶體中

預設情況下,Ollama 在 5 分鐘空閒時間後卸載模型。改變:

# Giữ model loaded 30 phút
export OLLAMA_KEEP_ALIVE=30m

# Giữ vĩnh viễn (cho đến khi restart)
export OLLAMA_KEEP_ALIVE=-1

或在 API 中:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2-mlx",
  "keep_alive": -1
}'

同時運行多個模型

# Cho phép 3 model cùng lúc
export OLLAMA_MAX_LOADED_MODELS=3

# Chạy song song
export OLLAMA_NUM_PARALLEL=4

⚠️ 每個型號都佔自己的 RAM。 3 個型號 × 5GB = 15GB。確保有足夠的 RAM 用於 macOS 和其他應用程式。


6. 監控效能

活動監視器

開啟 Activity Monitor → GPU 選項卡可以看到:

  • 推理過程中 GPU 利用率百分比
  • GPU 記憶體使用情況

終端機監控

# Xem GPU usage real-time
sudo powermetrics --samplers gpu_power -i 1000

# Xem memory pressure
memory_pressure

# Xem Ollama process
ps aux | grep ollama

奧拉瑪日誌

# Xem logs chi tiết
cat ~/.ollama/logs/server.log | tail -50

# Follow logs real-time
tail -f ~/.ollama/logs/server.log

7. 推薦的工作流程

根據實務經驗,最佳工作流程如下:

日常使用:Ollama (llama.cpp)

# Model mặc định cho chat, hỏi đáp
ollama run qwen2.5:14b
  • 穩定、龐大的生態系(Open WebUI、Continue.dev...)
  • 夠快的互動聊天

當你需要速度時:Ollama + MLX

# Model MLX cho tác vụ cần nhanh
ollama run qwen2.5-mlx
  • 提示處理速度快 2 倍 → 第一顆代幣的時間非常低
  • 批量處理多個請求

腳本/管道:直接 mlx-lm

from mlx_lm import load, generate

model, tokenizer = load("mlx-community/Qwen2.5-14B-Instruct-4bit")
# Custom pipeline, batch processing, fine-tuning...
  • 完全控制
  • 沒有 Ollama 伺服器開銷

總結

方法優點缺點何時使用
奧拉馬 + llama.cpp穩定,生態系比 MLX 慢每日預設
奧拉馬 + MLX使用 Ollama API 更快更複雜的設定需要速度+API
MLX-LM 直播最快、靈活沒有API伺服器腳本、管道

練習

  1. 根據第 2 節的說明使用 MLX 後端建立 Ollama 模型
  2. 執行基準測試,比較同一模型的兩個後端(llama.cpp 與 MLX)
  3. 嘗試增加上下文視窗:2048 → 4096 → 8192。記錄 RAM 使用量增加了多少?
  4. 測試 OLLAMA_KEEP_ALIVE=-1 — 空閒時會影響 RAM 嗎?
  5. 建立個人工作流程:為您的 3 個日常用例選擇模型 + 後端

下一篇:Ollama REST API →