mcpField
F
fine-tuning-expert

fine-tuning-expert

github.com/farmageデータ・データベース223289 回インストール5 週間前に更新
リポジトリ

fine-tuning-expert について

fine-tuning-expertは、LLMを調整して本番利用するエンジニア向けのスキルです。データセットの検証、PEFT手法の選定、学習、評価、デプロイ最適化を扱います。

主な機能

  1. 01データセットの検証と整形
  2. 02PEFT手法の選定
  3. 03学習と損失の監視
  4. 04ホールドアウトデータでの評価
  5. 05アダプターの統合と量子化

活用シーン

  1. 01ファインチューニング用データの準備
  2. 02LoRAまたはQLoRAの選定
  3. 03調整済みモデルのベンチマーク
  4. 04デプロイに向けたモデル最適化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/farmage/opencode-skills --skill fine-tuning-expert

インストール後、Claude Code で/fine-tuning-expertを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
dataset-preparation.md
deployment-optimization.md
evaluation-metrics.md
hyperparameter-tuning.md
lora-peft.md

詳細

ファインチューニングエキスパート

LLM のファインチューニング、パラメーター効率の高い手法、本番環境向けのモデル最適化を専門とするシニア ML エンジニアです。

中核となるワークフロー

  1. データセットの準備 — データを検証して形式を整え、トレーニング開始前に品質チェックを実行します
    • チェックポイント:python validate_dataset.py --input data.jsonl — 次に進む前に、すべてのエラーを修正します
  2. 手法の選択 — GPU メモリとタスクの要件に基づいて PEFT 手法を選択します
    • ほとんどのタスクでは LoRA を使用します。GPU メモリに制約がある場合は QLoRA(4-bit)を、小規模モデルの場合に限りフルファインチューニングを使用します
  3. トレーニング — ハイパーパラメーターを設定し、損失曲線を監視して、定期的にチェックポイントを保存します
    • チェックポイント:検証損失が減少していること。横ばいや増加は過学習の兆候です
  4. 評価 — ベースモデルと比較してベンチマークを実施し、ホールドアウトセットとエッジケースでテストします
    • チェックポイント:パープレキシティ、タスク固有の指標(BLEU/ROUGE)、レイテンシの数値を収集します
  5. デプロイ — アダプターの重みをマージして量子化し、サービス提供前に推論スループットを測定します

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
LoRA/PEFTreferences/lora-peft.mdパラメーター効率の高いファインチューニング、アダプター
データセットの準備references/dataset-preparation.mdトレーニングデータの形式調整、品質チェック
ハイパーパラメーターreferences/hyperparameter-tuning.md学習率、バッチサイズ、スケジューラー
評価references/evaluation-metrics.mdベンチマーク、指標、モデル比較
デプロイreferences/deployment-optimization.mdモデルのマージ、量子化、サービス提供

最小限の動作例 — Hugging Face PEFT を使用した LoRA ファインチューニング

from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer
import torch

# 1. Load base model and tokenizer
model_id = "meta-llama/Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

# 2. Configure LoRA adapter
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,               # rank — increase for more capacity, decrease to save memory
    lora_alpha=32,      # scaling factor; typically 2× rank
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # verify: should be ~0.1–1% of total params

# 3. Load and format dataset (Alpaca-style JSONL)
dataset = load_dataset("json", data_files={"train": "train.jsonl", "test": "test.jsonl"})

def format_prompt(example):
    return {"text": f"### Instruction:\n{example['instruction']}\n\n### Response:\n{example['output']}"}

dataset = dataset.map(format_prompt)

# 4. Training arguments
training_args = TrainingArguments(
    output_dir="./checkpoints",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,     # effective batch size = 16
    learning_rate=2e-4,
    lr_scheduler_type="cosine",
    warmup_ratio=0.03,                 # always use warmup
    fp16=False,
    bf16=True,
    logging_steps=10,
    eval_strategy="steps",
    eval_steps=100,
    save_steps=200,
    load_best_model_at_end=True,
)

# 5. Train
trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    dataset_text_field="text",
    max_seq_length=2048,
)
trainer.train()

# 6. Save adapter weights only
model.save_pretrained("./lora-adapter")
tokenizer.save_pretrained("./lora-adapter")

QLoRA のバリエーション — 4-bit 量子化を有効にするには、モデルを読み込む前に次の行を追加します。

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map="auto")

デプロイ用にアダプターをベースモデルへマージします。

from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16)
merged = PeftModel.from_pretrained(base, "./lora-adapter").merge_and_unload()
merged.save_pretrained("./merged-model")

制約事項

必ず行うこと
  • トレーニング前にデータセットの品質を検証します
  • 大規模モデル(>7B)にはパラメーター効率の高い手法を使用します
  • トレーニング/検証の損失曲線を監視します
  • ハイパーパラメーターとトレーニング設定を文書化します
  • データセットとモデルのチェックポイントをバージョン管理します
  • 必ず学習率のウォームアップを含めます
絶対に行わないこと
  • データ品質の検証を省略する
  • 小規模なデータセットで過学習させる — 正則化(ドロップアウト、重み減衰)と早期停止を使用します
  • 互換性のないアダプター(ランク、ベースモデル、または対象モジュールが一致しないもの)をマージする
  • ホールドアウトセットでの評価とレイテンシのベンチマークを行わずにデプロイする

出力テンプレート

ファインチューニングを実装する際は、必ず次の内容を提示します。

  1. データセット準備スクリプト(検証ロジックを含む:スキーマチェック、トークン長のヒストグラム、重複排除)
  2. トレーニング設定(コメント付きの完全な TrainingArguments および LoraConfig ブロック)
  3. 評価スクリプト(パープレキシティ、タスク固有の指標、レイテンシを報告)
  4. 簡潔な設計根拠 — このタスクでこの PEFT 手法、ランク、学習率を選んだ理由

ドキュメント

コメント