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

この記事で作るもの

この記事では、ローカル環境でLlama 3.1やMistralといった最新のLLM(大規模言語モデル)を高速に動作させる「llama.cpp」の環境を構築します。 最終的には、自分のPC内でOpenAI互換のAPIサーバーを立ち上げ、PythonスクリプトからAIを呼び出して自由自在に操作できる状態を目指します。

  • ローカルLLMを動かすためのllama.cppビルド環境
  • Hugging Faceからの最適なGGUFモデル選定とダウンロード
  • PythonからローカルLLMを呼び出す推論スクリプト

前提知識:基本的なコマンドライン操作(cd, mkdir等)ができること、Pythonの基礎知識。 必要なもの:NVIDIA製GPUを搭載したPC、またはApple Silicon(M1/M2/M3)搭載のMac。

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

ローカルLLMの世界では、何よりも「VRAM(ビデオメモリ)」の容量が正義です。 目安として、7B(70億パラメータ)クラスのモデルを快適に動かすならVRAM 8GB以上、14Bクラスなら12GB〜16GB、70Bクラスを狙うなら48GB以上(RTX 3090/4090の2枚挿しなど)が必要になります。

Windowsユーザーでこれからハードウェアを揃えるなら、現状の最適解は「RTX 4060 Ti 16GB版」です。 3000番台の中古RTX 3090(24GB)も魅力的ですが、消費電力とワットパフォーマンスを考えると、個人開発レベルでは4060 Ti 16GBが最も安上がりで深く遊べます。

Macユーザーの場合、メモリがCPUと共通化されている「ユニファイドメモリ」が強力な武器になります。 メモリ16GBのMacBook Airでも7Bモデルならサクサク動きますが、本格的にやりたいならメモリ32GB以上のモデルを選ばないと、モデルをロードした瞬間にOSごと落ちる悲劇に見舞われます。

料金面については、llama.cppもモデルファイルもすべてオープンソースなので、電気代以外は完全に「無料」です。 APIの従量課金に怯えながらプロンプトを投げる日々からは、今日で卒業しましょう。

なぜこの方法を選ぶのか

ローカルでLLMを動かす方法は、Pythonのtransformersライブラリを使う方法や、Ollamaのようなパッケージを使う方法など、いくつか存在します。 その中で私が「llama.cpp」を強く推す理由は、圧倒的な推論速度と、メモリ消費量の少なさにあります。

llama.cppはC++で書かれており、Pythonを介さずにハードウェアの性能を限界まで引き出します。 また「GGUF」という形式に量子化されたモデルを使用することで、元のモデル精度をほぼ維持したまま、ファイルサイズと使用メモリを4分の1程度まで圧縮できます。

Ollamaは内部でllama.cppを使っていますが、カスタマイズ性や最新機能の追従速度では本家llama.cppに軍配が上がります。 エンジニアとして「中身がどう動いているか」を把握し、仕事で使えるレベルの細かいパラメータ調整を行うなら、直接llama.cppを触る経験が不可欠です。

Step 1: 環境を整える

まずはllama.cppを自分のPCのハードウェアに最適化した状態でビルド(コンパイル)します。 「ビルド済みバイナリ」を拾ってくる方法もありますが、自分でビルドしたほうが、お使いのGPUの性能を100%発揮できるため、私はこの方法しか推奨しません。

Mac(Apple Silicon)の場合

Macの場合はXcode Command Line Toolsが必要です。ターミナルで以下を実行してください。

# ビルドツールのインストール
xcode-select --install

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

# ビルド(MetalというMac専用のGPU加速を有効にします)
make -j

Windows(NVIDIA GPU)の場合

Windowsでは「CMake」と「Visual Studio 2022」のビルドツールが必要です。 さらに、GPUを使うためにCUDA Toolkit(12.x推奨)をインストールしておいてください。

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

# ビルド用ディレクトリの作成
mkdir build
cd build

# CUDAを有効にして構成
cmake .. -DGGML_CUDA=ON

# ビルドを実行(Releaseモード)
cmake --build . --config Release

⚠️ 落とし穴: Windowsユーザーで、ビルド中に「CUDA not found」といったエラーが出る場合、環境変数 PATH にCUDAのbinディレクトリが含まれているか確認してください。 また、ビルド完了後に llama-cli.exe が生成されていない場合は、CMakeの出力ログを遡ってエラーを特定する必要があります。多くの場合、Visual Studioの「C++によるデスクトップ開発」ワークロードの入れ忘れが原因です。

Step 2: 基本の設定

ビルドが終わったら、次は動かしたいAIモデル(GGUF形式)を入手します。 Hugging Faceというサイトで検索しますが、自分で量子化するのは手間なので、信頼できる職人が公開しているものを使わせてもらいましょう。

おすすめは Bartowski 氏や MaziyarPanahi 氏が公開しているリポジトリです。 今回は「Llama-3.1-8B-Instruct」のGGUF版を例に進めます。

  1. Hugging Faceで Llama-3.1-8B-Instruct-GGUF を検索します。
  2. 「Files and versions」タブを開きます。
  3. Q4_K_M.gguf というファイルを探してダウンロードします。

なぜ Q4_K_M なのか? 量子化ビット数には「Q2」から「Q8」までありますが、数値が小さいほど軽く、大きいほど高精度です。 私の検証結果では、4ビット(Q4)が「精度低下が体感できず、かつメモリを大幅に節約できる」スイートスポットです。 迷ったら Q4_K_M を選べば間違いありません。

