AI活用 2026.05.22

Gemma 4をLoRAでファインチューニング|Ollama運用までの実装パイプライン

Gemma 4 LoRA ファインチューニング Ollama 実装パイプライン

Gemma 4の汎用性能は高いものの、業界特有の用語、自社サービスの仕様、社内マニュアルの慣習表現には素のままでは追従しません。社内アシスタントとして本気で使うなら、自社データでのファインチューニングが選択肢になります。幸いGemma 4は Apache 2.0 でライセンスされ、LoRA / QLoRA + Unsloth + 1枚のコンシューマGPUで1時間程度の現実的な学習工程が確立されています。

本記事では、Gemma 4のファインチューニングを行い、GGUF形式に変換し、カスタムModelfileを書いてOllamaで実運用するまでの実装パイプラインを発展的に解説します。Gemma 4のモデル選定論はGemma 4のサイズ別徹底比較|E2B/E4B/26B MoE/31B Denseの選び方と性能で扱っているので、本記事ではモデルが選定済みである前提で進めます。

なぜファインチューニングするのか

RAGとファインチューニングの使い分け

業務にAIを組み込む際、最初の選択肢はRAG(Retrieval-Augmented Generation)です。社内ドキュメントをベクトルDBに入れて検索結果を文脈として渡す手法で、データ追加が容易で、変更頻度の高い知識に向きます。

一方ファインチューニングは「モデル自身に振る舞い・口調・専門用語を覚えさせる」アプローチです。RAGで足りないのは以下のような場面です。

  • 業界特有の言い回し・略語を一貫して使ってほしい
  • 定型業務での回答フォーマットを強制したい(請求書チェック・与信判定など)
  • 頻出する特定タスクでRAG前提でも精度が安定しない
  • 関数呼び出しの引数フォーマットを社内仕様に合わせたい

多くの中小企業は「RAGを先に整備して、足りない部分だけファインチューニングで補う」のが現実解です。

LoRAとQLoRAの違い

LoRA(Low-Rank Adaptation)

LoRAは、モデル本体の重みを凍結し、低ランク行列を差し込んで学習する手法です。学習対象のパラメータが本体の数%まで圧縮されるため、VRAMと時間を大幅に節約できます。Gemma 4 E4Bなら、コンシューマGPUで現実的に学習できます。

QLoRA(Quantized LoRA)

QLoRAは、本体モデルを4bit量子化した状態でLoRA学習する手法です。VRAM消費がさらに減り、Gemma 4 26B MoE クラスでもRTX 4090(24GB)で学習可能になります。量子化による精度低下は実用上ほぼ問題なしと評価されており、リソース制約のある環境では QLoRA が事実上の標準です。

Gemma 4で推奨される設定

Unslothドキュメントで推奨されているのは、「E4Bの QLoRA」を中心とした構成です。E2B LoRA より E4B QLoRA のほうが、より大きなベースモデルの恩恵を受けつつ、量子化による精度低下が最小限という整理がなされています。

パイプライン全体像

本記事で扱うのは以下の5ステージのパイプラインです。

  1. データ準備:学習データセットの設計とフォーマット変換
  2. LoRA / QLoRA学習:Unsloth + Hugging Face Transformersで学習
  3. LoRAマージ:PEFTでLoRAアダプタをベースモデルにマージ
  4. GGUF変換:llama.cppの変換スクリプトでGGUF形式に変換
  5. Modelfile作成・Ollama登録:Modelfileを書いてollama createで取り込み

ステージ1:データ準備

データセット設計

業務特化型のチューニングでは、入出力ペアを200〜1000件程度用意するのが現実的な出発点です。少なすぎると過学習し、多すぎても1〜2エポック以内なら効果は限定的です。質を優先します。

フォーマットは Hugging Face datasets 互換のJSONLが扱いやすいです。

{"messages": [
  {"role": "system", "content": "あなたは株式会社XYZの社内ヘルプデスクAIです。"},
  {"role": "user", "content": "経費精算の締め日はいつですか?"},
  {"role": "assistant", "content": "毎月20日が締め日です。21日以降の申請は翌月扱いになります。"}
]}
{"messages": [
  {"role": "system", "content": "あなたは株式会社XYZの社内ヘルプデスクAIです。"},
  {"role": "user", "content": "有休の取得手順は?"},
  {"role": "assistant", "content": "勤怠システムから事前申請してください。理由欄は任意です。"}
]}

