【2026年最新】LLMファインチューニング実践ガイド:LoRA・QLoRA・フルファインチューニングの使い分け

Tech Trends AI
- 2 minutes read - 369 wordsはじめに
LLM(大規模言語モデル)のファインチューニングは、汎用モデルを特定のドメインやタスクに最適化するための重要な技術です。2026年現在、パラメータ効率の良いファインチューニング手法(PEFT)の発展により、比較的少ないリソースでも高品質な専用モデルを構築できるようになりました。
本記事では、ファインチューニングの各手法を比較し、実践的なトレーニング手順を解説します。
ファインチューニングが必要なケース
RAGとファインチューニングの使い分け
| 要件 | RAG | ファインチューニング |
|---|---|---|
| 最新情報の反映 | ◎ | △ |
| 出力スタイルの変更 | △ | ◎ |
| 専門用語・表現の習得 | ○ | ◎ |
| 特定タスクの精度向上 | ○ | ◎ |
| 推論速度 | △(検索オーバーヘッド) | ◎ |
| 初期コスト | 低 | 高 |
| データ更新の容易さ | ◎ | △ |
ファインチューニングに適したシナリオ
- 特定の出力形式: 常に特定のフォーマットで出力させたい
- 専門ドメイン: 医療、法律、金融など専門知識の強化
- ブランドトーン: 企業固有の文体やトーンの反映
- 低レイテンシ要件: RAGの検索オーバーヘッドを避けたい
- コスト削減: 小さなモデルでタスク特化させAPI費用を削減
主要なファインチューニング手法
手法の比較
| 手法 | GPU メモリ | 学習パラメータ | 精度 | 速度 |
|---|---|---|---|---|
| フルFT | 非常に多い | 全パラメータ | ◎ | 遅い |
| LoRA | 少ない | 0.1-1% | ○〜◎ | 速い |
| QLoRA | 非常に少ない | 0.1-1%(量子化) | ○ | 速い |
| Prefix Tuning | 少ない | プレフィックスのみ | △〜○ | 非常に速い |
LoRA(Low-Rank Adaptation)
LoRAは、元のモデル重みを凍結し、低ランクの行列を追加して学習する手法です。
原理:
元の重み行列 W (d × d) を凍結
低ランク行列 A (d × r) と B (r × d) を学習(r << d)
出力 = W × x + A × B × x
メリット:
- GPUメモリ消費が大幅に少ない
- 学習が高速
- 複数のLoRAアダプターを切り替え可能
- 元のモデルを破壊しない
QLoRA
QLoRAは、LoRAをさらにメモリ効率化した手法です。ベースモデルを4bit量子化した状態でLoRAを適用します。
特徴:
- 4bit NF4量子化によるメモリ削減
- ダブル量子化で更なる効率化
- Paged Optimizerでメモリスパイクを抑制
- 70Bモデルも1台のGPU(A100 80GB)でファインチューニング可能
実践:LoRAファインチューニング
環境準備
pip install transformers peft trl datasets accelerate bitsandbytes
データセットの準備
from datasets import Dataset
# 学習データの形式
train_data = [
{
"instruction": "以下の文章を要約してください",
"input": "量子コンピューティングは...(長文)",
"output": "量子コンピューティングは...(要約)"
},
# ... 1000件以上推奨
]
dataset = Dataset.from_list(train_data)
dataset = dataset.train_test_split(test_size=0.1)
LoRA学習コード
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer, SFTConfig
# モデル読み込み(QLoRA用4bit量子化)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="bfloat16",
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct",
quantization_config=bnb_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
tokenizer.pad_token = tokenizer.eos_token
# LoRA設定
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=[
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 13,631,488 || all params: 8,043,901,440 || trainable%: 0.17
# トレーニング
training_config = SFTConfig(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
lr_scheduler_type="cosine",
warmup_ratio=0.1,
logging_steps=10,
save_strategy="epoch",
bf16=True,
max_seq_length=2048,
)
trainer = SFTTrainer(
model=model,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
args=training_config,
tokenizer=tokenizer,
)
trainer.train()
trainer.save_model("./my-lora-adapter")
学習済みアダプターの利用
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct",
device_map="auto",
)
model = PeftModel.from_pretrained(base_model, "./my-lora-adapter")
# マージして単体モデルとして保存
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged-model")
ベストプラクティス
データ品質
| 要素 | 推奨 | 注意点 |
|---|---|---|
| データ量 | 1,000件以上 | 品質 > 量 |
| データ品質 | 人手で検証済み | ノイズは精度劣化の原因 |
| 多様性 | バリエーション確保 | 偏りはバイアスになる |
| フォーマット | 統一されたinstruction形式 | 不統一で学習不安定 |
ハイパーパラメータガイド
| パラメータ | 推奨範囲 | 備考 |
|---|---|---|
| LoRA rank (r) | 8-64 | タスク複雑度に応じて |
| lora_alpha | r × 2 | 一般的な設定 |
| learning_rate | 1e-4 ~ 3e-4 | QLoRAでは2e-4が安定 |
| epochs | 1-5 | 過学習に注意 |
| batch_size | 4-16 | GPUメモリに応じて |
GPU別対応モデルサイズ
| GPU | VRAM | フルFT | QLoRA |
|---|---|---|---|
| RTX 4090 | 24GB | ~3B | ~13B |
| A100 40GB | 40GB | ~7B | ~30B |
| A100 80GB | 80GB | ~13B | ~70B |
| H100 80GB | 80GB | ~13B | ~70B |
まとめ
LLMファインチューニングの要点:
- 手法選択: 用途とリソースに応じてLoRA/QLoRA/フルFTを選択
- データ品質: 高品質なデータが結果を決定する
- ハイパーパラメータ: 小さく始めて段階的に調整
- 評価: 定量・定性の両面で継続的に評価
- コスト意識: QLoRAで効率的にファインチューニング