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

レッスン 6: Ollama + MLX バックエンド - 2 つの世界の長所を組み合わせる

llama.cpp の代わりに MLX バックエンドを使用するように Ollama を構成します。詳細なベンチマーク。コンテキストウィンドウを最適化します。 MLX バックエンドをいつ使用するか、いつ llama.cpp を使用するか。

🧠 AI と ML — レッスン 2 レッスン 6: Ollama + MLX バックエンド - 良い組み合わせ 二つの世界のベスト

Apple Silicon で Ollama を使用して AI Local を実行する

パート 2: MLX - Apple のネイティブ フレームワークによる 3 倍の高速化

xdev.asia

はじめに

Ollama (便利、大規模な API、エコシステムを備えている) と MLX (Mac で高速である) についてはすでにご存知でしょう。当然の質問: この 2 つを組み合わせることはできますか?

答え: はい。 Ollama は MLX バックエンドをサポートしているため、Ollama のユーティリティ (API、モデル管理) を使用しながら、MLX エンジンを使用して推論することができます。


1. Ollama の MLX バックエンド

バージョン 0.5 以降から、Ollama は macOS での MLX のサポートを追加します。 llama.cpp (GGUF 形式) を使用する代わりに、MLX モデル (safetensors 形式) をインポートすると、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. 比較: 同じモデル、2 つのバックエンド

ベンチマーク スクリプト

#!/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 キャッシュが追加されました総RAM
2048年~0.5GB~6 GB
4096~1 GB~6.5GB
8192~2 GB~7.5GB
16384~4 GB~9.5GB
32768~8 GB~13.5 GB
131072~32 GB~37.5 GB

Modelfile にコンテキストを設定する

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。 macOS と他のアプリに十分な RAM があることを確認してください。


6. パフォーマンスの監視

アクティビティモニター

アクティビティ モニター → 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サーバーのオーバーヘッドなし

概要

アプローチ長所デメリットいつ使用するか
オラマ + ラマ.cpp安定したエコシステムMLX よりも遅い毎日のデフォルト
オラマ + MLXより速く、Ollama API を使用してくださいより複雑なセットアップスピード + API が必要
mlx-lm ライブ最速、柔軟API サーバーがありませんスクリプト、パイプライン

演習

  1. セクション 2 の手順に従って、MLX バックエンドを使用して Ollama モデルを作成します。 2.同じモデルの 2 つのバックエンド (llama.cpp と MLX) を比較するベンチマークを実行します。
  2. コンテキスト ウィンドウを 2048 → 4096 → 8192 と増やしてみます。RAM 使用量がどれだけ増加するかを記録します。
  3. テスト OLLAMA_KEEP_ALIVE=-1 — アイドル時に RAM に影響しますか?
  4. 個人的なワークフローを構築する: 日常の 3 つのユースケースに合わせてモデルとバックエンドを選択します

次の記事: Ollama REST API →