ダウンロードしたファイルは、llama.cppディレクトリ内に models というフォルダを作って移動させておきます。

Step 3: 動かしてみる

いよいよ動かします。まずはAPIサーバーとして起動させ、外部(Python)から叩ける状態にします。 これが実務で最も汎用性の高い動かし方です。

# Mac/Linuxの場合
./llama-server -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 33 -c 4096

# Windowsの場合(build/bin/Release等にあるexeを指定)
./bin/Release/llama-server.exe -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 33 -c 4096

設定値の理由:

  • -m: モデルファイルのパス。
  • -ngl 33: GPUにオフロードするレイヤー数。Llama-3 8Bは約33レイヤーなので、全部GPUに乗せるなら33(またはそれ以上)を指定します。これによって爆速になります。
  • -c 4096: コンテキストサイズ。一度に扱えるトークン数です。仕事で使うなら4096〜8192程度は確保しましょう。

期待される出力

サーバーが起動すると、ターミナルに以下のようなログが流れます。

HTTP server listening: http://127.0.0.1:8080

この状態でブラウザから http://localhost:8080 にアクセスすると、簡易的なチャット画面が表示されます。 まずはそこで「こんにちは、自己紹介して」と送ってみてください。 秒間30〜100トークン程度の速度で返文が来れば、成功です。

Step 4: 実用レベルにする

サーバーが立ち上がったら、今度はPythonからこのローカルLLMを制御します。 llama.cppのサーバーモードはOpenAI APIと互換性があるため、openaiライブラリをそのまま使えます。

まず、ライブラリをインストールします。

pip install openai

次に、以下のスクリプトを作成して実行してください。

import openai

# ローカルで立ち上げたllama-serverを指すように設定
client = openai.OpenAI(
    base_url="http://localhost:8080/v1",
    api_key="sk-no-key-required" # ローカルなので何でも良い
)

def ask_local_llm(prompt):
    try:
        response = client.chat.completions.create(
            model="local-model", # llama-server側で指定したモデル名が反映される
            messages=[
                {"role": "system", "content": "あなたは優秀なエンジニアです。簡潔に回答してください。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0.7, # 創造性の調整。0に近いほど確実な回答になる
        )
        return response.choices[0].message.content
    except Exception as e:
        return f"エラーが発生しました: {e}"

if __name__ == "__main__":
    question = "Pythonで高速な素数判定アルゴリズムを書いて。"
    answer = ask_local_llm(question)
    print(f"--- 回答 ---\n{answer}")

このコードのポイントは、base_url をローカルホストに変更している点だけです。 これだけで、既存のOpenAI向けに書かれたコードを1行も変えずにローカルLLMへ差し替えることが可能になります。 機密情報を扱う業務で、「外部にデータを送りたくないがLLMの力は借りたい」という場面で最強のソリューションになります。

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

エラー内容原因解決策
error loading modelRAM/VRAM不足モデルの量子化ビット数を下げる(Q4→Q2)か、小さいモデル(3Bクラス)を試す。
推論がめちゃくちゃ遅いGPUが使われていない-ngl オプションが0になっていないか確認。ビルド時にCUDA/Metalが有効になっていない可能性が高い。
回答が途中で切れる-n または -c 不足起動引数の -c (context) の値を増やす。
日本語が文字化けするモデルが日本語非対応Llama 3.1 InstructやCommand Rなど、多言語対応を謳っているモデルを使用する。

次のステップ

無事に動かせたなら、次は「RAG(検索拡張生成)」に挑戦してみてください。 自分の持っているPDFやテキストファイルをベクトル化してデータベースに入れ、llama.cpp経由で回答させるシステムです。

具体的には LangChain や LlamaIndex と組み合わせて、今回作った base_url を指定するだけです。 また、VS Codeの拡張機能である Continue や Cursor のバックエンドとしてこのローカルサーバーを指定すれば、コード生成も完全オフライン・無料で実行できるようになります。

RTX 4090などの上位GPUを持っているなら、複数のモデルを同時に立ち上げて、AI同士を議論させるエージェントシステムの構築も面白いでしょう。 ローカルLLMは、自由度こそが最大の価値です。

よくある質問

Q1: グラボがない古いノートPCでも動きますか?

動きますが、速度は期待しないでください。llama.cppはCPU(AVX2/AVX512命令)もフル活用するため、最近のCore i7等なら、7Bモデルで秒間2〜5トークン程度は出ます。黙々と文章を生成させるバッチ処理なら実用圏内です。

Q2: どのGGUFファイルを選べばいいか分かりません。

基本は Q4_K_M です。メモリに余裕があるなら Q5_K_M や Q6_K を。逆にメモリがカツカツで、どうしても動かしたいなら IQ3_S などを試してください。3ビット以下は知能が目に見えて落ちるので、検証用と割り切るべきです。

Q3: llama.cppを最新版に更新するには?

git pull してから、Step 1と同じビルドコマンドを叩き直すだけです。llama.cppは開発速度が異常に早く、週単位で新しいモデルへの対応や高速化が行われるため、月1回は更新することをおすすめします。

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

RTX 4060 Ti 16GB

VRAM 16GBで7B〜14Bモデルをフルロードできる、ローカルLLM入門の最適解

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

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


あわせて読みたい