所要時間: 約30分 | 難易度: ★★★☆☆
この記事で作るもの
この記事を読むと、自身のPC(Windows/Mac)でLlama 3などの最新LLMを、VRAMを節約しながら高速に動作させるPythonスクリプトが完成します。
- 前提知識: Pythonの基本的な読み書きができる、ターミナル(コマンドプロンプト)の操作に抵抗がない
- 必要なもの: 8GB以上のメモリを搭載したPC(GPU搭載推奨)、Python 3.10以降
先に確認するスペック・料金
ローカルLLMを動かす上で、最も重要なのは「VRAM(ビデオメモリ)」の容量です。 結論から言うと、NVIDIA製のGPU(RTX 3060 12GB以上)か、Apple Silicon(M1/M2/M3)を搭載した16GB以上のメモリを持つMacがあれば、実用的な速度で動作します。
逆に、CPUだけで動かそうとすると、レスポンスに数十秒から数分かかるため、仕事で使うには厳しいのが現実です。 もしこれからハードウェアを揃えるなら、コスパ重視ならRTX 4060 Ti (16GBモデル)、本気で検証するなら私が愛用しているRTX 4090 (24GB) を選んでください。
費用については、モデル自体は無料(Llama 3やQwenなど)で利用でき、API料金も一切かかりません。 電気代を除けば、月額$0でGPT-4oに迫る性能のモデルを無制限に叩き続けられるのがローカル環境の最大の魅力です。
なぜこの方法を選ぶのか
LLMを動かす方法はいくつかありますが、なぜ「llama.cpp」と「GGUF」の組み合わせがデファクトスタンダードなのかを説明します。
通常のモデル(FP16形式)は非常に重く、例えば70億パラメータ(7B)のモデルをそのまま動かすには約28GBのVRAMが必要です。 これでは一般向けのGPUではメモリ不足で動きません。
そこで「GGUF」という形式で量子化(データの軽量化)を行います。 重みの精度を16bitから4bitなどに落とすことで、メモリ消費を4分の1程度まで削減できます。 「llama.cpp」は、このGGUF形式を最も効率よく、かつCPUとGPUをハイブリッドに活用して動かせるC++ベースの推論エンジンです。 PythonのTransformersライブラリで動かすよりも圧倒的に起動が速く、メモリ管理が優秀なため、私はこの構成を実務で採用しています。
Step 1: 環境を整える
まずは、llama.cppをPythonから扱うためのライブラリ「llama-cpp-python」をインストールします。 ここが最大の難所であり、OSやGPU環境によってインストールコマンドが異なります。
Windows (NVIDIA GPUあり) の場合
CUDAツールキットがインストールされていることを前提とします。
# CUDA環境を利用するためのフラグを立ててインストール
$env:CMAKE_ARGS = "-DGGML_CUDA=on"
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
Mac (Apple Silicon) の場合
Metal(GPU)を有効にするため、以下のコマンドを使用します。
CMAKE_ARGS="-DGGML_METAL=on" pip install llama-cpp-python
各設定の意味ですが、GGML_CUDA=on や GGML_METAL=on は「計算をCPUではなくGPUに丸投げする」という命令です。
これを忘れると、推論速度が10倍以上遅くなるので注意してください。
落とし穴:
インストール時に cmake が入っていないとエラーが出ます。Windowsなら choco install cmake、Macなら brew install cmake で事前にインストールしておきましょう。また、ビルド済みのホイールが見つからない場合はコンパイラ(Visual StudioのC++ビルドツールなど)が必要になることがあります。
Step 2: GGUFモデルのダウンロード
次に、動かしたいモデルをHugging Faceからダウンロードします。 今回は日本語能力に定評がある「Llama-3-8B-Instruct」の量子化版を使用します。
モデルを探す際は、Hugging Faceで「[モデル名] GGUF」と検索してください。 有名な投稿者(Bartowski氏やMaziyarPanahi氏など)が公開しているものが信頼できます。
どのファイルを選べばいいか迷ったら、以下の基準で選んでください。
- Q4_K_M: 推奨。精度とサイズのバランスが最も良く、迷ったらこれ。
- Q8_0: 精度重視。VRAMに余裕がある場合のみ。
- Q2_K: 最小サイズ。精度はかなり落ちるが、メモリが極端に少ない環境用。
今回は「Llama-3-8B-Instruct-v0.1-GGUF」をダウンロードし、プロジェクトフォルダ内の models フォルダに配置したと仮定します。
Step 3: 動かしてみる
準備が整ったので、最小限のコードでモデルを起動してみます。 Pythonファイル(main.py)を作成し、以下のコードを貼り付けてください。
from llama_cpp import Llama
# モデルの読み込み
# n_gpu_layers: GPUにオフロードするレイヤー数。-1は全レイヤーをGPUへ。
# n_ctx: コンテキストサイズ(トークン数)。長い会話をするなら大きくする。
llm = Llama(
model_path="./models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf",
n_gpu_layers=-1,
n_ctx=2048,
verbose=False
)
# 推論の実行
response = llm.create_chat_completion(
messages=[
{"role": "system", "content": "あなたは優秀なアシスタントです。"},
{"role": "user", "content": "AIの量子化について、3行で教えてください。"}
]
)
print(response["choices"][0]["message"]["content"])
期待される出力
AIの量子化とは、モデルの重みの精度を下げてサイズを軽量化する技術です。
これにより、少ないメモリ環境でも高速に推論を実行できるようになります。
多少の精度低下はありますが、実用上は問題ないレベルに抑えることが可能です。
結果の読み方:
n_gpu_layers=-1 と設定することで、モデルのすべての計算がGPU上で行われます。
もし実行中に「VRAM不足(Out of Memory)」で落ちる場合は、この数値を 20 や 30 などの数字に減らして、一部の計算をCPUに逃がすように調整してください。
Step 4: 実用レベルにする
実務で使う場合、レスポンスが一度に返ってくるのを待つのはストレスです。 ChatGPTのように、生成された文字から順に表示される「ストリーミング」機能を実装しましょう。
import sys
from llama_cpp import Llama
def run_ai_chat():
# 初期化
llm = Llama(
model_path="./models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf",
n_gpu_layers=-1,
n_ctx=4096,
verbose=False
)
print("AIへの質問を入力してください(exitで終了):")
while True:
user_input = input("\nユーザー: ")
if user_input.lower() == "exit":
break
# ストリーミングを有効にして実行
stream = llm.create_chat_completion(
messages=[
{"role": "user", "content": user_input}
],
stream=True
)
print("アシスタント: ", end="", flush=True)
for chunk in stream:
delta = chunk["choices"][0]["delta"]
if "content" in delta:
content = delta["content"]
print(content, end="", flush=True)
print()
if __name__ == "__main__":
run_ai_chat()
このコードでは、stream=True を設定し、forループで生成されたチャンクを逐次表示しています。
これだけで、UIの体験価値は劇的に向上します。
また、n_ctx を4096に増やしました。これにより、より長い文脈を理解できるようになりますが、その分メモリ消費量も増える点には注意してください。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
llama_cpp not found | インストール失敗 | pip list で確認し、Step 1のコマンドを再試行 |
| Speed is very slow | CPUで動作している | n_gpu_layers が 0 になっていないか確認。ビルド時のフラグ漏れ。 |
| CUDA error: out of memory | VRAM容量不足 | n_gpu_layers の値を減らすか、より小さい量子化モデル(Q2_K等)を使う |
| 文字化けする | モデルが日本語未対応 | Llama-3-8B-Instructなど、多言語対応モデルを選んでいるか確認 |
次のステップ
環境が構築できたら、次は「RAG(検索拡張生成)」に挑戦してみてください。
自分の持っているPDFやテキストファイルを読み込ませ、その内容に基づいてAIに回答させる仕組みです。
llama.cppは langchain というライブラリとも連携が容易なため、今回作ったスクリプトをベースに、社内ドキュメントの検索ツールなどを自作することが可能です。
また、API経由で利用したい場合は「llama-cpp-python[server]」をインストールすることで、OpenAI互換のAPIサーバーをローカルで立てることもできます。 これにより、CursorなどのAIエディタのバックエンドを自前モデルに差し替えるといった、上級者向けの運用も視野に入ってきます。
よくある質問
Q1: グラボがないノートPCでも動きますか?
動きますが、速度は期待できません。GGUF形式はCPU(AVX2命令など)にも最適化されているため、動作自体はしますが、1秒間に1〜2文字程度の生成速度になることが多いです。まずは軽量な「Gemma-2b」などの小さなモデルから試すことをおすすめします。
Q2: 量子化すると、どのくらい賢さが減るのでしょうか?
一般的な評価(Perplexityなど)では、4bit量子化(Q4_K_M)であれば、元のFP16形式と比べて精度低下は1%未満に抑えられると言われています。実務で使っている私の感覚でも、4bitまではほとんど差を感じません。しかし3bit以下にすると、論理的な破綻が目立ち始める印象です。
Q3: モデルを商用利用しても大丈夫ですか?
各モデルのライセンスによります。Llama 3であれば「Llama 3 Community License」が適用され、月間アクティブユーザー数が7億人を超えない限りは無料で商用利用可能です。QwenやGemmaもそれぞれ独自のライセンスがあるため、業務で使う前には必ずリポジトリのLICENSEファイルを確認してください。
📦 この記事に関連する商品(楽天メインで価格確認)
RTX 4060 Ti 16GBVRAM 16GBでLlama 3 8Bクラスを余裕を持って動かせる入門最適解
※アフィリエイトリンクを含みます





