所要時間: 約35分 | 難易度: ★★★☆☆
llama.cppとGGUF量子化を用いて、手元のPCにOpenAI互換の高速な推論エンドポイントを構築します。
この記事で作るもの
- Llama 3.1やQwen 2.5などの最新LLMをPC上で爆速動作させる推論環境
- OpenAI APIと完全に差し替え可能な、ローカルLLMサーバー(APIエンドポイント)
- 前提知識:ターミナルの基本操作(cd, curl等)ができること。Pythonの基本的な文法を知っていること。
- 必要なもの:Mac(Apple Silicon推奨)またはGPU(NVIDIA製推奨)を搭載したWindows/Linux PC。
📦 この記事に関連する商品(楽天メインで価格確認)
RTX 4060 Ti 16GBVRAM 16GBで8Bモデルを余裕で全レイヤーGPUに乗せられる入門最適解
※アフィリエイトリンクを含みます
先に確認するスペック・料金
ローカルLLMを「仕事で使える速度」で動かすには、VRAM(ビデオメモリ)の量がすべてです。 GGUF形式の最大のメリットは、VRAMが足りない場合にメインメモリ(RAM)へ処理を逃がせる点にありますが、速度は10倍以上遅くなります。 実用的なラインとしては、80億パラメータ(8B)クラスのモデルを動かすのに、最低でも8GBのVRAM、できれば16GB以上を確保してください。
Macユーザーであれば、メモリ16GB以上のM1/M2/M3/M4チップ搭載モデルが最低条件です。 Windowsなら、RTX 3060 (12GB) や RTX 4060 Ti (16GB) が入門として最適です。 私のメイン機であるRTX 4090 (24GB) 2枚挿し環境であれば、70Bクラスの巨大モデルも量子化次第で実用速度で動かせますが、まずは手元のマシンで「8Bモデルの4-bit量子化」を動かすところから始めるのが賢明です。 料金面では、一度ハードウェアを揃えてしまえば、電気代以外は完全に無料。APIの従量課金やプライバシーの懸念から解放されるメリットは、実務において極めて大きいです。
なぜこの方法を選ぶのか
ローカルでLLMを動かす手段には、他にもOllamaやLM Studio、vLLMなどがあります。 しかし、私はあえて「llama.cpp」を直接触ることを推奨します。 理由は、カスタマイズ性の高さと、依存関係の少なさです。 Ollamaの中身も結局はllama.cppですが、ラッパーを通すと「細かいパラメータ調整」や「最新モデルへの対応速度」で一歩遅れることがあります。
また、GGUF形式は「一つのファイルにモデルの重みとメタデータがすべて含まれている」ため、管理が非常に楽です。 Hugging FaceのTransformers形式のように、複数のファイルをフォルダごと管理する必要がありません。 「この1ファイルを指定すれば動く」というシンプルさは、スクリプトへの組み込みにおいて大きな武器になります。
Step 1: 環境を整える
まずはllama.cppをビルドします。 バイナリをダウンロードするよりも、自分のPC環境に最適化してビルドする方が、推論速度が10〜20%向上します。
macOS (Apple Silicon) の場合
# リポジトリのクローン
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# ビルド(Apple SiliconはデフォルトでMetalが有効になります)
cmake -B build
cmake --build build --config Release
Windows (NVIDIA GPU) の場合
CMakeとVisual Studioのビルドツールがインストールされていることが前提です。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# CUDAを有効にしてビルド(これを忘れるとCPU推論になり、激重になります)
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
ビルドが完了すると、build/bin/ フォルダ(Windowsは build/bin/Release/)の中に llama-cli や llama-server という実行ファイルが生成されます。
⚠️ 落とし穴:
Windows環境で GGML_CUDA=ON を指定せずにビルドしてしまう初心者が非常に多いです。
これを確認するには、実行時にログを見て「CUDA」の文字があるか、あるいはタスクマネージャーでGPU使用率が上がっているかを確認してください。
CPUだけで動かして「ローカルLLMは遅すぎて使えない」と結論づけるのは、非常にもったいない誤解です。
Step 2: モデルのダウンロード(GGUF)
LLMの本体(モデルデータ)を取得します。 今回は、日本語能力が高くバランスの良い「Llama-3.1-8B-Instruct」のGGUF版を使います。
Hugging Faceには、世界中の有志が量子化済みのファイルをアップロードしています。 特に「Bartowski」氏や「MaziyarPanahi」氏のレポジトリは更新が早く信頼できます。
# モデル格納用のディレクトリを作成
mkdir models
# Llama-3.1-8Bの4-bit量子化モデルをダウンロード
# Q4_K_M は精度とサイズのバランスが最も良い「黄金比」の量子化設定です
curl -L https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -o models/llama-3.1-8b-q4_k_m.gguf
量子化ビット数(Q4, Q5, Q8など)の選び方に迷ったら、まずは「Q4_K_M」を選んでください。 FP16(無量子化)に比べてモデルサイズは約4分の1になりますが、応答精度は数パーセントしか低下しません。 私の検証では、実務上のタスクにおいてQ4とQ8の差を体感できるケースは稀でした。
Step 3: 基本の推論実行
まずはコマンドラインから直接モデルを動かしてみます。
./build/bin/llama-cli \
-m models/llama-3.1-8b-q4_k_m.gguf \
-p "あなたは優秀なエンジニアです。Pythonで素数を判定する効率的な関数を書いてください。" \
-n 512 \
-ngl 99
パラメータの解説
-m: モデルファイルへのパス。-p: プロンプト(入力文)。-n: 生成する最大トークン数。-ngl 99: 「GPUにオフロードするレイヤー数」です。99などの大きな値を入れれば、全レイヤーがGPUに乗ります。VRAMが足りない場合は、この数値を徐々に下げて調整します。
期待される出力
def is_prime(n):
if n <= 1: return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0: return False
return True
... (解説が続く)
1秒間に生成されるトークン数(Tokens per second)に注目してください。 8Bモデルなら、M2 Proで約30〜40 t/s、RTX 4090なら100 t/sを超えます。 この速度が出ていれば、チャットボットやコード生成においてストレスを感じることはありません。
Step 4: 実用レベルにする(APIサーバー化)
「動いて終わり」では意味がありません。 仕事で使うためには、他のアプリから呼び出せる「APIサーバー」として立ち上げるのが正解です。
./build/bin/llama-server \
-m models/llama-3.1-8b-q4_k_m.gguf \
--port 8080 \
-ngl 99 \
--alias llama3
これで、localhost:8080 でOpenAI互換のAPIが立ち上がりました。
あとは、使い慣れたPythonの openai ライブラリから接続するだけです。
import os
from openai import OpenAI
# ローカルサーバーに接続するための設定
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="sk-no-key-required" # ローカルなのでキーは適当でOK
)
# ストリーミング再生でレスポンスを取得
response = client.chat.completions.create(
model="llama3",
messages=[
{"role": "system", "content": "あなたは簡潔に答えるアシスタントです。"},
{"role": "user", "content": "Rust言語のメリットを3行で教えて。"}
],
stream=True
)
for chunk in response:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
この方法の凄さは、既存のOpenAI APIを使っている自作アプリの base_url を書き換えるだけで、一瞬でローカル完結・無料のシステムに切り替えられる点にあります。
私は機密情報の含まれるソースコードのレビューを依頼する際、必ずこのローカルエンドポイントを通すようにしています。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
error loading model | ファイルが壊れている、またはパスが違う | 再ダウンロードするか、パスを絶対パスで指定する |
| 推論が異常に遅い | -ngl 0(CPU推論)になっている | -ngl 99 を指定し、ビルド時にCUDA/Metalが有効か確認 |
out of memory | VRAM不足 | より小さいモデル(3Bなど)を使うか、-ngl の値を下げる |
| 日本語が化ける | モデルが日本語非対応 | Llama-3-instruct や Qwen などの日本語学習済みモデルを使う |
次のステップ
ここまでできれば、あなたは「自分のPCの中に知能を閉じ込める」ことに成功したと言えます。 次に挑戦すべきは、以下の3点です。
RAG(検索拡張生成)の実装: 自分のメモや技術ドキュメントをPDFから読み込ませ、ローカルLLMに回答させるシステムを作ってみてください。
llama-serverとLangChainを組み合わせれば、外部にデータを出さない最強の社内FAQツールが作れます。GGUFの量子化を自分で行う: Hugging Faceに気に入ったモデルがあるが、GGUF形式が転がっていない場合。 llama.cppに含まれる
convert_hf_to_gguf.pyを使えば、自分で量子化ファイルを作成できます。 最新モデルを誰よりも早くローカルで動かす快感は、エンジニアとして格別です。マルチモーダルへの挑戦:
Llavaなどの画像認識対応モデルもGGUF形式で動かせます。 「このエラー画面のキャプチャを見て原因を教えて」といった指示も、ローカル環境で完結させることが可能です。
よくある質問
Q1: 4-bit量子化で精度は本当に落ちませんか?
実務レベルではほぼ問題になりません。 確かに難解な論理パズルでは差が出ますが、コード生成や文章要約であれば、16-bitで遅い推論を待つよりも、4-bitで高速に試行錯誤を回す方が圧倒的に生産性が高いです。
Q2: Windowsでビルドが通りません。
最も多い原因は、Visual Studioの「C++によるデスクトップ開発」ワークロードが入っていないことです。 また、CMakeのパスが通っているかも確認してください。 どうしても詰まったら、有志が公開しているビルド済みバイナリ(Releasesページ)を使うのも手です。
Q3: 複数のモデルを同時に動かせますか?
VRAMが許す限り可能です。
ポート番号を -p 8081, -p 8082 と分ければ、複数の llama-server を立ち上げられます。
ルーティング用のプロキシを前に置けば、モデル同士を対話させるエージェントシステムも構築できます。



