所要時間: 約25分 | 難易度: ★★☆☆☆
この記事で作るもの
Apple Silicon(M1/M2/M3/M4)に最適化されたフレームワーク「MLX」を利用して、Llama-3やGemma 2といった最新のLLMをローカル環境で動かすPythonスクリプトを作成します。 Hugging FaceにあるMLX専用モデルを自動ダウンロードし、ストリーミング形式(1文字ずつ表示される形式)でAIと対話できるツールを完成させます。 外部APIへの課金を気にせず、Macの性能をフルに引き出したプライベートなAI環境を構築することがゴールです。
先に確認するスペック・料金
ローカルLLMを動かす上で、最も重要なのは「チップの種類」と「ユニファイドメモリ(RAM)の容量」です。 MLXはApple Silicon専用のライブラリであるため、Intelチップを搭載した古いMacでは動作しません。 最低ラインはM1チップ以降ですが、実務でストレスなく動かすならメモリ容量が成功の鍵を握ります。
メモリ8GBのモデルでも7B(70億パラメータ)の4-bit量子化モデルなら動きますが、OSやブラウザがメモリを消費しているとスワップが発生し、一気に速度が低下します。 快適な推論速度を求めるならメモリ16GB以上、14Bや30Bといった大型モデルを視野に入れるなら32GB以上のスペックを強く推奨します。 私は仕事柄、Mac StudioのM2 Ultra(メモリ128GB)とMacBook Pro M3 Max(メモリ64GB)を使い分けていますが、ローカルLLMにおいては「メモリ量=扱えるモデルの知能」に直結します。
また、ディスク容量も重要です。 1つのモデルにつき、4-bit量子化済みのもので5GBから10GB程度の空き容量を確保しておいてください。 ソフトウェア自体は無料であり、モデルもHugging Faceから無料で取得できるため、初期投資(Mac本体代)以外のランニングコストは電気代のみです。
なぜこの方法を選ぶのか
MacでローカルLLMを動かす手段として、他に「Ollama」や「llama.cpp」があります。 これらも優秀なツールですが、あえて「MLX」を選択する理由は、Appleの機械学習チームが直接開発しているという圧倒的な安心感と最適化にあります。 MLXは「ユニファイドメモリ」の特性を最大限に活かす設計になっており、GPUとCPUの間での不要なデータコピーが発生しません。
他のフレームワークが「クロスプラットフォーム」を意識する中で、MLXは「Apple Siliconのためだけ」に書かれています。 この特化具合が、推論時のレイテンシ(反応速度)やスループット(秒間トークン数)の差となって現れます。 また、Pythonから直接操作できるため、将来的にRAG(外部知識参照)や自作アプリへの組み込みを行う際、エンジニアにとって最も柔軟性が高い選択肢になります。
Step 1: 環境を整える
まずはMLXを動かすためのPython環境を構築します。 macOSには標準でPythonが入っていますが、システム環境を汚さないために仮想環境を作成するのが鉄則です。
# プロジェクト用のディレクトリを作成
mkdir mlx-test && cd mlx-test
# Python 3.11以上を推奨。venvで仮想環境を作成
python3 -m venv .venv
# 仮想環境を有効化
source .venv/bin/activate
# MLX関連のライブラリをインストール
# mlx-lmはHugging Faceとの連携が強化されたハイレベルライブラリです
pip install mlx-lm
mlx-lmは、MLXチームが提供しているライブラリで、モデルのダウンロード、量子化、推論を数行のコードで完結させることができます。
低レイヤーのMLX本体を直接触るよりも、実務ではこのmlx-lmを使うのが最も効率的です。
⚠️ 落とし穴:
pip install mlx ではなく pip install mlx-lm をインストールしてください。
前者は計算フレームワーク本体のみで、LLMを動かすための高レベルな機能(モデル読み込み等)が含まれていません。
また、Xcode Command Line Toolsがインストールされていないとコンパイルエラーが出る場合があるため、未導入なら xcode-select --install を先に実行してください。
Step 2: 基本の設定
次に、動かしたいモデルを選択し、Pythonスクリプトを作成します。 今回は、Metaが公開し、現在最も汎用性が高い「Llama-3-8B」のMLX最適化版を使用します。
# app.py という名前で保存してください
from mlx_lm import load, generate
# 使用するモデルの指定
# mlx-communityというアカウントが、公式モデルをMLX形式に変換して公開しています
model_id = "mlx-community/Meta-Llama-3-8B-Instruct-4bit"
# モデルとトークナイザーの読み込み
# 最初の実行時はHugging Faceから数GBのデータがダウンロードされます
model, tokenizer = load(model_id)
# プロンプトの設定
# Llama-3の型式に合わせた指示文を作成します
prompt = "MacでローカルLLMを動かすメリットを3つ教えてください。"
messages = [{"role": "user", "content": prompt}]
formatted_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
mlx-community/Meta-Llama-3-8B-Instruct-4bit を選んでいる理由は、メモリ消費量を抑えるためです。
「4bit」と付いているのは量子化モデルであることを示しており、精度を維持しつつメモリ使用量を約1/4に削減しています。
16GBメモリのMacであれば、このモデルで秒間20〜30トークン以上の高速なレスポンスを体感できるはずです。
Step 3: 動かしてみる
設定ができたら、実際にモデルを走らせて結果を取得します。 まずは一括で出力を表示するシンプルなコードで動作確認をしましょう。
# 推論の実行
# max_tokensで生成する長さ、tempreatureで回答の「創造性」を調整します
response = generate(
model,
tokenizer,
prompt=formatted_prompt,
verbose=True,
max_tokens=500
)
print(f"\nAIの回答:\n{response}")
期待される出力
AIの回答:
1. プライバシーの確保:データが外部サーバーに送信されないため、機密情報を扱えます。
2. オフライン動作:インターネット接続なしでAIを利用可能です。
3. コスト削減:API利用料が発生せず、ハードウェアの性能を使い倒せます。
verbose=True に設定していると、コンソールに推論速度(Tokens per second)が表示されます。
ここで「秒間何トークン出ているか」を確認してください。
人間が文章を読む速度は秒間5〜10トークン程度と言われているので、それを超えていれば十分に「実用的」と判断できます。
Step 4: 実用レベルにする
一括表示では、長い回答が生成されるまで待機時間が発生してしまいます。 ChatGPTのように、生成された文字から順次表示される「ストリーミング」機能を実装しましょう。 これができると、体感的な待ち時間がほぼゼロになります。
import sys
from mlx_lm import load, generate
def chat_stream(model_id, prompt_text):
model, tokenizer = load(model_id)
messages = [{"role": "user", "content": prompt_text}]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
print("AI: ", end="", flush=True)
# generate関数のなかでstream=Trueに相当する処理を実装
# 実際にはmlx_lmの低レイヤーAPIを使うか、生成プロセスをループさせます
# mlx-lmの最新版ではgenerate自体にストリーム表示機能が含まれています
response = generate(
model,
tokenizer,
prompt=prompt,
max_tokens=1000,
# 逐次表示を有効にするためのコールバック的な挙動
stream=True
)
# mlx-lmのgenerate(stream=True)はイテレータを返すので
# 以下のようにループで回して表示します
for chunk in response:
print(chunk, end="", flush=True)
print("\n")
if __name__ == "__main__":
user_input = input("質問を入力してください: ")
chat_stream("mlx-community/Meta-Llama-3-8B-Instruct-4bit", user_input)
このコードでは、stream=True を活用してトークンが生成されるたびに print を実行しています。
flush=True を指定しないと、バッファに溜まって表示が遅れることがあるため注意が必要です。
実務で社内用チャットツールなどを作る際は、このストリーミング処理がUX(ユーザー体験)を大きく左右します。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
ImportError: No module named 'mlx' | ライブラリが未インストール、または仮想環境が未有効 | pip install mlx-lm を実行し、source .venv/bin/activate を確認 |
Killed または強制終了 | メモリ不足(OOM) | モデルをより小さいもの(例: 7Bの4-bit以下)にするか、他のアプリを閉じる |
| 推論が極端に遅い | スワップが発生している | アクティビティモニタで「メモリプレッシャー」を確認。8GBモデルなら4-bit量子化は必須 |
次のステップ
MLXでローカルLLMが動かせるようになったら、次は「自分だけの知識」をAIに与えるRAG(Retrieval-Augmented Generation)に挑戦してください。
mlx-embedding というライブラリを使えば、テキストのベクトル化もApple Silicon上で高速に行えます。
PDFや社内ドキュメントを読み込ませ、その内容に基づいてMLX上のLLMが回答する仕組みを作れば、実務での活用価値は一気に跳ね上がります。
また、mlx-community には画像生成モデルの「Stable Diffusion」や音声認識の「Whisper」のMLX版も公開されています。
これらを組み合わせれば、Mac 1台で完結するマルチモーダルなAIアシスタントを自作することも可能です。
APIの制限に縛られず、ハードウェアの限界までAIを使い倒す楽しさを、ぜひこのMLXで体験し続けてください。
よくある質問
Q1: M1 MacBook Airのメモリ8GBで動きますか?
動きます。ただし、Meta-Llama-3-8B-Instruct-4bit などの軽量な量子化モデルを選んでください。ブラウザのタブを大量に開いているとメモリ不足で落ちるため、実行時は他の重いアプリを終了させるのがコツです。
Q2: Hugging FaceにあるどのモデルでもMLXで動かせますか?
そのままでは動かせません。MLX専用のウェイト形式に変換する必要があります。ただし、mlx-community アカウントが主要なモデル(Gemma, Mistral, Qwen等)を変換済みで公開しているため、まずはそこから探すのが一番早いです。
Q3: Python以外の言語からMLXを使えますか?
MLXはC++のAPIも提供しているため、SwiftなどのApple系言語から呼び出すことも可能です。ただし、開発効率やライブラリの充実度を考えると、Pythonでプロトタイプを作り、必要に応じてC++/Swiftへ移行する流れが現実的です。
📦 この記事に関連する商品(楽天メインで価格確認)
MacBook Pro M3 Max/Pro32GB以上のメモリがあれば14Bモデルも快適に動作し、MLXの真価を発揮できます
※アフィリエイトリンクを含みます





