所要時間: 約40分 | 難易度: ★★☆☆☆

この記事で作るもの

  • MLXフレームワークを用いて、Apple Silicon(M1/M2/M3)上でLlama 3やQwen 2.5などの最新LLMを高速に動作させるPythonスクリプト
  • Pythonの基礎知識(仮想環境の作成、pipインストールができる程度)があれば完結します。
  • 外部APIに一切頼らず、Macのローカルリソースだけで動作する「プライバシー重視」のAI環境を構築します。

📦 この記事に関連する商品(楽天メインで価格確認)

MacBook Pro M3 36GB

MLXで8B〜14Bモデルを余裕を持って動かすための推奨スペック

楽天で価格を見る Amazonでも確認

※アフィリエイトリンクを含みます

先に確認するスペック・料金

Apple Siliconを搭載したMac(M1以降)が必須です。 Intel MacではMLXは動作しません。 最も重要なのは「ユニファイドメモリ(RAM)」の容量です。

私が検証した結果、8GBモデルでも動作はしますが、OSの動作が重くなり、実用的とは言えません。 パラメータ数8Bクラスのモデルを快適に動かすなら、最低でも16GB、できれば24GB以上のメモリを推奨します。 32GBあれば、14B〜30Bクラスのモデルも視野に入ってきます。

OSはmacOS Monterey 12.0以降が必要ですが、最新の最適化を享受するためにmacOS Sonoma 14.0以降へのアップデートを強く勧めます。 API利用料は0円ですが、モデルのダウンロードに数GB〜数十GBのストレージ容量と高速なネット回線を用意してください。 「どのMacを買えばいいか」と聞かれたら、私は迷わず「中古でもいいからメモリ32GB以上のモデルを選べ」と答えます。

なぜこの方法を選ぶのか

MacでローカルLLMを動かす方法は、Ollamaやllama.cppなど他にも存在します。 しかし、Pythonエンジニアが「自作アプリに組み込む」「特定のタスクを自動化する」なら、MLX一択です。 MLXはAppleの機械学習チームが開発した専用フレームワークであり、ユニファイドメモリの管理が他のライブラリより圧倒的に洗練されています。

具体的には、データのコピーを最小限に抑える「ゼロコピー」の仕組みが、推論速度に直結します。 また、Hugging Faceのモデルを数行のコードで呼び出せる「mlx-lm」ライブラリの登場により、構築のハードルが劇的に下がりました。 「ただチャットしたいだけ」ならOllamaで十分ですが、「AIを道具としてコードで制御したい」なら、MLXを習得するのが最も近道です。

Step 1: 環境を整える

まずは、Pythonの実行環境を構築します。 既存の環境を汚さないよう、必ず仮想環境を作成しましょう。

# プロジェクト用のディレクトリを作成
mkdir my-mlx-project
cd my-mlx-project

# Python 3.10以上を推奨
python3 -m venv .venv

# 仮想環境を有効化
source .venv/bin/activate

# MLX推論用のコアライブラリをインストール
pip install -U mlx-lm

mlx-lm は、MLX上で大規模言語モデルを扱うためのハイレベルライブラリです。 これをインストールするだけで、依存関係にある mlx 本体も自動的に入ります。 パッケージ管理に uv を使っている方は、uv pip install mlx-lm とすると爆速で終わります。

⚠️ 落とし穴: Xcode Command Line Toolsがインストールされていないと、インストール中にエラーが出ることがあります。 その場合は xcode-select --install を実行してから再度試してください。 また、Pythonのバージョンが古い(3.9以前)と、MLXの最新機能が動作しないため注意が必要です。

Step 2: 基本の設定

次に、Pythonスクリプトを作成します。 MLXでは、Hugging Face上にアップロードされている「MLX形式に変換済みのモデル」を直接指定するのが最も簡単です。

# main.py
import os
from mlx_lm import load, generate

# 使用するモデルのパス
# 最初は軽量で高性能な「Llama-3-8B-Instruct」のMLX版を推奨します
model_path = "mlx-community/Meta-Llama-3-8B-Instruct-4bit"

# モデルとトークナイザーの読み込み
# load関数は、モデルが存在しなければ自動でダウンロードします
model, tokenizer = load(model_path)

# プロンプトの設定(Llama 3のテンプレートに合わせるのがコツ)
prompt = "Apple Siliconの魅力について、技術的な視点で短く教えてください。"

ここで 4bit 版のモデルを選択しているのがポイントです。 量子化(Quantization)されていないモデルはメモリを大量に消費しますが、4bit量子化版ならメモリ消費を1/4近くまで抑えつつ、精度低下は最小限で済みます。 私がRTX 4090で検証する際もそうですが、ローカル環境では「モデルの大きさ」よりも「いかにメモリに乗せるか」が速度の決め手になります。

