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

この記事で作るもの

Apple純正の機械学習フレームワーク「MLX」を使用し、MacのGPUをフル活用してLlama 3やGemma 2などの最新LLMを爆速で動かすPythonスクリプトを作成します。 llama.cppのようなツールを介さず、Pythonから直接モデルを制御するため、将来的に自作アプリへAI機能を組み込む土台になります。 Pythonの基本的な読み書きができ、ターミナルでコマンドを打つことに抵抗がない方を対象としています。

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

Apple Silicon(M1, M2, M3, M4シリーズ)を搭載したMacが必須です。 IntelチップのMacではMLXは動作しません。 最も重要なのは「ユニファイドメモリ(RAM)」の容量です。

最低ラインは8GBですが、OSやブラウザがメモリを消費するため、実際にモデルに割り当てられるのは4〜5GB程度になります。 7B(70億パラメータ)クラスのモデルを4bit量子化で動かすには、最低16GBのメモリを積んだモデルを強く推奨します。 私はMac Studio(M2 Ultra / 128GBメモリ)でも検証していますが、メモリが多ければ多いほど、Llama-3-70Bのような巨大なモデルも快適に動作します。 APIは一切使わず、自分のPC内で完結するため、月額費用や従量課金は0円です。

なぜこの方法を選ぶのか

MacでローカルLLMを動かす手段は、他にもOllamaやLM Studio、llama.cppなどがあります。 しかし、Pythonエンジニアが「仕事で使える実装」を目指すなら、MLX一択です。 MLXはAppleのAIチームが開発しているため、MacのGPU(Unified Memoryアーキテクチャ)に最適化された計算グラフを構築します。

PyTorchに近い操作感でありながら、CPUとGPUの間でデータをコピーする無駄(オーバーヘッド)が発生しません。 この「ゼロコピー」のおかげで、1秒間に生成されるトークン数が他のフレームワークより圧倒的に速いのが特徴です。 また、推論だけでなく「LoRA(低ランク適応)」による追加学習も公式がサポートしているため、将来的な拡張性が非常に高いのも選ぶ理由です。

Step 1: 環境を整える

MLX本体と、Hugging Faceからモデルを簡単にロードするためのユーティリティ mlx-lm をインストールします。

# Python 3.10以上の環境を用意してください
# 依存ライブラリのインストール
pip install mlx-lm mlx huggingface_hub

mlx-lm は、Hugging Face上にある「MLXフォーマット済みモデル」を1行でダウンロード・実行できるライブラリです。 自力でモデルを変換する手間が省けるため、実務ではこれを使うのが標準です。

⚠️ 落とし穴: Intel Macにインストールしようとするとエラーになります。また、Pythonのバージョンが古すぎると mlx パッケージが見つからないというエラーが出るので、python --version で3.10以上であることを必ず確認してください。

Step 2: 基本の設定

まずは、どのモデルを動かすかを決めます。 今回はMetaが公開している「Llama-3.1-8B-Instruct」をMLX向けに4bit量子化したものを使います。 4bit量子化を選ぶ理由は、メモリ消費量を抑えつつ、推論精度を実用レベルで維持できるからです。

import os
from mlx_lm import load, generate

# 使用するモデルの指定(Hugging Faceのレポジトリ名)
# 4bit量子化版を指定することで、8GB〜16GBメモリのMacでも動作可能にします
model_id = "mlx-community/Meta-Llama-3.1-8B-Instruct-4bit"

# モデルとトークナイザーの読み込み
# load関数はキャッシュを確認し、なければ自動的にダウンロードを開始します
model, tokenizer = load(model_id)

load 関数を呼び出す際、初回は数GBのダウンロードが発生します。 「なぜ4bitなのか」という点ですが、8bitやフル精度(FP16)だとメモリ消費が2倍、4倍と膨れ上がり、生成速度が極端に落ちる(スワップが発生する)ためです。 レスポンス0.1秒を目指すなら、まずは4bitから始めるのが鉄則です。

Step 3: 動かしてみる

最小限のコードでテキストを生成してみましょう。 ここでは「ストリーミング表示」を実装します。 AIの回答が完成するまで待つのではなく、生成されたそばから文字を表示させることで、体感速度を劇的に向上させます。

# プロンプトの準備
# Llama 3のフォーマットに従って記述します
prompt = "Apple Siliconのすごさを3行で教えてください。"

# 生成の実行
# max_tokens: 生成する最大文字数。最初は短め(200程度)にして挙動を見ます
# temp: 0.7に設定することで、回答の「遊び」と「正確性」のバランスを取ります
response = generate(
    model,
    tokenizer,
    prompt=prompt,
    max_tokens=512,
    temp=0.7,
    verbose=True # ターミナルに生成過程を表示する
)

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

