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

この記事で作るもの

  • ローカルPCのGPUを活用してLlama 3(8B)を高速に推論し、Pythonから対話できるスクリプトを作成します
  • C++で書かれた軽量推論エンジン「llama.cpp」を自身の環境に合わせてビルドし、ハードウェア性能を限界まで引き出します
  • 量子化形式「GGUF」を理解し、メモリ使用量と精度の最適なバランスを自分で判断できるようになります

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

RTX 4060 Ti 16GB

VRAM 16GBでLlama 3 8Bを余裕を持って動かせる、もっともコスパの良い入門GPU

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

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

前提知識:

  • 基本的なターミナル操作(cd, mkdirなど)ができる
  • Pythonのvenvやpipの操作に慣れている
  • Gitがインストールされている

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

ローカルLLMを動かす上で、もっとも重要なのは「VRAM(ビデオメモリ)」の容量です。 llama.cppはCPUだけでも動作しますが、実用的な速度(1秒間に10トークン以上)を求めるなら、最低でも8GBのVRAMを搭載したGPU、あるいは16GB以上の統合メモリを持つApple Silicon Macを推奨します。 Windows環境でNVIDIA製GPUを使うなら、RTX 3060(12GB)以上があれば、Llama 3 8Bクラスを余裕を持って動作させられます。

私の検証では、RTX 4090であれば4bit量子化された70Bモデルも動作しますが、初心者がまず目指すべきは8Bモデルの快適な動作です。 もし手元にGPUがない場合でも、最近のRyzenやCore i7/i9であれば、4bit量子化モデルなら「読める速度」で出力されます。 クラウドサービスとは違い、一度環境を作ってしまえば電気代以外は「完全無料」で、データが外部に送信される心配もありません。

なぜこの方法を選ぶのか

ローカルLLMを動かすツールには、OllamaやLM Studioといった「クリックするだけ」で使える便利なものも増えています。 しかし、あえてllama.cppを直接使い、自分でビルドする方法を私は推奨します。 理由は、ハードウェアへの最適化オプションを細かく指定できるため、そのPCが持つ本来の性能を100%引き出せるからです。

また、実務でLLMをシステムに組み込む際、Ollamaのようなパッケージ化されたツールでは、細かいパラメータ調整やリソース制限が難しくなる局面があります。 llama.cppを理解しておけば、Pythonライブラリ(llama-cpp-python)を通じて、自作アプリへの組み込みが圧倒的にスムーズになります。 「中身がどう動いているか」を知っておくことは、トラブル発生時の対応力を大きく変えます。

Step 1: 環境を整える

まずはllama.cppをダウンロードし、自分のPCに最適化された状態でコンパイル(ビルド)します。

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

# ビルド用ディレクトリの作成
mkdir build
cd build

# 【重要】環境に合わせたビルドコマンドの選択
# Apple Silicon Macの場合(Metal対応)
cmake .. -DGGML_METAL=ON
cmake --build . --config Release

# NVIDIA GPU(Windows/Linux)の場合(CUDA対応)
# ※CUDA Toolkitがインストールされている必要があります
cmake .. -DGGML_CUDA=ON
cmake --build . --config Release

cmake .. -DGGML_XXX=ONという指定は、それぞれのハードウェアアクセラレーションを有効にするためのものです。 これを忘れるとCPUだけで計算することになり、GPUのパワーを全く使えなくなるので注意してください。 ビルドが終わると、binディレクトリ(またはbuild直下)にllama-cliという実行ファイルが生成されます。

⚠️ 落とし穴: Windowsユーザーで「cmakeが見つかりません」と出る場合は、Visual Studioの「C++によるデスクトップ開発」ワークロードをインストールしてください。 また、NVIDIA GPUを使っているのにGGML_CUDA=ONでエラーが出る場合は、パスにCUDAのbinディレクトリが含まれているか確認が必要です。 ビルド済みのバイナリをダウンロードすることも可能ですが、AVX512などのCPU命令セット最適化が効かないため、基本はセルフビルドをおすすめします。

Step 2: 基本の設定

次に、動かしたいモデル(脳に相当するデータ)を準備します。 今回はMetaが公開した「Llama-3-8B」を日本語対応させたモデルなどを探すと良いでしょう。 拡張子が.ggufとなっているファイルが必要です。

Hugging Faceで「Llama-3-8B-Instruct-GGUF」と検索すると多くのモデルが出てきます。 ここで初心者が迷うのが「Q4_K_M」や「Q8_0」といったファイル名の末尾にある記号です。 これは量子化(データの圧縮率)を表しています。

  • Q4_K_M: モデルの精度をほぼ維持しつつ、サイズを半分以下にする、もっともバランスの良い設定です。
  • Q8_0: ほぼ無劣化ですが、ファイルサイズが大きく、VRAMを多く消費します。
  • Q2_K: 非常に軽量ですが、知能が目に見えて低下し、支離滅裂な回答が増えます。

まずは「Q4_K_M」を選択してください。 8BモデルのQ4であれば、ファイルサイズは約5GB程度になり、VRAM 8GBのカードで十分に収まります。

# モデルを配置するディレクトリを作成
mkdir models
# ここでHugging FaceなどからダウンロードしたGGUFファイルを配置
# 例: models/llama-3-8b-instruct.Q4_K_M.gguf

Step 3: 動かしてみる

まずはコマンドラインから、正しくGPUが認識されて動くかテストします。

./llama-cli -m ../models/llama-3-8b-instruct.Q4_K_M.gguf \
  -n 512 \
  -p "Building a sustainable future requires" \
  -ngl 33

