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

この記事で作るもの

この記事を読むと、自身のPC(Windows/Mac)でLlama 3などの最新LLMを、VRAMを節約しながら高速に動作させるPythonスクリプトが完成します。

  • 前提知識: Pythonの基本的な読み書きができる、ターミナル(コマンドプロンプト)の操作に抵抗がない
  • 必要なもの: 8GB以上のメモリを搭載したPC(GPU搭載推奨)、Python 3.10以降

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

ローカルLLMを動かす上で、最も重要なのは「VRAM(ビデオメモリ)」の容量です。 結論から言うと、NVIDIA製のGPU(RTX 3060 12GB以上)か、Apple Silicon(M1/M2/M3)を搭載した16GB以上のメモリを持つMacがあれば、実用的な速度で動作します。

逆に、CPUだけで動かそうとすると、レスポンスに数十秒から数分かかるため、仕事で使うには厳しいのが現実です。 もしこれからハードウェアを揃えるなら、コスパ重視ならRTX 4060 Ti (16GBモデル)、本気で検証するなら私が愛用しているRTX 4090 (24GB) を選んでください。

費用については、モデル自体は無料(Llama 3やQwenなど)で利用でき、API料金も一切かかりません。 電気代を除けば、月額$0でGPT-4oに迫る性能のモデルを無制限に叩き続けられるのがローカル環境の最大の魅力です。

なぜこの方法を選ぶのか

LLMを動かす方法はいくつかありますが、なぜ「llama.cpp」と「GGUF」の組み合わせがデファクトスタンダードなのかを説明します。

通常のモデル(FP16形式)は非常に重く、例えば70億パラメータ(7B)のモデルをそのまま動かすには約28GBのVRAMが必要です。 これでは一般向けのGPUではメモリ不足で動きません。

そこで「GGUF」という形式で量子化(データの軽量化)を行います。 重みの精度を16bitから4bitなどに落とすことで、メモリ消費を4分の1程度まで削減できます。 「llama.cpp」は、このGGUF形式を最も効率よく、かつCPUとGPUをハイブリッドに活用して動かせるC++ベースの推論エンジンです。 PythonのTransformersライブラリで動かすよりも圧倒的に起動が速く、メモリ管理が優秀なため、私はこの構成を実務で採用しています。

Step 1: 環境を整える

まずは、llama.cppをPythonから扱うためのライブラリ「llama-cpp-python」をインストールします。 ここが最大の難所であり、OSやGPU環境によってインストールコマンドが異なります。

Windows (NVIDIA GPUあり) の場合

CUDAツールキットがインストールされていることを前提とします。

# CUDA環境を利用するためのフラグを立ててインストール
$env:CMAKE_ARGS = "-DGGML_CUDA=on"
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121

Mac (Apple Silicon) の場合

Metal(GPU)を有効にするため、以下のコマンドを使用します。

CMAKE_ARGS="-DGGML_METAL=on" pip install llama-cpp-python

各設定の意味ですが、GGML_CUDA=onGGML_METAL=on は「計算をCPUではなくGPUに丸投げする」という命令です。 これを忘れると、推論速度が10倍以上遅くなるので注意してください。

落とし穴: インストール時に cmake が入っていないとエラーが出ます。Windowsなら choco install cmake、Macなら brew install cmake で事前にインストールしておきましょう。また、ビルド済みのホイールが見つからない場合はコンパイラ(Visual StudioのC++ビルドツールなど)が必要になることがあります。

Step 2: GGUFモデルのダウンロード

次に、動かしたいモデルをHugging Faceからダウンロードします。 今回は日本語能力に定評がある「Llama-3-8B-Instruct」の量子化版を使用します。

モデルを探す際は、Hugging Faceで「[モデル名] GGUF」と検索してください。 有名な投稿者(Bartowski氏やMaziyarPanahi氏など)が公開しているものが信頼できます。

どのファイルを選べばいいか迷ったら、以下の基準で選んでください。

  • Q4_K_M: 推奨。精度とサイズのバランスが最も良く、迷ったらこれ。
  • Q8_0: 精度重視。VRAMに余裕がある場合のみ。
  • Q2_K: 最小サイズ。精度はかなり落ちるが、メモリが極端に少ない環境用。

今回は「Llama-3-8B-Instruct-v0.1-GGUF」をダウンロードし、プロジェクトフォルダ内の models フォルダに配置したと仮定します。

Step 3: 動かしてみる

準備が整ったので、最小限のコードでモデルを起動してみます。 Pythonファイル(main.py)を作成し、以下のコードを貼り付けてください。

from llama_cpp import Llama

# モデルの読み込み
# n_gpu_layers: GPUにオフロードするレイヤー数。-1は全レイヤーをGPUへ。
# n_ctx: コンテキストサイズ(トークン数)。長い会話をするなら大きくする。
llm = Llama(
    model_path="./models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf",
    n_gpu_layers=-1,
    n_ctx=2048,
    verbose=False
)