Step 3: 動かしてみる

実際に推論を実行するコードを書き足します。 MLXの generate 関数は非常にシンプルです。

# 推論の実行
response = generate(
    model,
    tokenizer,
    prompt=prompt,
    max_tokens=500,     # 最大出力トークン数
    temp=0.7,           # 自由度(高いほど創造的、低いほど堅実)
    verbose=True        # 途中の経過を表示
)

print(f"\n--- 最終回答 ---\n{response}")

期待される出力

Apple Siliconの主な魅力は、ユニファイドメモリ・アーキテクチャ(UMA)にあります。
CPUとGPUが同じメモリ空間を共有することで、データ移動のボトルネックが解消され、
特にLLMのようなメモリ帯域を多く消費するタスクで圧倒的なパフォーマンスを発揮します。

ターミナルに文字がタイピングされるように表示されれば成功です。 M2 Pro/16GBの私の環境では、秒間約15〜20トークン程度の速度が出ました。 これは人間が読むスピードよりも遥かに速く、十分に実用的です。

Step 4: 実用レベルにする

単発の回答だけでなく、ストリーミング出力(生成中の文字を順次表示)に対応させ、より使いやすく改良します。 また、日本語モデルとして評価の高い Qwen2.5-7B を使ってみましょう。

import sys
from mlx_lm import load, stream

model_path = "mlx-community/Qwen2.5-7B-Instruct-4bit"
model, tokenizer = load(model_path)

# チャット形式のテンプレートを適用
messages = [
    {"role": "system", "content": "あなたは優秀なエンジニアです。"},
    {"role": "user", "content": "MacでMLXを使うメリットを3点箇条書きで教えて。"}
]

# モデル固有のテンプレートを適用
prompt = tokenizer.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True
)

# ストリーミング生成
print("AI: ", end="", flush=True)
for response in stream(model, tokenizer, prompt=prompt, max_tokens=1000):
    print(response, end="", flush=True)
print()

このコードのポイントは tokenizer.apply_chat_template です。 LLMにはそれぞれ「この形式で入力してほしい」という独自のテンプレートがあります。 これを無視すると、回答が不自然になったり、途中で途切れたりします。 apply_chat_template を使えば、モデルごとの差異をライブラリ側で吸収してくれるため、汎用性が一気に高まります。

よくあるトラブルと解決法

エラー内容原因解決策
Killed または強制終了メモリ(RAM)不足より小さいモデル(3Bクラス)か、量子化ビット数の低いものを選ぶ。
ModuleNotFoundError: mlx仮想環境が未有効、またはインストール失敗source .venv/bin/activate を実行してから pip install mlx-lm を再試行。
出力が文字化けするモデルが日本語非対応、またはトークナイザーの不一致Qwen や Llama-3 系の日本語対応モデル、またはその派生版を使用する。

次のステップ

MLXでモデルを動かせるようになったら、次は「独自データの読み込み(RAG)」や「ファインチューニング(LoRA)」に挑戦してみてください。 特にMLXのサンプルリポジトリに含まれている lora.py を使えば、Mac 1台で自分の口調を学習させたモデルを作ることも可能です。

また、Web UIを自作したい場合は Streamlit と組み合わせるのが最も簡単です。 Pythonだけで100行も書かずに、ブラウザで動く自分専用のChatGPTクローンが作れます。 私は自宅のMac StudioにMLXを常駐させ、API経由でiPhoneからショートカット経由で呼び出す自作アシスタントを運用していますが、レスポンスの速さには毎日驚かされています。

よくある質問

Q1: M1の無印(メモリ8GB)でも動きますか?

動きますが、モデルは Llama-3-8B よりもさらに軽量な Gemma-2B や Qwen2.5-1.5B などを選ぶ必要があります。 8Bモデルを無理に動かすと、スワップが発生してSSDの寿命を縮めるだけでなく、推論速度も秒間1トークン以下まで落ちるため推奨しません。

Q2: Hugging Faceにある普通のモデルは使えないのですか?

MLX専用の形式に変換する必要があります。 ただし、mlx-community という公式アカウントが主要なモデルをほぼ全て変換してアップロードしてくれているため、まずはそこから探すのがベストです。 自前で変換したい場合は mlx_lm.convert コマンドを使用します。

Q3: GPUの使用率はどうやって確認すればいいですか?

アクティビティモニタの「GPUの履歴」を表示するか、ターミナルで sudo powermetrics --samplers gpu_power と打つことで確認できます。 MLXが動いている間、GPUグラフがフルに跳ね上がるのを見るのは、Macユーザーとしての醍醐味の一つです。


あわせて読みたい