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

この記事で作るもの

この記事を読むと、手元のPCのリソースを最大限に活かして、Llama 3.1などの最新モデルを数GBのメモリで高速に動かすPythonスクリプトが完成します。

  • 構築内容:llama.cppのビルド、GGUF形式への量子化、Python API経由での推論
  • 前提知識:ターミナル(PowerShell/Terminal)の基本操作、Pythonの基礎
  • 必要なもの:8GB以上のメモリを搭載したPC(Mac/Windows/Linux)、インターネット接続

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

ローカルLLMを動かす上で、最も重要なのは「VRAM(ビデオメモリ)」の容量です。 クラウドGPUを借りる場合は1時間数十円から数百円かかりますが、自前で環境を組めば電気代以外は無料です。

最低でも8GBのRAMがあれば動かせますが、快適に動作させるなら16GB以上を推奨します。 WindowsユーザーならRTX 3060 12GBやRTX 4060 Ti 16GBが、コストパフォーマンスの面でエントリーモデルとして最適です。 Macユーザーの場合、Apple Silicon(M1/M2/M3)のユニファイドメモリが非常に強力に作用するため、16GB以上のメモリがあれば十分実用的な速度が出ます。

私がメインで使っているRTX 4090 2枚挿し環境(VRAM 48GB)は極端な例ですが、一般的には「自分が動かしたいモデルのパラメータ数」で判断してください。 8B(80億パラメータ)モデルを量子化せずに動かすには約16GBのメモリが必要ですが、今回紹介するGGUF量子化を使えば5GB程度まで削減可能です。 高価なハードウェアを買う前に、まずは手持ちのPCで「4bit量子化」を試すのが最も賢い選択だと言えます。

なぜこの方法を選ぶのか

ローカルでLLMを動かす手段は、Ollama、LM Studio、Text-generation-webuiなど多岐にわたります。 その中で「llama.cpp」と「GGUF」を直接触る理由は、圧倒的な「軽量さ」と「カスタマイズ性」にあります。

Ollamaは内部でllama.cppを動かしていますが、ブラックボックスな部分が多く、特定の最適化フラグを立てたり、独自の量子化設定を試すのが難しい側面があります。 llama.cppはC++で書かれた純粋な実装であり、依存関係が非常に少なく、CPUだけでも驚くほど高速に動作します。 また、GGUF(GPT-Generated Unified Format)というファイル形式は、モデルの重みだけでなくメタデータも一つにまとまっているため、管理が楽でロードも速いという特徴があります。 「仕事で使う」ことを考えた場合、ライブラリのバージョン管理やデプロイの柔軟性を確保するために、これら低レイヤーのツールを使いこなせるメリットは非常に大きいです。

Step 1: 環境を整える

まずはllama.cppをビルドするためのコンパイラと、Python環境を準備します。 ビルドを行うのは、お使いのCPUやGPUに最適化されたバイナリを生成し、実行速度を最大化するためです。

Mac(Apple Silicon)の場合

# Homebrewがインストールされている前提
brew install cmake python@3.10
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build -DGGML_METAL=ON
cmake --build build --config Release

-DGGML_METAL=ON を指定することで、MacのGPUであるMetalをフル活用できるようになります。

Windows(NVIDIA GPU)の場合

# gitとcmake、Visual Studio 2022のBuild Toolsがインストールされている前提
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release

-DGGML_CUDA=ON は、NVIDIAのGPUを使って計算を加速させるための必須フラグです。

⚠️ 落とし穴: Windows環境で cmake が失敗する場合、多くは「CUDA Toolkit」のパスが通っていないか、インストールされていないことが原因です。 必ずNVIDIA公式サイトから自分のGPUに対応したCUDA Toolkitをインストールし、再起動してから実行してください。

Step 2: 基本の設定

次に、AIモデル(重みファイル)をダウンロードし、llama.cppで扱えるGGUF形式に変換します。 今回は、Metaが公開している「Llama-3.1-8B」を例に進めます。

# Pythonの仮想環境を作成
python -m venv venv
source venv/bin/activate  # Windowsは venv\Scripts\activate

# 必要なライブラリのインストール
pip install huggingface_hub numpy

次に、Hugging Faceからモデルをダウンロードします。

from huggingface_hub import snapshot_download

# モデルの保存先ディレクトリ
model_id = "meta-llama/Meta-Llama-3.1-8B"
snapshot_download(repo_id=model_id, local_dir="./models/Llama-3.1-8B")

ダウンロードしたモデルはそのままでは使えません。llama.cppに同梱されているスクリプトで変換します。

# 変換スクリプトの実行(FP16形式へ)
python convert_hf_to_gguf.py models/Llama-3.1-8B --outfile models/llama-3.1-8b-f16.gguf

この段階ではまだファイルサイズが大きく、メモリを消費します。これを「量子化」して軽量化します。

# 4bit量子化(Q4_K_M)を実行
./build/bin/llama-quantize models/llama-3.1-8b-f16.gguf models/llama-3.1-8b-q4_k_m.gguf Q4_K_M

