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

この記事で作るもの

  • Llama 3.1やMistralなどの最新オープンソースLLMを、自分のPC(Windows/Mac)のGPUを活用して高速に動作させるPython実行環境を構築します。
  • 量子化技術(GGUF)を使い、本来なら数十GBのVRAMが必要な巨大モデルを、一般的なゲーミングPCやMacBookでサクサク動かせるようにします。
  • 最終的に、PythonからローカルLLMを呼び出し、チャット形式で応答を返すスクリプトを完成させます。

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

RTX 4060 Ti 16GB

VRAM 16GBを安価に確保でき、Llama 3.1 8Bを余裕で全レイヤーGPUに乗せられる

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

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

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

ローカルLLMを動かす上で、最も重要なのは「VRAM(ビデオメモリ)」の容量です。 結論から言うと、NVIDIA製GPUならVRAM 8GB以上、Macならユニファイドメモリ 16GB以上が最低ラインになります。 私が検証した結果、VRAM 8GBあれば「Llama-3-8B」の4ビット量子化モデルがレスポンス0.1秒レベルで快適に動作します。

もしVRAMが4GB以下、あるいは内蔵グラフィックスのみのPCを使っている場合は、推論速度が10倍以上遅くなることを覚悟してください。 その場合はRTX 3060 12GB版(中古で3.5万円前後)や、RTX 4060 Ti 16GB版を導入するのが、AIエンジニアへの最短ルートです。 クラウドAPI(OpenAIなど)を使えばハードウェア代はかかりませんが、プライバシー重視の案件や、1日に数万回プロンプトを投げるような検証作業では、ローカル環境が圧倒的に安上がりになります。

なぜこの方法を選ぶのか

ローカルLLMを動かす手段は「Ollama」「LM Studio」「vLLM」など複数あります。 その中で、なぜ「llama.cpp」と「GGUF」を学ぶべきなのか。 理由は、カスタマイズ性の高さとリソース効率の良さにあります。

Ollamaは内部でllama.cppを使っていますが、ブラックボックス化されている部分が多く、特定のGPUパラメータを微調整して限界まで速度を引き出すには向きません。 また、GGUF形式は「1つのファイルにモデルデータとテンソル情報を完結させている」ため、管理が非常に楽です。 SIer時代に苦労した「依存ライブラリのバージョン競合でモデルが動かない」という悪夢を、このエコシステムは完全に払拭してくれました。

Step 1: 環境を整える

まずは、llama.cppを動かすためのビルド環境を作ります。 Windowsユーザーは「WSL2」を、Macユーザーは「Homebrew」が入っている前提で進めます。

# リポジトリのクローン
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# ビルド(Mac / Apple Siliconの場合)
make -j

# ビルド(Windows + NVIDIA GPUの場合)
# cmakeを使ってCUDAを有効化します
mkdir build
cd build
cmake .. -GGPU_CUDACC=ON
cmake --build . --config Release

cmake .. -GGPU_CUDACC=ON を指定するのは、CPUではなくGPUの演算コア(CUDA)を強制的に使うためです。 これを忘れると、どんなに高いGPUを積んでいても、計算がCPUに回ってしまい、1文字出すのに数秒かかる「死ぬほど遅いチャット」になってしまいます。

⚠️ 落とし穴: Windowsでビルドする際、NVIDIA CUDA Toolkitがインストールされていないとエラーが出ます。 必ず事前に公式サイトからCUDA Toolkit(12.x系推奨)を入れ、nvcc --version が通ることを確認してください。 私は初めて構築した時、CUDAのパスが通っておらず、3時間ほど「なぜかCPUしか動かない」と頭を抱えた経験があります。

Step 2: 量子化モデル(GGUF)の入手

モデル本体をHugging Faceからダウンロードします。 今回は日本語能力に定評のある「Llama-3.1-8B-Instruct」をターゲットにします。

  1. Hugging Faceで「Llama-3.1-8B-Instruct GGUF」と検索します。
  2. 「bartowski」氏や「MaziyarPanahi」氏が公開している量子化済みリポジトリを探します。
  3. Llama-3.1-8B-Instruct-Q4_K_M.gguf というファイルを探してダウンロードしてください。

ここで「Q4_K_M」などの記号が出てきますが、これは「4ビット量子化」を意味します。 本来16ビットで表現されるデータを4ビットに圧縮することで、モデルのサイズを1/4(約5GB)に減らしています。 私の実機検証では、8ビット(Q8_0)と4ビット(Q4_K_M)で回答精度に体感的な差はほぼありませんでしたが、速度は4ビットの方が圧倒的に速いです。 仕事で使うなら、精度と速度のバランスが最も良いQ4_K_MかQ5_K_Mを選ぶのが鉄板です。

Step 3: 動かしてみる

ダウンロードしたモデルファイルを、llama.cpp/models ディレクトリに配置します。 まずはコマンドラインから、正しくGPUが認識されているかテストしましょう。

# llama.cppのディレクトリで実行
./llama-cli -m models/Llama-3.1-8B-Instruct-Q4_K_M.gguf \
  -n 512 \
  -p "あなたは優秀なアシスタントです。富士山の高さは?" \
  -ngl 99

