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

この記事で作るもの

この記事では、世界標準のLLM実行エンジン「llama.cpp」をコンパイルし、量子化されたLlama-3-8BをローカルPCで爆速動作させる環境を構築します。 Pythonの重いライブラリに頼らず、C++ベースの軽量なバイナリで1秒間に40トークンを超える推論速度(RTX 3060クラス以上想定)を実現するスクリプトまで完成させます。

前提知識として、ターミナルでの基本的なコマンド操作(cd, git clone程度)ができる必要があります。 必要なものは、インターネット環境と、NVIDIA製GPUを搭載したPCまたはApple Silicon(M1/M2/M3)搭載のMacです。

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

ローカルLLMを動かす上で、最も重要なのは「VRAM(ビデオメモリ)」の容量です。 今回扱うLlama-3-8B(80億パラメータ)を4ビット量子化(Q4_K_M)で動かす場合、モデルサイズは約5GBになります。 推論時のコンテキスト(文脈)保持用メモリを含めると、最低でも8GBのVRAMがあればGPUのみで快適に動作します。

NVIDIA製GPUならRTX 3060 (12GB) や RTX 4060 Ti (16GB) がコスパ最強の選択肢です。 私のメイン機はRTX 4090を2枚挿していますが、Llama-3-8Bクラスなら1枚の半分も使いません。 Macの場合は、メインメモリをVRAMとして共有するため、16GB以上のユニファイドメモリを搭載したモデルを推奨します。

料金については、一度ハードウェアを揃えてしまえば、API利用料のような従量課金は一切かかりません。 電気代はフルロード時で1時間あたり15円〜30円程度(300W〜600W計算)ですが、推論時のみの負荷なので無視できるレベルです。 クラウドのGPUインスタンスを借りるなら、Google Colabの有料版(月額1,179円〜)でA100やL4を使うのが手っ取り早いですが、今回は「自宅で動かす」ことにこだわります。

なぜこの方法を選ぶのか

PythonのTransformersライブラリやPyTorchを使ってモデルを動かすのが一般的ですが、実務で使うには「依存関係が重すぎる」という欠点があります。 ライブラリのバージョン競合で1日潰すのは、エンジニアとして避けたい事態です。 また、Pythonはオーバーヘッドが大きく、特に低スペックな環境では推論速度が著しく低下します。

そこで登場するのが「llama.cpp」です。 これはC++でゼロから書かれた推論エンジンで、依存関係がほとんどなく、CPU・GPUの性能を限界まで引き出せます。 「GGUF」という専用形式の量子化モデルを使うことで、本来なら20GB以上のVRAMが必要なモデルを、わずか5GB程度に圧縮して動作させることが可能です。 「動けばいい」ではなく「現場で即レスポンスを返す」ために、私はllama.cpp一択だと考えています。

Step 1: 環境を整える

まずはソースコードを取得し、自分のPC環境に合わせてビルド(コンパイル)します。 「ビルド」と聞くと難しく感じるかもしれませんが、コマンドを打つだけです。

NVIDIA GPU(Windows WSL2 または Linux)の場合

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

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

# CUDAを有効にしてビルド(これをしないとCPU動作になり、激遅になります)
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j

Apple Silicon Mac(M1/M2/M3)の場合

Macは標準のMetal APIを使ってGPU加速を行います。

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

# Metalを有効にしてビルド(標準で有効なことが多いですが明示します)
cmake -B build -DGGML_METAL=ON
cmake --build build --config Release -j

ビルドが完了すると、build/bin/ フォルダ内に llama-cli や llama-server といった実行ファイルが生成されます。

⚠️ 落とし穴: Windows環境でWSL2を使わず、直接PowerShellでビルドしようとすると、Visual Studioの環境構築で十中八九ハマります。 特別な理由がない限り、WSL2(Ubuntu)上で行うか、Macを使うのが無難です。 また、cmakeが入っていない場合は、sudo apt install cmake(Ubuntu)や brew install cmake(Mac)で先に入れておいてください。

Step 2: モデルの準備

llama.cppで動かすには「GGUF」形式のモデルファイルが必要です。 Hugging Faceには、有志が量子化したモデルが大量にアップロードされています。 今回は、Metaが公開した最強の小型モデル「Llama-3-8B-Instruct」のGGUF版を使用します。

# モデル保存用ディレクトリの作成
mkdir models

# Hugging Faceからモデルをダウンロード
# Bartowski氏やTheBloke氏のリポジトリが信頼できます
# ここでは4ビット量子化(Q4_K_M)をターゲットにします
curl -L -o models/llama-3-8b-instruct-q4_k_m.gguf \
https://huggingface.co/bartowski/Meta-Llama-3-8B-Instruct-GGUF/resolve/main/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf

なぜ「Q4_K_M」なのか

量子化には多くの種類(Q2, Q3, Q4, Q5, Q8…)があります。 数字が小さいほどファイルサイズは小さくなりますが、AIの「知能(精度)」も低下します。 多くの検証結果から、Q4(4ビット)が「サイズと精度のトレードオフが最も優れている」ことが分かっています。 Q4_K_M(中程度の最適化)を選んでおけば、実務で精度不足を感じることはまずありません。

Step 3: 動かしてみる

準備が整ったので、実際にモデルを動かして対話してみましょう。 ここでは、GPUをフル活用するためのオプションを指定します。

