ml-fine-tuning について
事前学習済みモデルを新しいタスク、分野、振る舞いに適応させるスキルです。微調整と他の手法の比較、データセットの準備、LoRA、QLoRA、選好調整などの適用を支援します。
主な機能
- 01適応手法の比較
- 02学習データの準備と分割
- 03QLoRA と PEFT の指針
- 04SFT と DPO の学習パターン
- 05埋め込みモデルの微調整
- 06安定性と忘却の監視
活用シーン
- 01プロンプト、RAG、学習から手法を選択
- 02指示チューニング用データの準備
- 03アダプターによる LLM の微調整
- 04検索向け埋め込みの適応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ml-fine-tuningインストール後、Claude Code で/ml-fine-tuningを入力して読み込まれたか確認します。
詳細
ML ファインチューニング
概要
このスキルは、事前学習済みモデルを新しいタスク、ドメイン、スタイル、指示、モダリティ、制約に適応させる際に使用します。ファインチューニングが常に最初に取るべき手段とは限りません。大規模な基盤モデルを学習する前に、プロンプト、検索拡張生成、特徴抽出、従来型のヘッド、小型のタスク特化モデルを比較してください。
適応方法の選択
| 方法 | 使用する状況 | トレードオフ |
|---|---|---|
| プロンプト/システム指示 | 挙動の変更が単純で、コンテキストに収まる場合 | 学習コストは不要ですが、持続性と制御性には限界があります |
| RAG | 変化する、または引用が必要な事実/ドメイン知識が必要な場合 | 検索品質、チャンク分割、グラウンディングの評価が必要です |
| 特徴抽出+ヘッド | ラベル付きデータセットが小さく、事前学習済みの埋め込みが強力な場合 | 効率的ですが、深い適応には限界があります |
| 部分的なファインチューニング | 限られた計算資源でドメイン適応が必要な場合 | レイヤーを慎重に選ぶ必要があります |
| フルファインチューニング | 大規模なデータセット、高いタスク特化性、十分な計算資源がある場合 | コストと破滅的忘却のリスクが最も高くなります |
| LoRA/アダプター/PEFT | 効率的な適応や、多くのバリエーションが必要な場合 | 容量に多少の制限があり、対象モジュールの選択が重要です |
| QLoRA | 制約のある GPU で大規模な LLM をファインチューニングする場合 | 量子化とオプティマイザーの選択が安定性に影響します |
| 選好チューニング/RLHF/DPO | 選好に合わせた挙動の調整が必要な場合 | 報酬/選好データの品質が結果を大きく左右します |
| 蒸留 | より小型で高速なデプロイ可能モデルが必要な場合 | 教師モデルの品質と、代表性のあるデータが必要です |
データセットの準備
ファインチューニングの品質は、通常、データの品質によって決まります。重複を除去し、破損したサンプルを削除し、安全でないコンテンツや無関係なコンテンツをフィルタリングし、タスクのバランスを取り、ラベルを標準化して、評価用のホールドアウトデータを保持してください。指示チューニングでは、一貫したスキーマを使用し、ベースモデルに合ったチャットテンプレートを使用してください。分類では、ラベルの定義とアノテーター間の一致度を確認してください。検索/埋め込みのファインチューニングでは、難しいネガティブ例を抽出し、偽陰性を避けてください。
サンプル間に相関がある場合は、エンティティ、時刻、ソース、またはドキュメントごとにデータを分割してください。類似した重複、プロンプトのバリエーション、同じドキュメントのチャンク、生成された言い換えが、学習/検証/テストの境界をまたぐことは決して避けてください。生成タスクでは、代表的な難しいケースを含む、人間が確認できる検証セットを用意してください。
QLoRA と PEFT(Hugging Face の手順)
QLoRA はベースモデルを 4 ビットで凍結したまま、小さな低ランクアダプターを学習することで、GPU VRAM の使用量を大幅に削減します。
1. 4 ビットのベースモデルを初期化する(BitsAndBytesConfig)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
# Configure 4-bit quantization details
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4", # Normalized Float 4 (optimal for zero-mean normal weights)
bnb_4bit_compute_dtype=torch.bfloat16 # Compute in BF16 for training stability
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto"
)
2. LoRA パラメーターを設定してモデルを準備する
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
# Prepare frozen model for quantized adapter training
model = prepare_model_for_kbit_training(model)
# Define Low-Rank Adaptation (LoRA) Config
peft_config = LoraConfig(
r=16, # Rank dimension (typically 8, 16, 32, or 64)
lora_alpha=32, # Scaling factor (usually 2 * rank)
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"
)
# Wrap base model with LoRA adapters
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
TRL(Transformer Reinforcement Learning)の学習設定
TRL は、教師ありファインチューニング用の SFTTrainer や、直接選好最適化用の DPOTrainer などのラッパーを提供します。
1. 教師ありファインチューニング(SFTTrainer)
from trl import SFTTrainer
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
logging_steps=10,
max_steps=500,
fp16=False,
bf16=True, # Optimal on Ampere/Hopper architecture GPUs
optim="paged_adamw_8bit" # Page state out to host memory to prevent OOMs
)
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_config,
dataset_text_field="text",
max_seq_length=512,
tokenizer=tokenizer,
args=training_args
)
# trainer.train()
2. 直接選好最適化(DPOTrainer)
DPO は、個別の報酬モデルを必要とせず、好ましい出力と好ましくない出力のペアを使ってモデルを直接学習します。
from trl import DPOTrainer
dpo_trainer = DPOTrainer(
model=model,
ref_model=None, # TRL will implicitly handle ref_model under PEFT by disabling adapters
args=training_args,
beta=0.1, # Temperature parameter for DPO loss (scales difference from reference policy)
train_dataset=preference_dataset,
tokenizer=tokenizer,
max_length=512,
max_prompt_length=256
)
# dpo_trainer.train()
SentenceTransformers のカスタム埋め込みモデルのファインチューニング
埋め込みのファインチューニングでは、検索を多用する(RAG)アプリケーション向けに、カスタムのベクトル空間を作成します。
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
model = SentenceTransformer("all-MiniLM-L6-v2")
# Create positive pairs (e.g., query and matching document)
train_examples = [
InputExample(texts=["How to initialize FSDP in PyTorch?", "Use FullyShardedDataParallel wrapper..."]),
InputExample(texts=["What is QLoRA?", "QLoRA trains adapters over a frozen 4-bit base model..."])
]
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
# MultipleNegativesRankingLoss treats other pairs in the batch as implicit negative examples
train_loss = losses.MultipleNegativesRankingLoss(model=model)
# model.fit(
# train_objectives=[(train_dataloader, train_loss)],
# epochs=3,
# warmup_steps=100
# )
学習の安定性
ファインチューニングでは、控えめな学習率を使用してください。ウォームアップが有効な場合もあります。学習損失と検証損失、タスク指標、生成品質、過学習を監視してください。LLM では、フォーマットの変化、冗長さの変化、拒否動作の劣化、幻覚、ツール使用の劣化、安全性の問題に注意してください。不安定な場合は勾配クリッピングを使用し、指示チューニングでラベルが正しくマスクされていることを検証してください。
新しいデータでの性能が向上する一方、モデルが汎用能力を失うと、破滅的忘却が発生します。学習率を下げる、エポック数を減らす、複数ドメインのデータを混ぜる、リプレイ例を使う、フルファインチューニングの代わりにアダプターを使う、正則化を行う、またはマルチタスクのバランスを取ることで軽減できます。
ソース
- Hugging Face Transformers のドキュメント:https://huggingface.co/docs/transformers
- Hugging Face PEFT のドキュメント:https://huggingface.co/docs/peft
- Hugging Face TRL のドキュメント:https://huggingface.co/docs/trl
- Hugging Face Diffusers のトレーニングドキュメント:https://huggingface.co/docs/diffusers/training/overview
- Sentence Transformers のドキュメント:https://www.sbert.net/
- Ray と Accelerate の分散トレーニングドキュメント:https://docs.ray.io/ and https://huggingface.co/docs/accelerate