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

この記事で作るもの

  • ローカル環境(Windows/Linux/Mac)で、Unslothが最適化した最新のGemma 4モデルをllama.cpp経由で動かし、Pythonから制御する推論システムを構築します。
  • 独自のkv-cache回転やiSWA(Sliding Window Attention)といった、Gemma 4特有の新しいアーキテクチャに完全対応した環境を整備します。
  • 必要なものは、Python 3.10以上の環境と、16GB以上のRAM(26Bモデルを動かすならVRAM 24GB以上のGPUが望ましい)です。

📦 この記事に関連する商品

GeForce RTX 4090

26BモデルをQ4でサクサク動かすには24GBのVRAMが必須。最高の開発体験が得られます

Amazonで見る 楽天で見る

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

なぜこの方法を選ぶのか

Gemma 4は従来のモデルと異なり、注意機構の設計が大幅にアップデートされています。 具体的には「heterogeneous iSWA」という、層ごとに異なるスライディングウィンドウを適用する仕組みが導入されました。 既存の古いllama.cppや、汎用的な変換スクリプトで作成されたGGUFファイルでは、この構造を正しく処理できず、出力が壊れたり性能が極端に低下したりします。

今回紹介するUnslothがリリースした最新GGUFと、それに対応したllama.cppのビルドを組み合わせる方法は、現時点で最も安定してGemma 4のポテンシャルを引き出せる唯一の手段です。 Ollamaのようなラッピングツールを待つのも手ですが、実務で使うなら内部パラメータを直接制御でき、最新の修正を即座に反映できるllama.cppの直接ビルドが、エンジニアとしての正解だと私は確信しています。

Step 1: 環境を整える

まずは最新のGemma 4アーキテクチャを解釈できるllama.cppをソースからビルドします。 バイナリ配布を待つのではなく、自分でコンパイルすることで、あなたのGPUに最適化された高速な環境が手に入ります。

# リポジトリのクローン(常に最新のmasterを取得する)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

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

# NVIDIA GPU(CUDA)を使用する場合の設定
# RTX 4090などのAdaアーキテクチャなら必須。CPUのみなら -DGGML_CUDA=ON は不要
cmake .. -DGGML_CUDA=ON

# ビルド実行(並列処理で高速化)
cmake --build . --config Release -j $(nproc)

この手順で重要なのは、git pullで常に最新の状態にすることです。 Redditで議論されている「attention rotation」や「iSWA」のサポートコードは日々更新されており、昨日ビルドしたバイナリでは動かない可能性すらあります。 私は最初、手元の古いバイナリで試しましたが、推論が無限ループに入りRTX 4090が爆熱を出すだけで何も出力されませんでした。

⚠️ 落とし穴: CUDA Toolkitのバージョンが12.x以上であることを確認してください。 11.x系だと最新のLLM向けカーネル最適化が適用されず、推論速度が30%以上低下するケースを実務で経験しています。 nvcc --version で確認し、古ければ迷わず更新しましょう。

Step 2: 基本の設定

次に、Unslothが公開した最新のGGUFファイルをダウンロードします。 通常の huggingface-cli ではなく、高速な hf_transfer を使うのが26Bクラスのモデルを扱う際の鉄則です。

# 高速ダウンロード用のツールをインストール
pip install -U huggingface_hub[cli,hf_transfer]

# 26B-A4B-itモデル(約18GB)をダウンロード
# 環境変数で高速化を有効にする
export HF_HUB_ENABLE_HF_TRANSFER=1
huggingface-cli download unsloth/gemma-4-26B-A4B-it-GGUF \
    --local-dir ./models \
    --local-dir-use-symlinks False \
    --include "*Q4_K_M.gguf"

ここで「26B-A4B-it」の「Q4_K_M」を選択しているのは、精度と速度のバランスが実務上で最も優れているからです。 Q8(8bit)は高精度ですが、ファイルサイズが倍増し、推論速度の低下に見合うほどの回答精度の向上は私の検証環境では見られませんでした。 逆にQ2やQ3は、複雑な指示(JSON出力など)で構文エラーを連発するため、仕事では使い物になりません。

Step 3: 動かしてみる

準備ができたら、まずはコマンドラインから動作を確認します。 ここで正しく「Gemma 4」のプロンプトテンプレートが適用されているかが肝になります。

# llama.cppのメインバイナリを実行
./bin/llama-cli \
    -m ../models/gemma-4-26B-A4B-it-Q4_K_M.gguf \
    -p "<start_of_turn>user\nあなたは優秀なエンジニアです。Pythonでクイックソートを実装してください。<end_of_turn>\n<start_of_turn>model\n" \
    -n 512 \
    -ngl 99 \
    --temp 0.1

-ngl 99 は、すべての層(Gemma 4 26Bなら全レイヤー)をGPUにオフロードする設定です。 私のRTX 4090環境では、これにより毎秒約75トークンの高速推論を実現しました。 CPUのみだと毎秒3トークン程度まで落ち込むため、実用性は皆無です。

