所要時間: 約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が足りない場合は、この値を 20 や 30 などの数値に調整して、一部だけをGPUに、残りをシステムメモリ(RAM)に分担させる「ハイブリッド推論」が可能です。
これがllama.cppの真骨頂であり、巨大なモデルを安価なPCで動かすための鍵となります。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
error loading model | GGUFファイルの破損または非互換 | llama.cppを最新版に更新して再ビルドする。 |
out of memory | VRAM容量不足 | 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: 変換スクリプトでエラーが出ます。
多くの場合、numpy や sentencepiece などの依存ライブラリが不足しています。
pip install -r requirements.txt がllama.cppのディレクトリ内にあるので、それを実行して必要なパッケージを一括で入れてください。
Q3: GPUがないノートPCでも動きますか?
はい、動きます。llama.cppはCPUのAVX2やAVX512といった命令セットを駆使して計算するため、最近のCore i5/i7等であれば、8Bモデルを4bit量子化すれば実用的な速度で動作します。