ここで最も重要な引数は -ngl 99 (Number of GPU Layers)です。 これは「モデルの層のうち、いくつをGPUにオフロードするか」という設定です。 8Bクラスのモデルなら「99」を指定しておけば、全レイヤーがVRAMに乗り、爆速で回答が返ってきます。

期待される出力

富士山の高さは3,776メートルです。これは日本で最も高い山であり、ユネスコの世界遺産にも登録されています。
llama_print_timings: eval time = 120.45 ms / 25 tokens (207.55 tokens/s)

「tokens/s」という数字に注目してください。 秒間50トークン以上出ていれば、人間が読むスピードを遥かに超えています。 もしここが 2~3 tokens/s しか出ていない場合は、-ngl の設定が効いていないか、GPUドライバに問題があります。

Step 4: Pythonから制御して実用レベルにする

コマンドラインで動くだけでは業務に使えません。 Pythonからライブラリ llama-cpp-python を通じて呼び出せるようにします。

# ライブラリのインストール(GPU対応版)
# Windowsの場合
# $env:CMAKE_ARGS="-DGGML_CUDA=on"
# pip install llama-cpp-python

import os
from llama_cpp import Llama

# モデルのパスを指定
model_path = "./models/Llama-3.1-8B-Instruct-Q4_K_M.gguf"

# モデルの初期化
# n_gpu_layers=-1 は「全レイヤーをGPUに載せる」という指定。
# これが最もパフォーマンスが出ます。
llm = Llama(
    model_path=model_path,
    n_gpu_layers=-1,
    n_ctx=2048, # 文脈ウィンドウのサイズ
)

# 推論実行
def ask_ai(prompt):
    output = llm(
        f"<|begin_of_text|><|start_header_id|>user<|end_header_id|>\n\n{prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n",
        max_tokens=512,
        stop=["<|eot_id|>"],
        echo=False
    )
    return output["choices"][0]["text"]

# テスト実行
if __name__ == "__main__":
    question = "PythonでCSVを読み込むコードを書いて"
    print(f"質問: {question}")
    response = ask_ai(question)
    print(f"回答:\n{response}")

このコードのポイントは n_gpu_layers=-1 です。 昔のバージョンではレイヤー数を手動で計算していましたが、現在は -1 と書くだけで自動的にGPUを最大活用してくれます。 また、Llama-3.1 などのモデルには特有のプロンプトテンプレート(<|start_header_id|>など)があります。 これを正しく設定しないと、モデルが「自分がAIであること」を忘れ、支離滅裂な回答を始めるので注意してください。

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

エラー内容原因解決策
Address already in use以前のプロセスがGPUを掴んだままfuser -v /dev/nvidia* でプロセスを特定してkillする
回答が途中で切れるmax_tokens が不足しているパラメータの max_tokens を 1024 以上に増やす
CUDA error: out of memoryVRAM容量に対してモデルが大きすぎる量子化ビット数を下げる(Q4→Q2)か、モデルサイズを下げる(8B→3B)

次のステップ

ここまでできれば、あなたのPCの中に「誰にも内容を覗かれない知能」が宿ったことになります。 次のステップとしては、以下の3つをおすすめします。

  1. RAG(検索拡張生成)の構築: 自分のPDFファイルや社内ドキュメントを読み込ませ、それに基づいて回答するシステムを作ってみてください。LangChain と組み合わせるのが一般的です。
  2. APIサーバー化: llama-cpp-python[server] を使うと、OpenAI APIと互換性のあるローカルサーバーを立てられます。これにより、既存のアプリの向き先を localhost に変えるだけで、ChatGPTを自作AIに置き換えられます。
  3. より大きなモデルへの挑戦: もしVRAMを24GB(RTX 3090/4090)持っているなら、70Bクラスのモデルを動かしてみてください。推論の「賢さ」の次元が変わります。

ローカルLLMの世界は、一度足を踏み入れると「クラウドAPIの従量課金」が馬鹿らしくなるほどの自由度があります。 ぜひ自分の手で、この「プライベートな知能」を使い倒してみてください。

よくある質問

Q1: メモリは多ければ多いほど良いのでしょうか?

はい。ただし「メモリの量」だけでなく「帯域幅」が重要です。 MacBookの「Max」モデルが速いのは、メモリの通り道が非常に広いからです。 Windowsなら、VRAMの容量がモデルサイズ(GGUFファイルサイズ)を上回っていることが、高速動作の絶対条件です。

Q2: 実行中にPCがファンを回して唸りますが大丈夫ですか?

正常です。LLMの推論はGPUに高い負荷をかけます。 RTX 4090だと消費電力が400Wを超えることもあります。 長時間の運用を考えるなら、排熱のしっかりしたデスクトップPCか、電力効率の良いApple Silicon Macが向いています。

Q3: 日本語が不自然なモデルがあるのはなぜですか?

多くのモデルは英語データで主に学習されているからです。 日本語で使いたい場合は、今回紹介したLlama 3.1 Instructや、Qwen、Gemma 2など、多言語対応を謳っているモデルを選択するのが正解です。


あわせて読みたい