モデル学習ガイド4:SFT学習ガイド
SFT(教師ありファインチューニング)の本質は「指示整合」であり、つまり、モデルが学習すべきことは、ユーザーがこのように尋ねた場合に、どのような形式とトーンで回答すべきかということです。
レンダリング中...
PT(増分事前学習)という「知識を注入する」手段を習得した後、**SFT(教師ありファインチューニング)** は実務上最も重要な段階です。その本質は **「指示への適合」**、つまりモデルに、ユーザーがこう尋ねたときに、どのような形式と口調で回答すべきかを学習させることです。
## SFT の核心的な準備
### 1. どのようなデータを用意すべきか?
SFT に必要なのは **QA 質疑応答ペア**(または Instruction データ)です。
**形式:** 通常は `JSONL` です。
**内容構造:**
- `instruction`: ユーザーの指示/質問(例:「今日はとても悲しい」)。
- `input`: オプションの背景情報(例:「ユーザーは失業したばかり」)。
- `output`: モデルの標準的な回答(例:「抱きしめてあげるよ、今の気持ちはとてもつらいと思う…」)。
**データ量:** 伴奏型ビジネスでは通常、**500 - 5,000 件** の高品質で、特定のペルソナに合致した多岐にわたる対話データが必要です。
### 2. どのようなソフトウェアとフレームワークが必要か?
**ハードウェア:** 24GB 以上のメモリを持つ GPU(例:3090/4090/A100)。
**システム:** Linux (Ubuntu 20.04+) が最も効果的です。Windows の場合は WSL2 が必要です。
**コアフレームワーク:**
- `PyTorch`: 深層学習の基盤。
- `Transformers`: HuggingFace 製、モデルのロードとトレーニングのコアライブラリ。
- `PEFT`: LoRA などの軽量なファインチューニング用のライブラリ。
- `DeepSpeed`: 複数 GPU 並列処理とメモリ最適化。
## 2つのスキームの操作手順
### 1. LLaMA-Factory
これは現在最も推奨される**実務スキーム**であり、柔軟性と使いやすさのバランスが取れています。
1. **データ登録:** `sft_data.json` を `data/` フォルダに配置します。`data/dataset_info.json` を修正し、データセットの説明を追加します。
2. **トレーニング開始(コマンドラインモード):** `sft.yaml` 設定ファイルを作成します。
```YAML
stage: sft # SFT 段階に設定
model_name_or_path: qwen/Qwen2.5-7B
preprocessing_num_workers: 8
finetuning_type: lora # LoRA を採用して効率を向上
template: qwen # 必須!基盤モデルと一致していること
dataset: my_sft_data # 登録したデータセット名
output_dir: ./sft_output # モデルの重み保存場所
per_device_train_batch_size: 4
gradient_accumulation_steps: 4
learning_rate: 5e-5 # SFT の学習率は PT より高いことが一般的
num_train_epochs: 3.0
plot_loss: true # Loss 曲線図を生成
```
3. **コマンド実行:**
```Bash
llamafactory-cli train sft.yaml
```
4. **モデルのマージ:** トレーニングで得られたのは LoRA の重みです。`llamafactory-cli export` 設定ファイルを使用して、元のモデルとマージします。
### 2. 自分でコードを書く
これは最もコアな方法で、`Transformers` ライブラリの `SFTTrainer` に基づいています。
1. **モデルとトークナイザーのロード:**
```Python
from trl import SFTTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig
model_id = "qwen/Qwen2.5-7B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token # パディング文字を設定
```
2. **LoRA パラメータの設定:**
```Python
peft_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules="all-linear",
task_type="CAUSAL_LM"
)
```
3. **トレーナーの定義:**
```Python
args = TrainingArguments(
output_dir="./my_sft_model",
per_device_train_batch_size=4,
max_steps=1000,
learning_rate=5e-5,
fp16=True # 半精度トレーニングを有効にしてメモリを節約
)
trainer = SFTTrainer(
model=model_id,
args=args,
train_dataset=my_dataset, # 以前に処理した Dataset オブジェクト
dataset_text_field="text", # データセット内の対応するフィールドを指定
peft_config=peft_config,
max_seq_length=1024,
)
```
4. **トレーニング開始:**
```Python
trainer.train()
trainer.save_model()
```
## まとめと提案
- **効率を追求する場合:** **LLaMA-Factory** を直接使用してください。会話テンプレート(Chat Template)の問題を解決してくれます。*注意:SFT トレーニングでは、会話テンプレート(例:`<|im_start|>` などのタグ)を間違えると、モデルは完全に無能になります。*
- **CPU しか持っていない場合、またはコードを書きたくない場合:** **阿里百煉** を選択してください。
- **論文を書いている場合、または学術研究を行っている場合:** 自分でコードを書く(スキーム 3)と、Loss 関数を自由に修正できます。END
コメント
ログインしてコメントを閲覧・投稿してください
ログインへ