ここで重要なオプションが -ngl 33(または --n-gpu-layers)です。 これは「モデルの全33層のうち、何層をGPUに肩代わりさせるか」という数値です。 8Bモデルなら33を指定すれば、モデルの全データがVRAMに乗ります。 VRAMが足りない場合は、この数字を少しずつ減らして「VRAMとメインメモリのハイブリッド」で動かすことができます。

期待される出力

llama_print_timings: prompt eval time =   150.23 ms /    10 tokens (   15.02 ms per token)
llama_print_timings:        eval time =  2450.12 ms /   150 tokens (   16.33 ms per token)

結果の読み方で注目すべきは「eval time」の「ms per token」です。 これが20ms以下(1秒間に50トークン以上)であれば、人間が読むスピードを遥かに超える爆速なレスポンスと言えます。 もし100msを超えている場合は、GPUが使われていないか、層の転送(ngl)が正しく設定されていない可能性があります。

Step 4: 実用レベルにする

単発のコマンド実行ではなく、Pythonからこのllama.cppを制御して、自分のアプリに組み込めるようにします。 llama-cpp-python というライブラリを使用します。

# Pythonライブラリのインストール
# GPU対応させるため、インストール時に環境変数を指定するのがコツです
# Macの場合
CMAKE_ARGS="-DGGML_METAL=ON" pip install llama-cpp-python

# Windows/Linux (CUDA)の場合
$env:CMAKE_ARGS="-DGGML_CUDA=ON" # PowerShell
pip install llama-cpp-python

次に、Pythonスクリプトを作成します。

import os
from llama_cpp import Llama

# モデルのパスを指定
# パスは各自の環境に合わせて書き換えてください
model_path = "./models/llama-3-8b-instruct.Q4_K_M.gguf"

# Llamaクラスの初期化
# n_gpu_layers=-1 は「全層をGPUに転送する」という便利なショートカットです
llm = Llama(
    model_path=model_path,
    n_gpu_layers=-1,
    n_ctx=2048,      # コンテキストサイズ(記憶できる文脈の長さ)
    verbose=False    # 起動時のログを隠す
)

# 推論の実行
prompt = "ユーザー: ローカルLLMを使うメリットを3つ教えてください。\nシステム: "

output = llm(
    prompt,
    max_tokens=512,
    stop=["ユーザー:", "\n"], # 対話が終わる条件を指定
    echo=False
)

# 結果の表示
print(output["choices"][0]["text"])

このコードのポイントは n_ctx=2048 の設定です。 コンテキストサイズを大きくすれば長い文章を扱えますが、その分VRAMの消費量が増えます。 実務では、ここを不必要に大きく(例:32768など)設定しすぎて、VRAM不足でクラッシュするケースが多々あります。 まずは2048程度から始め、用途に応じて増やすのが賢明です。

また、stop パラメータは非常に重要です。 これがないと、AIが一人二役で会話を延々と捏造し続ける現象(幻覚の一種)が起きます。 対話形式のシステムを作るなら、必ずストップトークンを設定しましょう。

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

エラー内容原因解決策
CUDA_ERROR_OUT_OF_MEMORYVRAM容量に対してモデルが大きい、またはn_ctxが大きすぎるn_gpu_layers を減らすか、より小さな量子化(Q4→Q3)を検討する
Permission denied実行ファイルに権限がないchmod +x llama-cli で実行権限を付与する
推論が非常に遅いGPUが使われずCPUで動いているログを確認し BLAS = 1 または METAL = 1 になっているか見る。なっていなければ再ビルド。
Pythonでインポートエラーライブラリが正しくビルドされていないpip uninstall llama-cpp-python してから CMAKE_ARGS を付けて再インストールする

次のステップ

ここまでで、ローカルLLMを自在に操る基礎が整いました。 次に挑戦すべきは「APIサーバー化」です。 llama.cppには標準でOpenAI互換のAPIサーバー機能が備わっています。

./llama-server -m models/... --port 8080 を実行するだけで、既存のOpenAI SDKを使ったアプリケーションの接続先を自分のPCに切り替えることができます。 これにより、CursorやDifyといった外部ツールから、自前のローカルLLMを呼び出すことが可能になります。

また、RAG(検索拡張生成)との組み合わせも面白いでしょう。 LangChainやLlamaIndexを使えば、自分のPC内にあるPDFファイルをローカルLLMに読み込ませて、完全にオフラインの社内ナレッジベースを構築することもできます。 データ漏洩のリスクをゼロにしながら、AIの恩恵を最大化できるこの環境は、エンジニアにとって最強の武器になるはずです。

よくある質問

Q1: 16GBのメモリしかないMacで大きなモデルは動かせますか?

Apple SiliconはメインメモリとVRAMが共有されているため、16GBあれば7B/8Bモデルは余裕、13B/14BモデルもQ4量子化なら十分実用範囲で動かせます。ただし、他のアプリがメモリを消費しているとスワップが発生して極端に遅くなるので注意してください。

Q2: 量子化すると、具体的にどれくらい頭が悪くなりますか?

私の体感では、Q4_K_M以上であれば、プログラミングや要約などのタスクで明らかな劣化を感じることは稀です。しかしQ2まで下げると、助詞がおかしくなったり、指示を無視したりする確率が上がります。仕事で使うならQ4以上がデファクトスタンダードです。

Q3: Pythonから使うとき、ストリーミング出力(一文字ずつ出す)はどうすればいいですか?

llm() 関数を呼ぶ際に stream=True を引数に渡してください。戻り値がジェネレータになるので、for文で回すことでChatGPTのような一文字ずつ表示するUIが簡単に作れます。ユーザー体験が劇的に向上するので、実用アプリでは必須の設定です。


あわせて読みたい