# 実行コマンド
./build/bin/llama-cli \
  -m models/llama-3-8b-instruct-q4_k_m.gguf \
  -p "You are a helpful AI assistant. Answer in Japanese." \
  -cnv \
  -ngl 99

オプションの解説

  • -m: 使用するモデルファイルのパスを指定します。
  • -p: システムプロンプト(AIの役割)を設定します。
  • -cnv: 会話モード(チャット形式)を有効にします。
  • -ngl 99: 「GPUにオフロードするレイヤー数」です。99を指定しておけば、全レイヤーがGPUに乗ります。VRAMが足りない場合は、この数字を少しずつ下げて調整します。

期待される出力

User: 自己紹介をしてください。
AI: 私は役に立つAIアシスタントです。日本語でのお手伝いが可能です。何か質問はありますか?

私のRTX 4090環境では、このレスポンスが「一瞬」で返ってきます。 ターミナルの出力の最後に eval time = XXX ms / YYY runs ( ZZZ tokens/s) という統計が出るはずです。 ここが 30 tokens/s 以上出ていれば、人間が読むスピードを遥かに超えた快適な速度です。

Step 4: 実用レベルにする

ターミナルで動くだけでは「趣味の検証」で終わってしまいます。 仕事で使うためには、この推論エンジンを「サーバー」として立ち上げ、自分のプログラムからAPI経由で叩けるようにする必要があります。

llama.cppには、OpenAIのAPIと互換性のあるサーバー機能が内蔵されています。

# サーバーモードで起動
./build/bin/llama-server \
  -m models/llama-3-8b-instruct-q4_k_m.gguf \
  --port 8080 \
  -ngl 99

これで、localhost:8080 でAPIサーバーが立ち上がりました。 次に、Pythonからこのサーバーを叩くコードを書きます。

import requests
import json

def chat_with_local_llm(prompt):
    url = "http://localhost:8080/v1/chat/completions"
    headers = {"Content-Type": "application/json"}

    data = {
        "messages": [
            {"role": "system", "content": "あなたは優秀なエンジニアです。"},
            {"role": "user", "content": prompt}
        ],
        "temperature": 0.7
    }

    # タイムアウトを長めに設定(初回推論時は時間がかかる場合があるため)
    response = requests.post(url, headers=headers, data=json.dumps(data), timeout=60)

    if response.status_code == 200:
        return response.json()['choices'][0]['message']['content']
    else:
        return f"Error: {response.status_code}"

# 実行
if __name__ == "__main__":
    question = "Pythonで効率的なデータクレンジングを行うコードを教えて"
    print(chat_with_local_llm(question))

この方法の素晴らしい点は、コードを書き換えることなく「接続先URL」を変えるだけで、ローカルLLMと本家OpenAI(GPT-4等)を切り替えられることです。 機密性の高いデータはローカルのllama.cppで処理し、汎用的なタスクはGPT-4に投げるといったハイブリッド運用が、実務では極めて有効です。

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

エラー内容原因解決策
error loading modelGGUFファイルの破損またはパスミス再ダウンロードするかパスを確認する
out of memoryVRAM不足-ngl の値を下げるか、より小さい量子化(Q2_K等)を使う
推論がめちゃくちゃ遅いGPUが使われずCPUで動いているビルド時に GGML_CUDA=ON を忘れていないか確認
cmake not foundビルドツールの不足apt install cmake または brew install cmake

次のステップ

おめでとうございます。これであなたは、自分だけのプライベートなAIサーバーを手に入れました。 次のステップとしておすすめなのが「RAG(検索拡張生成)」への応用です。 今回構築したAPIサーバーを使って、自分の過去のメールやドキュメントを読み込ませ、自分専用のナレッジベースを作ってみてください。

また、Llama-3-8Bだけでなく、日本語に特化した「Llama-3-Swallow」や、より巨大な「Command R+」などのGGUFモデルを試してみるのも面白いでしょう。 モデルを入れ替えるだけで、専門性の異なるAIを使い分けることができます。 自宅にRTX 4090を2枚挿すような沼へ、一歩足を踏み出したと言っても過言ではありません。 次はローカルLLMを並列稼働させて、エージェント同士を戦わせる構成に挑戦してみるのが、エンジニアとしての醍醐味です。

よくある質問

Q1: 4ビット量子化で精度は本当に大丈夫ですか?

実務で使っている私の感覚では、8Bクラスのモデルなら4ビットでも十分な精度を保てます。3ビット以下に落とすと明らかに「物忘れ」や「支離滅裂な回答」が増えますが、4ビット(Q4_K_M)は最もバランスが良い「スイートスポット」です。

Q2: ビルド中にエラーが出て止まってしまいます。

依存ライブラリが不足しているケースがほとんどです。特にLinux環境では build-essential が入っているか確認してください。また、CUDAのバージョンが古すぎると llama.cpp の最新コードに対応していないことがあるため、12.x系へのアップデートを推奨します。

Q3: VRAMが4GBしかない古いノートPCでも動きますか?

動きますが、全レイヤーをGPUに乗せることはできません。-ngl オプションで一部のレイヤー(例えば10レイヤー程度)だけをGPUに送り、残りをCPUで処理することになります。その場合、速度は数トークン/秒まで落ちますが、動作確認自体は可能です。

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

RTX 4060 Ti 16GB

VRAM 16GBでLlama-3-70Bの量子化モデルも視野に入るコスパ最強ボード

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

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


あわせて読みたい