trl-training について
言語モデル開発者向けのトレーニングスキルです。TRL による教師ありファインチューニング、選好最適化、オンライン強化学習、蒸留、報酬モデル学習と、設定やコマンドラインでの実行方法を扱います。
主な機能
- 01SFT、DPO、GRPO などの Trainer
- 02選好学習と報酬モデル学習
- 03シーケンスのパッキングとパディング削減
- 04LoRA 設定のサポート
- 05TRL コマンドラインでの学習
活用シーン
- 01会話データでの言語モデルのファインチューニング
- 02選好ペアを使ったモデル学習
- 03独自の報酬関数によるオンライン強化学習
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ huggingface/ skills --skill trl-trainingインストール後、Claude Code で/trl-trainingを入力して読み込まれたか確認します。
詳細
TRL
各メソッドは、*Trainer クラスと *Config データクラスを組み合わせて使用します。設定クラスは transformers.TrainingArguments を継承しているため、そのすべての引数を任意のトレーナー設定で使用できます。
| トレーナー | データセットの種類 |
|---|---|
SFTTrainer | 言語モデリングまたはプロンプトと補完 |
DPOTrainer | 選好(選択・拒否のペア) |
GRPOTrainer | プロンプトのみ+報酬関数 |
DistillationTrainer | プロンプトのみ+教師モデル(オンポリシー蒸留) |
KTOTrainer | ペアなしの選好(サンプルごとのブール値ラベル) |
RewardTrainer | 選好(選択・拒否のペア)。ポリシーではなく、スカラー報酬モデルを学習します |
ほかにも多くのトレーナー(OnlineDPO、ORPO、CPO、GKD など)が、不安定な API とともに trl.experimental にあります:https://huggingface.co/docs/trl/experimental_overview
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer
trainer = SFTTrainer(
model="Qwen/Qwen2.5-0.5B", # model ID or a PreTrainedModel instance
args=SFTConfig(output_dir="Qwen2.5-0.5B-SFT"),
train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()
model には文字列を渡し、from_pretrained を自分で呼び出すのではなく、model_init_kwargs(例:{"dtype": "bfloat16", "attn_implementation": "kernels-community/flash-attn2"})を通じて読み込み時の引数を指定します。トークナイザー/プロセッサーはモデルから推定されます。異なる場合に限り、processing_class を渡してください。LoRA を使う場合は、peft_config=LoraConfig(...) を渡します。
データセット形式
会話形式:{"messages": [{"role": ..., "content": ...}]}(言語モデリング)または {"prompt": [...], "completion": [...]}。チャットテンプレートは自動的に適用されるため、自分で適用しないでください。追加の列も使用できます。GRPO はそれらを報酬関数に渡します。参考:https://huggingface.co/docs/trl/dataset_formats
SFT:重要なフィールド
SFTConfig(
max_length=1024, # truncation length; None disables truncation
packing=True, # pack sequences into max_length blocks: fewer pad tokens, higher throughput
padding_free=True, # flatten batch, no padding; requires FlashAttention; implied by packing
use_liger_kernel=True, # fused Liger kernels, reduces peak memory
assistant_only_loss=True, # loss only on assistant turns (conversational datasets)
)
GRPO:オンライン RL
def reward_len(completions, **kwargs):
return [-abs(20 - len(c[0]["content"])) for c in completions]
trainer = GRPOTrainer(
model="Qwen/Qwen2.5-0.5B-Instruct",
reward_funcs=reward_len, # or a list; rewards are summed
args=GRPOConfig(output_dir="Qwen2.5-0.5B-GRPO", max_completion_length=512),
train_dataset=load_dataset("trl-lib/DeepMath-103K", split="train"),
)
報酬関数は、キーワード引数 prompts、completions、completion_ids、trainer_state と、データセットのすべての追加列を受け取って呼び出されます。使用しない引数は **kwargs で受け取ってください。補完ごとに1つの報酬を返す list[float] を返します。会話データでは、completions は文字列ではなく、メッセージリストのリストです。
生成バッチサイズは per_device_train_batch_size × num_processes × steps_per_generation です(または generation_batch_size を直接設定します)。また、num_generations(デフォルトは8)で割り切れる必要があります。通常、ボトルネックとなるのは生成です。use_vllm=True で vLLM を有効にします。vllm_mode="colocate" はトレーニング用 GPU を共有します(vllm_gpu_memory_utilization でサイズを調整します)。vllm_mode="server" は別の trl vllm-serve --model <model_id> を使用します。
AsyncGRPOTrainer(trl.experimental.async_grpo)は、生成とトレーニングを切り離した同じアルゴリズムを実装します。バックグラウンドワーカーが vLLM サーバーから補完をストリーミングする間にトレーニングループがそれらを消費するため、交互に実行するのではなく、両者を並行して進められます。
CLI
フラグは設定フィールドに対応しています:trl sft --model_name_or_path Qwen/Qwen2.5-0.5B --dataset_name trl-lib/Capybara。YAML は --config で指定します。分散実行用のプリセットは --accelerate_config zero3 で指定します(Python スクリプトの場合:accelerate launch train.py)。