データ品質の3原則

  • 一貫性:回答の長さ・口調・フォーマットを揃える
  • 多様性:同じ質問の言い換え、関連トピックを混ぜる
  • 誤りを学ばせない:間違った回答がデータに含まれると、AIはそれを再現する

ステージ2:LoRA / QLoRA学習(Unsloth)

環境セットアップ

Unslothは、Hugging Face Transformersをラップして学習速度2〜5倍・VRAM節約を実現するライブラリです。Pythonで以下のように準備します。

# Python 3.10〜3.12 推奨。venv作成後:
pip install unsloth
pip install --upgrade --no-deps trl peft accelerate bitsandbytes

学習スクリプトの最小構成

以下はGemma 4 E4BをQLoRAで学習する最小コードのイメージです(コードは概念図、実際のAPIは Unsloth ドキュメントの最新版を参照してください)。

from unsloth import FastLanguageModel
from datasets import load_dataset
from trl import SFTTrainer

# ベースモデルロード(4bit量子化)
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/gemma-4-e4b-it",
    max_seq_length = 4096,
    load_in_4bit = True,
)

# LoRAアダプタ追加
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    target_modules = ["q_proj","k_proj","v_proj","o_proj",
                      "gate_proj","up_proj","down_proj"],
)

# データセット
dataset = load_dataset("json", data_files = "data.jsonl", split = "train")

# トレーナー
trainer = SFTTrainer(
    model = model, tokenizer = tokenizer,
    train_dataset = dataset, max_seq_length = 4096,
    args = dict(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        num_train_epochs = 2, learning_rate = 2e-4,
        fp16 = True, logging_steps = 10,
        output_dir = "outputs",
    ),
)
trainer.train()
model.save_pretrained("lora-out")

学習設定のチューニング指針

  • r(LoRAランク):8〜32が現実的。小さいほど過学習に強いが、表現力が低下
  • learning_rate:QLoRA は 2e-4 前後が出発点
  • num_train_epochs:1〜3エポック。多すぎると過学習で生成品質が劣化
  • batch_size + gradient_accumulation:VRAMが許す範囲で実効バッチサイズ8〜16を目指す
  • max_seq_length:データの中央値の1.5倍程度。長く取りすぎるとVRAMを圧迫

ステージ3:LoRAアダプタのマージ

LoRA学習結果は「アダプタ」として保存されます。Ollamaは現状LoRAアダプタを直接読みにくいため、ベースモデルにマージして単一の重みファイルにします。

from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

base = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-e4b-it", torch_dtype="auto"
)
tokenizer = AutoTokenizer.from_pretrained("google/gemma-4-e4b-it")

merged = PeftModel.from_pretrained(base, "lora-out").merge_and_unload()
merged.save_pretrained("merged-gemma-4-e4b")
tokenizer.save_pretrained("merged-gemma-4-e4b")

ステージ4:GGUF形式への変換

Ollamaが扱う標準形式はGGUFです。llama.cppの変換スクリプトを使ってマージ済みモデルをGGUFに変換します。

# llama.cppリポジトリを取得
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
pip install -r requirements.txt

# fp16のGGUFに変換
python convert_hf_to_gguf.py \
  /path/to/merged-gemma-4-e4b \
  --outfile gemma-4-e4b-finetuned-fp16.gguf

# Q4_K_Mに量子化(軽量・実用バランス)
./build/bin/llama-quantize \
  gemma-4-e4b-finetuned-fp16.gguf \
  gemma-4-e4b-finetuned-Q4_K_M.gguf Q4_K_M

量子化レベルの選び方

  • Q4_K_M:標準。軽量で速い、精度低下は小幅
  • Q5_K_M:精度重視。VRAMを少し多く使う
  • Q6_K:かなり精度重視。生成品質を最優先する場面
  • Q8_0:ほぼ無損失。精度検証や本番運用
  • fp16:最高精度。VRAM消費が大きい

ステージ5:Modelfile作成とOllama登録

Modelfileの基本

Modelfileは、Ollamaに新しいモデルを取り込むための設定ファイルです。GGUFファイルへの参照、システムプロンプト、温度・top_pなどの推論パラメータをまとめて記述します。

# Modelfile
FROM ./gemma-4-e4b-finetuned-Q4_K_M.gguf

# システムプロンプト
SYSTEM """
あなたは株式会社XYZの社内ヘルプデスクAIです。
- 経費・勤怠・有休に関する質問に答える
- 答えられない質問は「人事担当に確認してください」と返す
- 1回の回答は300文字以内
"""