期待される出力

python
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

出力が途中で崩れたり、意味不明な文字列が混ざったりする場合は、Step 1のビルドが古いか、GGUFファイルがアップデート前の古いものである可能性が高いです。

Step 4: 実用レベルにする

単に動かすだけではなく、Pythonプログラムからこの強力なモデルを制御し、業務自動化に組み込めるようにします。 llama-cpp-python を使用しますが、ここでも最新のヘッダーを参照させる必要があります。

import os
from llama_cpp import Llama

# モデルのパスを指定
MODEL_PATH = "./models/gemma-4-26B-A4B-it-Q4_K_M.gguf"

# Llamaインスタンスの初期化
# n_gpu_layers=-1 は全レイヤーをGPUに載せる設定
# n_ctx=8192 は業務利用を想定した文脈長(Gemma 4はもっと長くできるがVRAMと相談)
llm = Llama(
    model_path=MODEL_PATH,
    n_gpu_layers=-1,
    n_ctx=8192,
    f16_kv=True,
    verbose=False
)

def ask_gemma(prompt):
    # Gemma 4のテンプレート形式でラップ
    formatted_prompt = f"<start_of_turn>user\n{prompt}<end_of_turn>\n<start_of_turn>model\n"

    response = llm(
        formatted_prompt,
        max_tokens=1024,
        stop=["<end_of_turn>"],
        temperature=0.1, # 安定性を高めるために低めに設定
        repeat_penalty=1.1
    )

    return response["choices"][0]["text"].strip()

# テスト実行
if __name__ == "__main__":
    query = "大規模言語モデルを実務に導入する際、最も注意すべきセキュリティリスクを3点挙げてください。"
    print(f"質問: {query}\n")
    answer = ask_gemma(query)
    print(f"回答:\n{answer}")

このスクリプトでは repeat_penalty=1.1 を設定しています。 Gemma 4は賢い反面、同じフレーズを繰り返す癖が時折見られるため、このわずかなペナルティが「実用的な回答」を得るための隠し味になります。 また、APIキーを必要としないローカル実行のため、機密情報の含まれる社内ドキュメントの要約など、SIer時代にセキュリティ審査で苦労したような案件でも、これなら即決で導入可能です。

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

エラー内容原因解決策
error loading model: unknown tensor namellama.cppが古く、Gemma 4の新テンソルを認識できないgit pull して再ビルドする
out of memoryVRAM不足。26BモデルはQ4でも16GB以上必要-ngl の値を減らして一部をCPUに逃がすか、より小さいE2Bモデルを検討する
回答が途中で切れるmax_tokens が不足している、または stop シーケンスの設定ミスmax_tokens を増やす。テンプレートに忠実なタグを設定する

次のステップ

ここまでで、最新のGemma 4をローカルで自在に操る環境が整いました。 次に挑戦すべきは、このローカルLLMを「自分だけの知能」に育てる「RAG(検索拡張生成)」の構築です。

具体的には、社内のWikiや過去のSlackログをベクタ化し、今回作ったPythonスクリプトとLangChainなどで組み合わせることで、社内の事情に精通した「最強のアシスタント」を作ることができます。 Gemma 4の26Bモデルは、この規模のタスクをこなすのに十分な読解力を持っています。

また、RTX 4090を2枚挿しているような私と同じ物好きな方は、ぜひ「モデルの並列実行」にも挑んでみてください。 llama.cppはマルチGPUにも対応しており、複数のリクエストを同時に捌くサーバー化も可能です。 ローカルLLMの真価は、APIコストを気にせず、24時間365日フル稼働させてこそ発揮されます。

よくある質問

Q1: E2Bモデルと26Bモデル、どちらを使うべきですか?

簡単なチャットや単発の翻訳、要約なら軽量なE2B(約20億パラメータ)で十分です。レスポンスが0.1秒レベルで返ってきます。一方で、プログラミング支援や論理的な推論、複雑な指示への追従が必要な実務用途なら、圧倒的に26Bモデルをお勧めします。

Q2: Windows環境でもビルドできますか?

可能です。Visual Studio 2022のビルドツールとCMakeをインストールし、PowerShellから同様の手順でビルドできます。ただし、パスの通りやすさやライブラリの依存関係を考えると、WSL2上のUbuntuで構築したほうが、将来的なトラブル(特にライブラリ競合)は少なくなります。

Q3: Unsloth版と通常のGGUFは何が違うのですか?

Unsloth版は、学習時のレイヤー特性に基づいた「最適な重みの配置」と「KVキャッシュの最適化」が施されています。特に最新アーキテクチャへの対応が本家よりも早く、メモリ効率や推論の正確さにおいて目に見える差が出ます。私は常にUnsloth版を優先して使っています。


あわせて読みたい