期待される出力

1. ユニファイドメモリによりGPUとCPUが高速にデータを共有できる点。
2. 高いワットパフォーマンスで、発熱を抑えつつ爆速なAI推論が可能な点。
3. MLXフレームワークにより、専用ハードウェアの性能を100%引き出せる点。

結果が出力されれば成功です。 生成速度(tokens per second)に注目してください。 M2 Pro以上のチップなら、秒間20〜30トークン以上は出ているはずです。 これは、人間が文章を読むスピードよりも圧倒的に速い数値です。

Step 4: 実用レベルにする

単発の質問ではなく、過去の文脈を理解する「チャット形式」に拡張します。 ローカルLLMを仕事で使う場合、システムプロンプト(役割設定)を与えて回答を制御するのが一般的です。

from mlx_lm import load, generate

def chat_with_ai():
    model_id = "mlx-community/Meta-Llama-3.1-8B-Instruct-4bit"
    model, tokenizer = load(model_id)

    # チャット履歴を保持するリスト
    messages = [
        {"role": "system", "content": "あなたは優秀なエンジニアです。簡潔に回答してください。"}
    ]

    while True:
        user_input = input("USER: ")
        if user_input.lower() in ["exit", "quit"]:
            break

        messages.append({"role": "user", "content": user_input})

        # チャットテンプレートの適用
        # これをしないと、モデルが「誰の発言か」を誤認して壊れた回答をします
        prompt = tokenizer.apply_chat_template(
            messages, tokenize=False, add_generation_prompt=True
        )

        print("AI: ", end="", flush=True)

        # 逐次表示させるためのロジック(実際の実務で最も使われる形式)
        response = generate(
            model,
            tokenizer,
            prompt=prompt,
            max_tokens=1000,
            temp=0.6,
            verbose=False,
        )

        print(response)
        messages.append({"role": "assistant", "content": response})

if __name__ == "__main__":
    chat_with_ai()

このコードのポイントは tokenizer.apply_chat_template です。 Llama 3には <|begin_of_text|> といった特殊なタグが存在し、それらを正しく挿入しないと性能が著しく低下します。 MLXでは、このテンプレート適用をライブラリ側でケアしてくれるため、開発者はメッセージのリストを管理するだけで済みます。

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

エラー内容原因解決策
MemoryError指定したモデルがメモリに対して大きすぎるパラメータ数の小さいモデル(1Bや3B)に変更するか、量子化ビット数を下げたモデルを選ぶ
ModuleNotFoundError: mlxApple Silicon以外の環境、または仮想環境の不備pip install mlx を実行し、チップがM1/M2/M3/M4であることを確認
回答が英語になるモデル自体が日本語を学習していないLlama-3-Swallow や Gemma-2 など、日本語に強いモデルIDを指定する

次のステップ

ここまでの手順で、あなたのMacは「完全にプライベートなAIサーバー」になりました。 次に挑戦すべきは「RAG(検索拡張生成)」との組み合わせです。 MLXで動かしているLLMに、自分のPDFファイルやメモ帳の内容を読み込ませることで、社内ドキュメント専用のAIアシスタントを構築できます。

また、MLXは公式のリポジトリ(apple/mlx-examples)で、LoRAを使った微調整のサンプルを公開しています。 自分の過去のメールや執筆スタイルを学習させ、自分専用のライティングAIを作ることも夢ではありません。 「クラウドにデータを投げたくないが、AIの力は借りたい」という実務の現場では、このMLXによるローカル実行が最強の武器になります。

よくある質問

Q1: メモリ8GBのMacBook Airでも動きますか?

動きますが、モデル選びが重要です。Llama-3.1-8Bだとシステムのメモリ不足で動作がカクつく可能性が高いため、mlx-community/Llama-3.2-1B-Instruct-4bit などの1B(10億)パラメータクラスのモデルを試してください。これなら8GBでも軽快に動きます。

Q2: 生成速度をさらに上げるにはどうすればいいですか?

generate 関数の引数にある temp(温度)を下げるのではなく、モデルの量子化精度を確認してください。4bitよりも2bitの方が速いですが、精度は落ちます。また、実行時はブラウザのタブを閉じ、GPUメモリをLLMに集中させるのが最も効果的です。

Q3: 商用利用は可能ですか?

MLXフレームワーク自体はMITライセンスですが、動かす「モデル」のライセンスに依存します。例えばLlama 3.1はMetaのライセンスに従う必要があります。利用前に必ずHugging Faceのモデルカードを確認し、商用利用の可否をチェックしてください。

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

MacBook Pro M3 36GB

7Bモデルを余裕で回しつつ、将来的なLoRA学習にも対応できるメモリ容量

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

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


あわせて読みたい