# 推論の実行
response = llm.create_chat_completion(
    messages=[
        {"role": "system", "content": "あなたは優秀なアシスタントです。"},
        {"role": "user", "content": "AIの量子化について、3行で教えてください。"}
    ]
)

print(response["choices"][0]["message"]["content"])

期待される出力

AIの量子化とは、モデルの重みの精度を下げてサイズを軽量化する技術です。
これにより、少ないメモリ環境でも高速に推論を実行できるようになります。
多少の精度低下はありますが、実用上は問題ないレベルに抑えることが可能です。

結果の読み方: n_gpu_layers=-1 と設定することで、モデルのすべての計算がGPU上で行われます。 もし実行中に「VRAM不足(Out of Memory)」で落ちる場合は、この数値を 2030 などの数字に減らして、一部の計算をCPUに逃がすように調整してください。

Step 4: 実用レベルにする

実務で使う場合、レスポンスが一度に返ってくるのを待つのはストレスです。 ChatGPTのように、生成された文字から順に表示される「ストリーミング」機能を実装しましょう。

import sys
from llama_cpp import Llama

def run_ai_chat():
    # 初期化
    llm = Llama(
        model_path="./models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf",
        n_gpu_layers=-1,
        n_ctx=4096,
        verbose=False
    )

    print("AIへの質問を入力してください(exitで終了):")

    while True:
        user_input = input("\nユーザー: ")
        if user_input.lower() == "exit":
            break

        # ストリーミングを有効にして実行
        stream = llm.create_chat_completion(
            messages=[
                {"role": "user", "content": user_input}
            ],
            stream=True
        )

        print("アシスタント: ", end="", flush=True)
        for chunk in stream:
            delta = chunk["choices"][0]["delta"]
            if "content" in delta:
                content = delta["content"]
                print(content, end="", flush=True)
        print()

if __name__ == "__main__":
    run_ai_chat()

このコードでは、stream=True を設定し、forループで生成されたチャンクを逐次表示しています。 これだけで、UIの体験価値は劇的に向上します。 また、n_ctx を4096に増やしました。これにより、より長い文脈を理解できるようになりますが、その分メモリ消費量も増える点には注意してください。

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

エラー内容原因解決策
llama_cpp not foundインストール失敗pip list で確認し、Step 1のコマンドを再試行
Speed is very slowCPUで動作しているn_gpu_layers が 0 になっていないか確認。ビルド時のフラグ漏れ。
CUDA error: out of memoryVRAM容量不足n_gpu_layers の値を減らすか、より小さい量子化モデル(Q2_K等)を使う
文字化けするモデルが日本語未対応Llama-3-8B-Instructなど、多言語対応モデルを選んでいるか確認

次のステップ

環境が構築できたら、次は「RAG(検索拡張生成)」に挑戦してみてください。 自分の持っているPDFやテキストファイルを読み込ませ、その内容に基づいてAIに回答させる仕組みです。 llama.cppは langchain というライブラリとも連携が容易なため、今回作ったスクリプトをベースに、社内ドキュメントの検索ツールなどを自作することが可能です。

また、API経由で利用したい場合は「llama-cpp-python[server]」をインストールすることで、OpenAI互換のAPIサーバーをローカルで立てることもできます。 これにより、CursorなどのAIエディタのバックエンドを自前モデルに差し替えるといった、上級者向けの運用も視野に入ってきます。

よくある質問

Q1: グラボがないノートPCでも動きますか?

動きますが、速度は期待できません。GGUF形式はCPU(AVX2命令など)にも最適化されているため、動作自体はしますが、1秒間に1〜2文字程度の生成速度になることが多いです。まずは軽量な「Gemma-2b」などの小さなモデルから試すことをおすすめします。

Q2: 量子化すると、どのくらい賢さが減るのでしょうか?

一般的な評価(Perplexityなど)では、4bit量子化(Q4_K_M)であれば、元のFP16形式と比べて精度低下は1%未満に抑えられると言われています。実務で使っている私の感覚でも、4bitまではほとんど差を感じません。しかし3bit以下にすると、論理的な破綻が目立ち始める印象です。

Q3: モデルを商用利用しても大丈夫ですか?

各モデルのライセンスによります。Llama 3であれば「Llama 3 Community License」が適用され、月間アクティブユーザー数が7億人を超えない限りは無料で商用利用可能です。QwenやGemmaもそれぞれ独自のライセンスがあるため、業務で使う前には必ずリポジトリのLICENSEファイルを確認してください。

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

RTX 4060 Ti 16GB

VRAM 16GBでLlama 3 8Bクラスを余裕を持って動かせる入門最適解

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

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


あわせて読みたい