# 推論パラメータ
PARAMETER temperature 0.2
PARAMETER top_p 0.9
PARAMETER stop "<end_of_turn>"

# テンプレート(Gemma 4の対話形式に合わせる)
TEMPLATE """
<start_of_turn>user
{{ .Prompt }}<end_of_turn>
<start_of_turn>model
"""

Ollamaへの登録

# Modelfileから自社モデルを作成
ollama create xyz-helpdesk -f Modelfile

# 動作確認
ollama run xyz-helpdesk "経費精算の締め日は?"

# REST APIから呼び出し
curl http://localhost:11434/api/chat -d '{
  "model": "xyz-helpdesk",
  "messages": [{"role":"user","content":"有休の取得手順は?"}]
}'

これで、社内仕様にチューニング済みのGemma 4が、標準のOllama APIで呼び出せる状態になります。RPAツールや業務システムから呼ぶ際も、通常のローカルLLMと同じインターフェースで使えます。

運用上の注意点

注意1:ライセンス継承を意識する

Gemma 4はApache 2.0ですが、派生モデル(ファインチューニング後)の再配布・社外提供時はライセンス表記の継承が必要です。社内利用にとどめる場合でもライセンスファイルを保管しておくのが安全です。

注意2:機密データを学習に使う場合は隔離環境で

個人情報・取引先情報・契約条件を含むデータで学習する場合、学習環境そのものをオフライン・隔離環境に置きます。Hugging Face Hubに誤ってプッシュすると重大なインシデントになります。.gitignore と学習スクリプトの出力先の管理を徹底します。

注意3:ベース更新時の再学習

Googleが Gemma 4 を更新(マイナーバージョン)した際は、新しいベースで再学習が必要です。データセット・学習スクリプト・Modelfileをバージョン管理しておき、いつでも再学習できる状態にしておきます。

注意4:評価データセットを分離

学習データの一部を「絶対に学習に使わない評価用データ」として切り分けます。学習後にこの評価データで生成品質を測り、過学習や精度劣化を検出します。

ハードウェアごとの実行プラン

Mac mini / MacBook Pro(M3, 24GB〜)

MLX対応のUnslothフォークを使うか、メモリに余裕のあるMac Studioに移行することで E4B QLoRA が可能です。学習自体はWindows/Linux GPU環境のほうがエコシステムが揃っているため、学習はGPUサーバー、Modelfile展開はMac miniという分業も現実的です。

RTX 4090 / 5080(24GB VRAM)

E4B QLoRA はもちろん、26B MoE QLoRAも条件次第で可能。学習バッチサイズを抑え、勾配累積で実効バッチを稼ぐ運用が現実的です。

クラウドGPU(A100 40GB / H100)

短時間で安定して学習したい場合、AWS / Lambda Labs / RunPod など時間貸しGPUを使う選択肢があります。1〜2時間程度の学習なら数百円〜数千円のコストで完了します。データを社外に出すリスクを許容できるかは事前に判断します。

株式会社Sei San Seiの関連サービス

株式会社Sei San Seiは、ローカルLLM・社内データ活用・業務統合をご支援しています。

まとめ:データ品質 × 適切な量子化が成果を決める

本記事のポイントを整理します。

  1. Gemma 4ファインチューニングの実行ラインは LoRA / QLoRA + Unsloth。1枚のコンシューマGPUで1時間程度が現実的
  2. パイプラインは データ準備 → 学習 → マージ → GGUF変換 → Modelfile → Ollama登録 の5ステージ
  3. データ品質3原則は 一貫性・多様性・誤りを学ばせない。件数は200〜1000件、質を優先
  4. 量子化は Q4_K_M が標準、精度重視で Q5/Q6/Q8 を選ぶ
  5. 運用では ライセンス継承・隔離環境・評価データ分離・ベース更新時の再学習 を徹底

本記事は「ファインチューニング」の発展ガイドです。チューニング済みモデルを外部ツールと連携させて実エージェント化する手順はOllama×MCPでローカルAIエージェント構築|機密データを外に出さない業務自動化の実装で扱っています。サイズ選定で迷ったらGemma 4のサイズ別徹底比較を併読してください。

「自社データでローカルLLMをチューニングして業務に組み込みたい」「学習環境の設計から相談したい」――そんな課題をお持ちの方は、お気軽にお問い合わせください。福岡オフィスから、ローカルAI活用の設計と運用定着をご提案します。

ブログ一覧へ戻る

最新記事

まずはお気軽にご相談ください

無料相談・資料請求を受け付けております

お問い合わせはこちら