ここで Q4_K_M を選ぶ理由は、推論精度をほとんど落とさずに、ファイルサイズとメモリ消費を劇的に(約1/4に)削減できるためです。 実務で最もバランスが良い設定として、私は常にこれを使っています。

Step 3: 動かしてみる

変換が終わったら、まずはコマンドラインから動作を確認します。

# 推論の実行
./build/bin/llama-cli -m models/llama-3.1-8b-q4_k_m.gguf -p "AIが人間に代わって仕事をする未来について、3つの視点で述べてください。" -n 512

期待される出力

1. 効率性の向上: 単純作業からの解放...
2. 新たな職種の創出: AIマネジメント...
3. 社会保障の再定義: ベーシックインカム...

レスポンス速度に注目してください。Apple SiliconやNVIDIAのGPUが正しく認識されていれば、1秒間に数十トークンの速さで文字が出力されるはずです。

もし出力が極端に遅い(1秒間に1文字など)場合は、GPUが使われずCPUだけで計算している可能性があります。 その際は、実行時に -ngl 32(GPUにオフロードするレイヤー数)というオプションを追加して試してみてください。

Step 4: 実用レベルにする

単発のコマンド実行ではなく、Pythonプログラムからこのモデルを呼び出し、対話型のチャットボットとして機能させます。 ここでは llama-cpp-python という便利なライブラリを使います。

# ライブラリのインストール(CUDA環境の場合)
CMAKE_ARGS="-DGGML_CUDA=ON" pip install llama-cpp-python

以下が、実用的なチャットスクリプトの全コードです。

import os
from llama_cpp import Llama

# モデルパスの指定
MODEL_PATH = "./models/llama-3.1-8b-q4_k_m.gguf"

# モデルの初期化
# n_gpu_layers=-1 は、可能な限り全ての計算をGPUで行う設定です
llm = Llama(
    model_path=MODEL_PATH,
    n_gpu_layers=-1,
    n_ctx=4096,  # 文脈の長さ
    verbose=False
)

def ask_ai(prompt):
    # Llama-3のプロンプトフォーマットに合わせる
    formatted_prompt = 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"

    response = llm(
        formatted_prompt,
        max_tokens=1024,
        stop=["<|eot_id|>"],
        echo=False
    )

    return response["choices"][0]["text"]

# テスト実行
if __name__ == "__main__":
    user_input = "PythonでWebスクレイピングをする際の注意点は?"
    print(f"質問: {user_input}")
    print("回答:", ask_ai(user_input))

このコードでは n_gpu_layers=-1 を設定しています。 これにより、モデルの全データをVRAMに展開しようとします。 もしVRAMが足りない場合は、この値を 2030 などの数値に調整して、一部だけをGPUに、残りをシステムメモリ(RAM)に分担させる「ハイブリッド推論」が可能です。 これがllama.cppの真骨頂であり、巨大なモデルを安価なPCで動かすための鍵となります。

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

エラー内容原因解決策
error loading modelGGUFファイルの破損または非互換llama.cppを最新版に更新して再ビルドする。
out of memoryVRAM容量不足n_gpu_layers の値を小さくするか、より高い量子化(Q2_K等)を試す。
CMake not foundパスが通っていないCMakeをインストールし、環境変数PATHに追加する。

次のステップ

ここまでで、あなたは自分のPC上でAIを自由に動かす力を手に入れました。 次に挑戦すべきは「RAG(検索拡張生成)」の実装です。 今回構築した llama-cpp-python を使い、自分のメモ帳や社内ドキュメントをPDFから読み込ませ、その内容に基づいてAIに回答させる仕組みを作ってみてください。

また、Hugging Faceには日々新しいモデルがアップロードされています。 「Gemma 2」や「Qwen 2.5」など、異なるアーキテクチャのモデルを今回の手順で変換し、日本語能力や推論速度を比較してみるのも面白いでしょう。 RTX 4090を2枚挿している私から言わせれば、ローカルLLMの沼はここからが本番です。 自分でモデルを量子化し、設定を詰め、ハードウェアの限界を攻める楽しさをぜひ味わってください。

よくある質問

Q1: 量子化すると、どのくらい頭が悪くなりますか?

Q4_K_M(4bit相当)であれば、ベンチマークスコアの低下は数%以内に収まります。 一方でメモリ消費は半分以下になるため、メリットの方が遥かに大きいです。 仕事で使うならQ4以上、趣味で大きなモデルを無理やり動かすならQ2を検討しましょう。

Q2: 変換スクリプトでエラーが出ます。

多くの場合、numpysentencepiece などの依存ライブラリが不足しています。 pip install -r requirements.txt がllama.cppのディレクトリ内にあるので、それを実行して必要なパッケージを一括で入れてください。

Q3: GPUがないノートPCでも動きますか?

はい、動きます。llama.cppはCPUのAVX2やAVX512といった命令セットを駆使して計算するため、最近のCore i5/i7等であれば、8Bモデルを4bit量子化すれば実用的な速度で動作します。

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

RTX 4060 Ti 16GB

VRAM 16GBでローカルLLM入門に現実的

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

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


あわせて読みたい