所要時間: 約25分 | 難易度: ★★☆☆☆
この記事で作るもの
Apple Silicon(M1/M2/M3/M4チップ)に最適化されたフレームワーク「MLX」を使い、Llama 3.1やQwen 2.5などの最新モデルを爆速で動かすPythonスクリプトを作成します。 一般的なllama.cppやOllamaよりもApple Siliconのメモリ帯域をフルに活用できるため、より高いトークン生成速度を実現できます。
- Pythonから直接LLMを呼び出し、ストリーミング形式で回答を表示するプログラム
- Hugging Faceから好みのモデルをダウンロードし、MLX形式で実行する手順
- ユニファイドメモリを効率的に使うための設定
前提知識:ターミナルでのコマンド入力、Pythonの基本的な文法(importや関数の呼び出し)ができること。 必要なもの:Apple Silicon搭載のMac(Intel Macは不可)。
先に確認するスペック・料金
MLXはApple Silicon専用のフレームワークです。 IntelチップのMacや、Windows(NVIDIA GPU)では動作しません。 自宅のRTX 4090搭載機と比較しても、MLXで動かすMacは「VRAM容量の壁」を突破しやすいという圧倒的なメリットがあります。
まず、自身のMacのメモリ(RAM)を確認してください。
- 8GB:小規模な3Bモデル(Gemma 2 2Bなど)が限界。
- 16GB:7B〜8Bクラスのモデルが快適に動く(Llama 3.1 8Bなど)。
- 32GB以上:14B〜32Bクラスのモデルが選択肢に入る。
- 64GB以上:70Bクラスの巨大モデルをローカルで動かすためのスタートライン。
MLXは無料のオープンソースライブラリであり、モデルもHugging Faceから無料で取得できるため、実行にかかる費用は電気代のみです。 API料金を気にせず、1日中プロンプトを投げ続けられる環境が月額$0で手に入ります。
なぜこの方法を選ぶのか
MacでローカルLLMを動かす手段として、OllamaやLM Studioが有名です。 しかし、それらは内部でllama.cppを利用していることが多く、Apple Siliconの性能を100%引き出せているわけではありません。 MLXはAppleの機械学習チームが自ら開発しているため、メタデータの読み込みから行列演算までがチップの設計に最適化されています。
特に「メモリ帯域」の使い方が異なります。 M3 Maxなどの上位チップでは、メモリ帯域が400GB/sを超えますが、MLXはこの広帯域をフルに使って計算を行うため、推論速度(tokens/sec)が他のツールより1.2倍〜1.5倍ほど速くなるケースが多いです。 また、Pythonから直接ライブラリとして叩けるため、独自のRAG(検索拡張生成)システムやエージェントを構築する際、外部プロセスを立ち上げる手間がないのが実務上の強みです。
Step 1: 環境を整える
MLXを導入するために、Pythonの仮想環境を作成します。
既存のシステムPythonを汚さないよう、必ず仮想環境を使いましょう。
私はパッケージ管理にuvを推奨していますが、ここでは汎用的なvenvを使った手順を示します。
# プロジェクト用ディレクトリの作成
mkdir mlx-test && cd mlx-test
# Python 3.10以上が必要です
python3 -m venv .venv
source .venv/bin/activate
# mlx-lmのインストール
# mlx本体だけでなく、Hugging Faceとの連携機能を含むライブラリを入れます
pip install mlx-lm
mlx-lmは、Hugging FaceにあるモデルをMLX向けに最適化してロードするためのラッパーです。
これを入れるだけで、量子化されたモデルのダウンロードから推論までを一気通貫で行えます。
⚠️ 落とし穴: macOSのバージョンが古いと動作しません。macOS 13.5 (Ventura) 以上、できれば最新のSonoma以降を推奨します。また、Command Line Tools(xcode-select –install)が入っていないと、インストール中にコンパイルエラーが出ることがあります。
Step 2: 基本の設定
次に、Pythonスクリプトを作成します。 ここでは、現在もっともコスパが良い(賢さと速さのバランスが取れている)「Qwen2.5-7B-Instruct-4bit」を使用します。 4bit量子化版を選ぶ理由は、メモリ消費を抑えつつ、推論速度を最大化するためです。
# main.py
from mlx_lm import load, generate
# モデルの指定。Hugging Faceのレポジトリ名を書く。
# mlx-communityが公開している4bit版を指定するのが最短経路です。
model_path = "mlx-community/Qwen2.5-7B-Instruct-4bit"
# モデルとトークナイザーのロード
# Apple Siliconのユニファイドメモリへ展開されます。
model, tokenizer = load(model_path)
# プロンプトの設定
# Instructモデルなので、チャット形式のテンプレートを適用します。
messages = [
{"role": "system", "content": "あなたは優秀なAIアシスタントです。"},
{"role": "user", "content": "Apple Siliconのすごさを3行で教えて。"}
]
# テンプレートを適用して文字列に変換
prompt = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
load関数は、初回実行時にHugging Faceから数GBのモデルデータをダウンロードします。
「mlx-community」というアカウントが、主要なモデルをMLX用に最適化してアップロードしてくれているので、これを利用するのが実務上の正解です。
自前で変換(変換コマンドもMLXにはありますが)するのは、モデルが公開された直後だけで十分です。
Step 3: 動かしてみる
作成したスクリプトに推論コードを付け加えます。 ここでは、生成されるテキストをリアルタイムで表示する「ストリーミング」は行わず、まずは一括で出力させて動作を確認します。
# Step 2の続きに追記
response = generate(
model,
tokenizer,
prompt=prompt,
max_tokens=500, # 最大生成トークン数。長文が必要なら増やす。
temp=0.7 # 自由度。0に近いほど確実、1に近いほど創造的になる。
)
print(response)
期待される出力
1. 高い電力効率:低消費電力でありながら、圧倒的な処理能力を実現しています。
2. ユニファイドメモリ:CPUとGPUが同じメモリ空間を共有し、データの移動を最小限に抑えられます。
3. 専用エンジンの搭載:Neural EngineやMLX最適化により、AI推論が驚異的なスピードで動作します。
私のM2 Max(64GBメモリ)環境では、この出力が1秒かからずに完了します。 レスポンス速度に注目してください。 API経由(GPT-4oなど)だとネットワークのオーバーヘッドで「待ち」が発生しますが、ローカルMLXはエンターキーを押した瞬間に答えが返ってくる感覚に近い。
Step 4: 実用レベルにする
実務で使うなら、ChatGPTのように文字がパラパラと出てくるストリーミング表示が必須です。 また、複数の質問を連続して行えるようにループ処理を組み込みます。 以下のコードは、私がローカルでちょっとした要約やコード生成をさせたいときに実際に使っているテンプレートです。
import sys
from mlx_lm import load, generate
def chat_loop():
model_path = "mlx-community/Qwen2.5-7B-Instruct-4bit"
model, tokenizer = load(model_path)
print("--- MLX Chatbot (type 'quit' to exit) ---")
while True:
user_input = input("\nUser: ")
if user_input.lower() == "quit":
break
messages = [
{"role": "system", "content": "あなたは簡潔に答える技術者です。"},
{"role": "user", "content": user_input}
]
prompt = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
print("AI: ", end="", flush=True)
# generate関数の代わりに、ストリーミング用の仕組みはないが
# mlx-lmには generate の過程を表示する機能がある。
# 簡易的にストリーム風の挙動をさせるには以下のように書く。
response = generate(
model,
tokenizer,
prompt=prompt,
max_tokens=1000,
temp=0.7,
# 回答を表示しながら生成する
verbose=False
)
print(response)
if __name__ == "__main__":
chat_loop()
実はMLXのgenerate関数自体は一括出力ですが、mlx_lm.utils.generate_stepなどを使うと、1トークンずつ取得して表示する完全なストリーミングを実装できます。
しかし、初心者がハマりやすいのは「トークナイザーのデコード処理」です。
日本語の場合、1つの文字が複数のトークンに分割されるため、単純に1トークンずつデコードすると文字化けが発生します。
実務上は、ライブラリ側でそのあたりをハンドリングしてくれるラッパー関数を作るのが定石です。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
MemoryError または動作が極端に遅い | メモリ(RAM)不足。モデルが大きすぎる。 | 8B以上のモデルを使っているなら、4bit量子化版(-4bit)に変更する。 |
ImportError: No module named 'mlx' | 仮想環境にインストールされていない、またはIntel版Pythonを使っている。 | python --versionで確認。Apple Silicon版のPythonを使用してください。 |
KeyError: 'chat_template' | 古いモデルや、チャット用ではないモデルを使っている。 | Instruct版のモデル(例:Llama-3.1-8B-Instruct)を選択してください。 |
次のステップ
MLXを動かせるようになったら、次は「自分専用の知識」を読み込ませるRAG(検索拡張生成)に挑戦してください。 MLXには、埋め込みベクトルを生成するためのモデルも多数用意されています。 例えば、ローカルのPDFファイルを読み取って、その内容についてMLX上のLLMに質問するシステムは、Mac 1台で完結します。
また、MLXの真骨頂は「LoRA(Low-Rank Adaptation)」によるファインチューニングの速さです。 自分のメールの書き方や、社内のドキュメント形式を数十分の学習でLLMに覚えさせることができます。 RTX 4090を回すとファンが轟音を立てますが、Mac Studioなら静寂の中で学習が完了します。 この「静かで速い」という体験こそが、開発効率を最大化させるのです。
よくある質問
Q1: メモリ8GBのMacBook Airでも動きますか?
動きます。ただし、モデルのサイズを極限まで削る必要があります。Qwen2.5-1.5BやGemma-2Bの4bit量子化版なら、メモリ消費を2GB以下に抑えられるため、ブラウザを開きながらでも実用的な速度で動作します。
Q2: llama.cppと比べて何が良いんですか?
コードの書きやすさと、Apple Siliconへの「ネイティブ感」です。llama.cppはC++ベースで非常に優秀ですが、Pythonから扱う場合はバインディングが必要です。MLXは最初からPythonフレンドリーに設計されているため、深層学習の研究者やデータサイエンティストが馴染みのある書き方でLLMを操作できます。
Q3: GPUの使用率はどこで確認できますか?
アクティビティモニタの「GPUの軌跡」を見るか、ターミナルで sudo powermetrics --samplers gpu_power を実行してください。MLXが動いている間、GPUのグラフが跳ね上がるのを確認できるはずです。これがユニファイドメモリのパワーを使っている証拠です。
📦 この記事に関連する商品(楽天メインで価格確認)
Mac mini (32GBメモリ以上)MLX検証に最適。32GBあれば14Bモデルまで快適に動作し、コスパも最高クラス。
※アフィリエイトリンクを含みます

