TRL documentation

SFT Trainer

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.18.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

SFT Trainer

All_models-SFT-blue smol_course-Chapter_1-yellow

概要

TRLは、言語モデルの学習のためのSupervised Fine-Tuning (SFT) Trainerをサポートしています。

SFTTrainerはDiffusionGemmaなどの拡散モデルをネイティブにはサポートしていませんが、block-diffusion SFTの例を参照することで、簡単に拡張して対応させることができます。

このポストトレーニング手法は、Younes Belkada 氏によって提供されました。

クイックスタート

この例では、TRLのSFTTrainerを使用して言語モデルをトレーニングする方法を示します。Capybara datasetは、推論と汎化能力をベンチマークするためのコンパクトで多様なマルチターンデータセットであり、これを使用してQwen 3 0.6Bモデルをトレーニングします。

from trl import SFTTrainer
from datasets import load_dataset

trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B",
    train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()

期待されるデータセットの型と形式

SFTは、言語モデリングとプロンプト-補完の両方のデータセットをサポートしています。SFTTrainerは、標準および会話形式のデータセットの両方と互換性があります。会話形式のデータセットが提供されると、トレーナーは自動的にデータセットにチャットテンプレートを適用します。

# Standard language modeling
{"text": "The sky is blue."}

# Conversational language modeling
{"messages": [{"role": "user", "content": "What color is the sky?"},
              {"role": "assistant", "content": "It is blue."}]}

# Standard prompt-completion
{"prompt": "The sky is",
 "completion": " blue."}

# Conversational prompt-completion
{"prompt": [{"role": "user", "content": "What color is the sky?"}],
 "completion": [{"role": "assistant", "content": "It is blue."}]}

データセットがこれらの形式のいずれでもない場合は、前処理によって期待される形式に変換できます。FreedomIntelligence/medical-o1-reasoning-SFTデータセットを使った例を以下に示します。

from datasets import load_dataset

dataset = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "en")

def preprocess_function(example):
    return {
        "prompt": [{"role": "user", "content": example["Question"]}],
        "completion": [
            {"role": "assistant", "content": f"<think>{example['Complex_CoT']}</think>{example['Response']}"}
        ],
    }

dataset = dataset.map(preprocess_function, remove_columns=["Question", "Response", "Complex_CoT"])
print(next(iter(dataset["train"])))
{
    "prompt": [
        {
            "content": "Given the symptoms of sudden weakness in the left arm and leg, recent long-distance travel, and the presence of swollen and tender right lower leg, what specific cardiac abnormality is most likely to be found upon further evaluation that could explain these findings?",
            "role": "user",
        }
    ],
    "completion": [
        {
            "content": "<think>Okay, let's see what's going on here. We've got sudden weakness [...] clicks into place!</think>The specific cardiac abnormality most likely to be found in [...] the presence of a PFO facilitating a paradoxical embolism.",
            "role": "assistant",
        }
    ],
}

SFT手法をより深く掘り下げる

Supervised Fine-Tuning (SFT)は、言語モデルをターゲットのデータセットに適応させるための、最もシンプルで最も広く使用されている手法です。モデルは、入力と出力のシーケンスのペアを使用して、完全に教師ありの形式で学習されます。その目的は、入力を条件として、ターゲットシーケンスの負の対数尤度(NLL)を最小化することです。

このセクションでは、SFTが実際どのように動作するかを分解して説明し、前処理、トークナイズ、損失の計算という主要なステップをカバーします。

前処理とトークン化

学習中、データセットの形式に応じて、各サンプルにはtextフィールドまたは(prompt, completion)ペアが含まれていることが期待されます。期待される形式の詳細については、Dataset formatsを参照してください。 SFTTrainerは、モデルのトークナイザーを使用して各入力をトークン化します。promptとcompletionがそれぞれ個別に提供されている場合、トークン化の前にそれらが連結されます。

損失の計算

sft_figure

SFTで使用される損失は トークンレベルのクロスエントロピー損失, であり、以下のように定義されます: LSFT(θ)=−∑t=1Tlog⁡pθ(yt∣y<t), \mathcal{L}_{\text{SFT}}(\theta) = - \sum_{t=1}^{T} \log p_\theta(y_t \mid y_{<t}),

ここで yt y_t はタイムステップ t t , におけるターゲットトークンであり、モデルは過去のトークンから次のトークンを予測するように学習されます。実際には、損失の計算時にパディングトークンはマスクされます。

論文 On the Generalization of SFT: A Reinforcement Learning Perspective with Reward Rectification は、報酬シグナルを修正することにより汎化性能を向上させることを目的とした、Dynamic Fine-Tuning (DFT) と呼ばれる代替の損失関数を提案しています。この手法は、SFTConfig で loss_type="dft" を設定することで有効にできます。詳細については、Paper Index - Dynamic Fine-Tuning を参照してください。

ラベルシフティングとマスキング

学習中、損失は1トークンシフトを使用して計算されます。モデルは、シーケンス内の各トークンを、それ以前のすべてのトークンに基づいて予測するように学習されます。具体的には、入力シーケンスを1位置右にシフトして、ターゲットラベルを形成します。 パディングトークン(存在する場合)は、対応する位置に無視インデックス(デフォルト: -100)を適用することで、損失の計算から除外されます。これにより、損失が意味のある非パディングトークンのみに焦点を当てるようになります。

記録されたメトリクス

学習と評価の実行中、以下のメトリクスを記録します:

  • global_step: 現在までに実行されたオプティマイザーステップの総数。
  • epoch: データセットの反復に基づいた現在のエポック番号。
  • num_tokens: 現在までに処理されたトークンの総数。
  • loss: 現在のログ区間における、マスクされていないトークンで計算された平均クロスエントロピー損失。
  • entropy: マスクされていないトークンにおける、モデルが予測したトークン分布の平均エントロピー。
  • aux_loss: Mixture-of-Experts モデルのロードバランス用の補助損失。router_aux_loss_coef によってスケーリングされ、損失に追加される前の値です。モデルが MoE モデルであり、router_aux_loss_coef がゼロでない場合にのみ記録されます。
  • mean_token_accuracy: マスクされていないトークンの中で、モデルのトップ1予測が正解トークンと一致する割合。
  • learning_rate: 現在の学習率。スケジューラを使用している場合、動的に変更される可能性があります。
  • grad_norm: グラディエントクリッピングの前に計算される、勾配のL2ノルム。

カスタマイズ

モデルの初期化

from_pretrained() メソッドの kwargs を SFTConfig に直接渡すことができます。例えば、別の精度でモデルを読み込みたい場合は、

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype=torch.bfloat16)

model_init_kwargs={"dtype": torch.bfloat16} 引数を SFTConfig に渡すことで、これを行うことができます。

from trl import SFTConfig

training_args = SFTConfig(
    model_init_kwargs={"dtype": torch.bfloat16},
)

from_pretrained()のすべてのキーワード引数がサポートされていることに注意してください。

パッキング

SFTTrainerは、複数の例を同じ入力シーケンスにパッキングして学習効率を高める例のパッキングをサポートしています。パッキングを有効にするには、SFTConfigのコンストラクタにpacking=Trueを渡すだけです。

training_args = SFTConfig(packing=True)

パッキングの詳細については、Packingを参照してください。

アシスタントメッセージのみで学習

アシスタントのメッセージのみで学習するには、conversationalデータセットを使用し、SFTConfigでassistant_only_loss=Trueを設定します。この設定により、ユーザーやシステムのメッセージを無視し、アシスタントの応答に対してのみonlyロスが計算されるようになります。

training_args = SFTConfig(assistant_only_loss=True)

train_on_assistant

この機能には、チャットテンプレートに{% generation %}および{% endgeneration %}キーワードが含まれている必要があります。既知のモデルファミリー(例: Qwen3)では、assistant_only_loss=Trueの場合、TRLがテンプレートを自動的にパッチします。バンドルされているトレーニングテンプレートの完全なリストについては、Chat Templatesを参照してください。その他のモデルについては、チャットテンプレートにこれらのキーワードが含まれていることを確認してください。例として、HuggingFaceTB/SmolLM3-3Bを参照してください。

ビジョンデータセットを使用する場合、アシスタントのみを対象とした損失には、transformers>=5.18.0 と対話型の言語モデリングデータセットが必要です。

完了時のみ学習

補完部分のみで学習するには、prompt-completion データセットを使用します。デフォルトでは、トレーナーは補完トークンのみで損失を計算し、プロンプトのトークンは無視します。シーケンス全体で学習したい場合は、SFTConfig で completion_only_loss=False を設定してください。

from trl import SFTConfig, SFTTrainer
from datasets import load_dataset

# Load a prompt-completion dataset; loss is computed on the completion only by default
dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

trainer = SFTTrainer(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    args=SFTConfig(completion_only_loss=True),  # True by default for prompt-completion datasets
    train_dataset=dataset,
)
trainer.train()

train_on_completion

completion でのみ学習を行うことは、assistant メッセージでのみ学習を行うことと互換性があります。この場合、conversational prompt-completion データセットを使用し、SFTConfig で assistant_only_loss=True を設定します。

PEFTでアダプターを学習

🤗 PEFT ライブラリとの緊密な統合をサポートしており、モデル全体を学習させる代わりに、アダプターを学習して Hub で共有することを、すべてのユーザーが手軽に行えます。

from datasets import load_dataset
from trl import SFTTrainer
from peft import LoraConfig

dataset = load_dataset("trl-lib/Capybara", split="train")

trainer = SFTTrainer(
    "Qwen/Qwen3-0.6B",
    train_dataset=dataset,
    peft_config=LoraConfig(),
)

trainer.train()

PeftModelの学習を継続することもできます。そのためには、まずPeftModelをSFTTrainerの外で読み込み、peft_config引数を渡さずにそのままトレーナーに直接渡します。

from datasets import load_dataset
from trl import SFTTrainer
from peft import AutoPeftModelForCausalLM

model = AutoPeftModelForCausalLM.from_pretrained("trl-lib/Qwen3-4B-LoRA", is_trainable=True)
dataset = load_dataset("trl-lib/Capybara", split="train")

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
)

trainer.train()

アダプターを学習する際は、学習されるのは新しいパラメータのみであるため、通常はより高い学習率(約1e‑4)を使用します。

SFTConfig(learning_rate=1e-4, ...)

SFTのための迅速な実験

RapidFire AI は、TRL の上に構築されたオープンソースの実験エンジンです。単一の GPU 上でも、複数の SFT 設定を同時に起動できます。設定を順番に試すのではなく、RapidFire を使用すると、すべての学習曲線を早期に確認し、性能が低い実行を停止し、実行中に有望な実行を新しい設定でクローンできます。詳細については、RapidFire AI Integrationを参照してください。

Unslothで学習

Unslothは、LLM(Llama、Mistral、Gemma、DeepSeekなど)のファインチューニングと強化学習のためのオープンソースフレームワークです。最大2倍の高速化と最大70%のVRAM削減を実現しながら、トレーニング、評価、デプロイメントのためのHugging Face互換の簡素化されたワークフローを提供します。詳細については、Unsloth Integrationを参照してください。

Instruction tuning example

Instruction tuningは、ベースの言語モデルにユーザーの指示に従い、会話に参加する能力を教えます。これには以下が必要です:

  1. チャットテンプレート: ユーザー/アシスタントなどのロールマーカー、特殊トークン、ターン境界を含む、会話をテキストシーケンスに構造化する方法を定義します。チャットテンプレートについては、Chat templatesを参照してください。
  2. 会話データセット: 指示と応答のペアを含む

この例では、Capybara データセットとHuggingFaceTB/SmolLM3-3Bのチャットテンプレートを使用して、Qwen 3 0.6B Baseモデルを指示追従モデルに変換する方法を示します。SFT Trainer は、トークナイザーの更新と特殊トークンの設定を自動的に処理します。

from trl import SFTConfig, SFTTrainer
from datasets import load_dataset

trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B-Base",
    args=SFTConfig(
        output_dir="Qwen3-0.6B-Instruct",
        chat_template_path="HuggingFaceTB/SmolLM3-3B",
    ),
    train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()

Qwen などの一部のベースモデルでは、モデルのトークナイザーに事前定義されたチャットテンプレートが含まれています。このような場合、トークナイザーがすでにフォーマットを処理しているため、clone_chat_template() を適用する必要はありません。ただし、モデルの応答が正しく終了するように、EOS トークンをチャットテンプレートと整合させる必要があります。これらの場合、SFTConfig で eos_token を指定してください。例えば、Qwen/Qwen2.5-1.5B の場合は、eos_token="<|im_end|>" と設定する必要があります。

学習が完了すると、モデルは新しいチャットテンプレートを使用して指示に従い、会話を行うことができます。

>>> from transformers import pipeline
>>> pipe = pipeline("text-generation", model="Qwen3-0.6B-Instruct/checkpoint-5000")
>>> prompt = "<|im_start|>user\nWhat is the capital of France? Answer in one word.<|im_end|>\n<|im_start|>assistant\n"
>>> response = pipe(prompt)
>>> response[0]["generated_text"]
'<|im_start|>user\nWhat is the capital of France? Answer in one word.<|im_end|>\n<|im_start|>assistant\nThe capital of France is Paris.'

代わりに、構造化された会話形式を使用します(推奨):

>>> prompt = [{"role": "user", "content": "What is the capital of France? Answer in one word."}]
>>> response = pipe(prompt)
>>> response[0]["generated_text"]
[{'role': 'user', 'content': 'What is the capital of France? Answer in one word.'}, {'role': 'assistant', 'content': 'The capital of France is Paris.'}]

SFTによるツール呼び出し

SFTTrainerは、tool calling機能を持つモデルのファインチューニングを完全にサポートしています。この場合、各データセットの例には以下を含める必要があります。

  • ツール呼び出し(tool_calls)やツール応答(toolロールのメッセージ)を含む会話メッセージ
  • tools 列に表示される利用可能なツールのリスト。通常、JSON スキーマとして提供されます

期待されるデータセットの構造の詳細については、Dataset Format — Tool Callingセクションを参照してください。

ビジョン言語モデルの学習

SFTTrainer は、Vision-Language Models (VLMs) のトレーニングを完全にサポートしています。VLM をトレーニングするには、image 列(サンプルごとに1枚の画像)または images 列(サンプルごとに画像のリスト)を含むデータセットを指定してください。期待されるデータセットの構造の詳細については、Dataset Format — Vision Dataset セクションを参照してください。 このようなデータセットの例として、LLaVA Instruct Mix があります。

from trl import SFTConfig, SFTTrainer
from datasets import load_dataset

trainer = SFTTrainer(
    model="Qwen/Qwen2.5-VL-3B-Instruct",
    args=SFTConfig(max_length=None),
    train_dataset=load_dataset("trl-lib/llava-instruct-mix", split="train"),
)
trainer.train()

VLMでは、切り詰めを行うと画像トークンが削除され、トレーニング中にエラーが発生する可能性があります。これを回避するには、SFTConfigでmax_length=Noneを設定してください。これにより、モデルは画像トークンを切り詰めずに、シーケンス全体の長さを処理できます。

SFTConfig(max_length=None, ...)

max_lengthは、データセット全体で切り詰めによって画像トークンが削除されないことを確認した場合にのみ使用してください。

SFTTrainer

クラス trl.SFTTrainer

< >

( model: str | PreTrainedModel | PeftModelargs: trl.trainer.sft_config.SFTConfig | transformers.training_args.TrainingArguments | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonecompute_loss_func: collections.abc.Callable | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)optimizer_cls_and_kwargs: tuple[type[torch.optim.Optimizer], dict[str, typing.Any]] | None = Nonepreprocess_logits_for_metrics: collections.abc.Callable[[torch.Tensor, torch.Tensor], torch.Tensor] | None = Nonequantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = Noneformatting_func: collections.abc.Callable[[dict], str] | None = None )

パラメータ

  • model (str または PreTrainedModel または PeftModel) — 学習対象のモデル。以下のいずれかです:
    • 文字列。huggingface.co上のモデルリポジトリにホストされている事前学習モデルのmodel id、またはsave_pretrainedを使用してモデルの重みを保存したディレクトリへのパス(例: './my_model_directory/')です。モデルは、モデル設定から導出される<ModelArchitecture>を用いた<ModelArchitecture>.from_pretrainedによって、args.model_init_kwargs内のキーワード引数を使用して読み込まれます。args.model_init_kwargsにdtypeが指定されていない場合、デフォルトはfloat32です。これは、モデル設定からdtypeを推論する(Transformers v5以降)from_pretrainedとは異なります。
    • PreTrainedModelオブジェクト。因果言語モデルのみサポートされています。
    • PeftModelオブジェクト。因果言語モデルのみサポートされています。
  • args (SFTConfig、任意) — このトレーナーの設定です。None の場合、デフォルトの設定が使用されます。
  • data_collator (DataCollator, 省略可) — 処理済みのtrain_datasetまたはeval_datasetの要素のリストからバッチを形成するために使用する関数。 デフォルトではDataCollatorForLanguageModelingが使用されますが、データセットに画像が含まれている場合はDataCollatorForVisionLanguageModelingが使用されます。
  • train_dataset (Dataset または IterableDataset) — 学習に使用するデータセット。このトレーナーは 言語モデリング タイプと プロンプト-補完 タイプの両方をサポートしています。サンプルの形式は次のいずれかです:
    • Standard: 各サンプルにはプレーンテキストが含まれています。
    • 対話形式: 各サンプルには構造化されたメッセージ(例: roleとcontent)が含まれます。

    Trainerは、必須のinput_idsカラムによって識別される、事前トークン化済みデータセットもサポートしています。任意のlabelsカラム(損失から除外されるトークンには-100)が存在する場合はそのまま使用され、存在しない場合は、任意のassistant_masks / completion_maskカラム(これらは組み込まれた後に削除され、completion_maskはcompletion_only_loss=Trueの場合のみ)からラベルが構築されます。それ以外の場合は、input_idsのコピーがデフォルトとして使用されます。シーケンスは、準備段階でmax_lengthまで切り詰められます。skip_prepare_dataset=Trueの場合、準備はスキップされ、collatorがデータセットをそのまま処理することが期待されます。

    train_dataset が IterableDataset(ストリーミングデータセットなど)である場合、その長さを推定できないため、学習ループの上限を定め、学習率スケジューラを設定するために必要な総学習ステップ数を指定するため、max_steps を学習引数で設定する必要があります。

  • eval_dataset (Dataset、IterableDataset、DatasetDict、IterableDatasetDict または dict[str, Dataset | IterableDataset]) — 評価に使用する Dataset です。train_dataset と同じ要件を満たす必要があります。
  • processing_class (PreTrainedTokenizerBase、ProcessorMixin、任意) — データを処理するために使用される処理クラスです。None の場合、from_pretrained を使用してモデル名から処理クラスが読み込まれます。パディングトークンである tokenizer.pad_token が設定されている必要があります。処理クラスにパディングトークンが設定されていない場合、tokenizer.eos_token がデフォルトとして使用されます。
  • compute_loss_func (Callable, 省略可) — モデルの出力、ラベル、および累積バッチ全体(batch_size * gradient_accumulation_steps)のアイテム数を引数に取り、損失を返す関数です。非推奨であり、v2.0.0 で削除されます。代わりに SFTTrainer をサブクラス化し、compute_loss をオーバーライドしてください。
  • compute_metrics (Callable[[EvalPrediction], dict], 省略可) — 評価時にメトリクスを計算するために使用される関数。EvalPrediction を引数に取り、メトリクス名(文字列)からメトリクス値への辞書を返す必要があります。SFTConfig に batch_eval_metrics が True に設定されている場合、compute_metrics 関数はブール型の compute_result 引数を受け取らなければなりません。これは最後の評価バッチの後にトリガーされ、関数がバッチレベルの統計を累積するのではなく、グローバルなサマリー統計を計算して返す必要があることを示します。この関数が受け取る logits は、追加のフォワードパスで再計算されます。この機能は非推奨であり、v2.0.0 で削除されます。
  • callbacks (のリスト TrainerCallback, 省略可) — トレーニングループをカスタマイズするためのコールバックのリスト。デフォルトのコールバックのリストに追加されます。デフォルトのコールバックの詳細は こちら.

    デフォルトで使用するコールバックの1つを削除したい場合は、remove_callbackメソッドを使用します。

  • optimizers (tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None]、任意、デフォルトは (None, None)) — 使用するオプティマイザーとスケジューラーを含むタプルです。デフォルトでは、モデルに対して AdamW のインスタンスと、args によって制御される get_linear_schedule_with_warmup によって与えられるスケジューラーが使用されます。
  • optimizer_cls_and_kwargs (tuple[Type[torch.optim.Optimizer], Dict[str, Any]], 省略可) — 使用するオプティマイザーのクラスとキーワード引数を含むタプルです。 optim および optim_args 内の args. とは互換性がありません。 optimizers 引数。

    optimizers とは異なり、この引数を使用すると、Trainer を初期化する前にモデルのパラメータを正しいデバイスに配置する必要がなくなります。

  • preprocess_logits_for_metrics (Callable[[torch.Tensor, torch.Tensor], torch.Tensor], 省略可能) — 各評価ステップで logits をキャッシュする直前に、それらを前処理する関数です。2 つのテンソル(logits と labels)を受け取り、所望の処理が施された logits を返す必要があります。この関数による変更は、 compute_metrics.

    ラベル(第2引数)は、データセットにラベルが含まれていない場合、Noneになります。

  • quantization_config (BitsAndBytesConfig、任意) — モデル識別子からモデルを読み込む際に使用される量子化設定です。QLoRA 学習には peft_config と組み合わせて使用します。モデルがすでにインスタンス化されている場合は無視されます。
  • peft_config (PeftConfig、任意) — モデルをラップするために使用されるPEFT設定です。Noneの場合、モデルはラップされません。
  • formatting_func (Callable、省略可) — トークナイズの前にデータセットに適用されるフォーマット関数。このフォーマット関数を明示的に適用すると、データセットは言語モデリングタイプに変換されます。

教師ありファインチューニング(SFT)手法用のTrainer。

このクラスはTrainerクラスのラッパーであり、そのすべての属性とメソッドを継承します。

例:

>>> from trl import SFTTrainer
>>> from datasets import load_dataset

>>> dataset = load_dataset("roneneldan/TinyStories", split="train[:1%]")

>>> trainer = SFTTrainer(
...     model="Qwen/Qwen2.5-0.5B-Instruct",
...     train_dataset=dataset,
... )
>>> trainer.train()

train

< >

( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput

パラメータ

  • resume_from_checkpoint (str または bool、省略可) — str の場合、以前の Trainer インスタンスによって保存されたチェックポイントのローカルパスを指定します。bool で True の場合、以前の Trainer インスタンスによって args.output_dir に保存された最後のチェックポイントを読み込みます。指定がある場合、ここで読み込まれたモデル/オプティマイザ/スケジューラの状態からトレーニングを再開します。
  • trial (optuna.Trial または dict[str, Any]、省略可) — ハイパーパラメータ探索のための試行またはハイパーパラメータの辞書。
  • ignore_keys_for_eval (list[str]、省略可) — モデルの出力が辞書である場合、学習中の評価で予測を収集する際に無視すべきキーのリストです。

戻り値

~trainer_utils.TrainOutput

グローバルステップ数、トレーニング損失、およびメトリクスを含むオブジェクト。

メインの学習エントリポイント。

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

モデルを保存するため、from_pretrained()を使用して再読み込みできます。

メインプロセスからのみ保存します。

push_to_hub

< >

( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = Noneprivate: bool | None = None**kwargs )

パラメータ

  • commit_message (str、任意、デフォルトは"End of training") — プッシュ時にコミットするメッセージ。
  • blocking (bool、省略可能、デフォルトはTrue) — git pushが完了した後にのみ関数が返すかどうか。
  • token (str、任意、デフォルトはNone) — Trainer の元の引数を上書きするための書き込み権限を持つトークン。
  • revision (str, 省略可) — コミット元の git リビジョンです。“main” ブランチのヘッドがデフォルトです。
  • private (bool、省略可) — リポジトリ作成時にプライベートにするかどうか。デフォルトはargs.hub_private_repoです。リポジトリが既に存在する場合は、この引数は無効です。
  • kwargs (dict[str, Any]、省略可) — ~Trainer.create_model_card に渡される追加のキーワード引数。

self.args.hub_model_id のリポジトリに、self.model と self.processing_class を 🤗 model hub にアップロードします。

SFTConfig

クラス trl.SFTConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 2e-05lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Noneactivation_checkpointing: bool | None = Noneactivation_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonechat_template_path: str | None = Nonedataset_text_field: str = 'text'dataset_kwargs: dict[str, typing.Any] | str | None = Nonedataset_num_proc: int | None = Noneeos_token: str | None = Nonemax_length: int | None = 1024truncation_mode: str = 'keep_start'shuffle_dataset: bool = Falsepacking: bool = Falsepacking_strategy: str = 'bfd'padding_free: bool = Falsepad_to_multiple_of: int | str | None = 'auto'eval_packing: bool | None = Nonecompletion_only_loss: bool | None = Noneassistant_only_loss: bool = Falseloss_type: str = 'nll'activation_offloading: bool = Falsepad_token: str | None = None )

モデルを制御するパラメータ

  • model_init_kwargs (dict[str, Any], 省略可) — model 引数が文字列として指定された場合、SFTTrainer の from_pretrained に渡すキーワード引数です。処理クラスの読み込み時にも revision の値が使用されます。
  • trust_remote_code (bool, optional, defaults to False) — Whether to allow loading models and tokenizers that ship custom Python code from the Hub. Forwarded to from_pretrained and from_pretrained.
  • router_aux_loss_coef (float, 任意) — Mixture-of-Experts (MoE) モデルにおける負荷分散用の補助損失の係数です。この重みで学習損失に追加されます。設定されていない場合、モデル設定で宣言された値が使用されます。0.0 に設定すると無効になります。MoE 以外のモデルで使用するとエラーになります。
  • chat_template_path (str, 任意) — 指定すると、モデルのチャットテンプレートが設定されます。これは、トークナイザーへのパス(ローカルディレクトリまたは Hugging Face Hub 上のモデル)か、Jinja テンプレートファイルへの直接パスのいずれかです。Jinja ファイルを使用する場合は、テンプレート内で参照されている特殊トークンがトークナイザーに追加されていること、およびモデルの埋め込み層がそれに応じてリサイズされていることを確認する必要があります。

データ前処理を制御するパラメータ

  • dataset_text_field (str、任意、デフォルトは"text") — データセット内のテキストデータを含むカラムの名前。
  • dataset_kwargs (dict[str, Any], 省略可) — データセットの準備に関する任意のキーワード引数の辞書です。サポートされているキーは skip_prepare_dataset のみです。データセットに画像が含まれている場合、前処理はオンザフライで行われるため、 skip_prepare_dataset は指定された値に関わらず自動的に True として扱われます。
  • dataset_num_proc (int, 省略可) — データセットの処理に使用するプロセス数。
  • eos_token (str, 任意) — ターンまたはシーケンスの終了を示すために使用されるトークン。None の場合、processing_class.eos_token がデフォルトとして使用されます。
  • max_length (int または None、任意、デフォルトは 1024) — トークン化されたシーケンスの最大長です。max_length より長いシーケンスは、truncation_mode に応じて左側または右側から切り詰められます。None の場合は、切り詰めは行われません。パッキングが有効な場合、この値がシーケンス長を設定します。
  • truncation_mode (str、任意、デフォルトは "keep_start") — シーケンスが max_length を超えた場合に使用する切り詰めモード。サポートされている値は "keep_start" のみです。 "keep_end" は非推奨であり、v2.0.0 で削除されます。
  • shuffle_dataset (bool、任意、デフォルトはFalse) — データセットをシャッフルするかどうか。
  • packing (bool、任意、デフォルトはFalse) — 複数のシーケンスを固定長のブロックにグループ化して、計算効率を向上させ、パディングを削減するかどうかを指定します。max_length を使用してシーケンスの長さを定義します。
  • packing_strategy (str、任意、デフォルトは"bfd") — シーケンスのパッキング戦略。"bfd"(best-fit decreasing、オーバーフローを切り捨て)、"bfd_split"(best-fit decreasing、オーバーフローしたシーケンスを分割)、または"wrapped"(アグレッシブ、シーケンスの途中で切断)のいずれかです。
  • padding_free (bool、任意、デフォルトはFalse) — バッチ内のすべてのシーケンスを単一の連続シーケンスにフラット化して、パディングなしでフォワードパスを実行するかどうかを指定します。これにより、パディングのオーバーヘッドを排除してメモリ使用量を削減できます。現在、これはフラット化されたバッチ構造を効率的に処理できる FlashAttention 2 または 3 のみでサポートされています。戦略"bfd"でパッキングが有効な場合、このパラメータの値に関わらず、padding-free が有効になります。
  • pad_to_multiple_of (int または str、任意、デフォルトは "auto") — 設定されている場合、シーケンスはこの値の倍数にパディングされます。"auto" は、入力形状ごとに一度だけコンパイルされる Neuron (AWS Trainium) 上で 128 の倍数にパディングし、それ以外の環境ではパディングを行いません。
  • eval_packing (bool, 省略可) — 評価データセットをパッキングするかどうか。None の場合、packing と同じ値を使用します。

学習を制御するパラメータ

  • completion_only_loss (bool, 省略可) — シーケンスのcompletion部分のみでlossを計算するかどうか。Trueに設定すると、lossはcompletionのみで計算されます。これはprompt-completionデータセットでのみサポートされています。Falseの場合、lossはシーケンス全体で計算されます。None(デフォルト)の場合、動作はデータセットによって異なります。prompt-completionデータセットではcompletionで、language modelingデータセットではシーケンス全体でlossが計算されます。
  • assistant_only_loss (bool、任意、デフォルトは False) — シーケンスの assistant 部分のみで損失を計算するかどうか。True に設定すると、損失は assistant の応答のみで計算されます。これは conversational データセットでのみサポートされています。False の場合、損失はシーケンス全体で計算されます。
  • loss_type (str, 省略可, デフォルトは "nll") — 使用する損失の種類。使用可能な値は以下の通りです:
    • "nll": 標準的な負対数尤度。
    • "dft": この論文で説明されているDynamic Fine-Tuning。
    • "chunked_nll": "nll"の非推奨エイリアスで、損失の計算方法は同じです。v2.0.0で削除されます。
  • activation_offloading (bool、任意、デフォルトはFalse) — アクティベーションをCPUにオフロードするかどうか。

非推奨のパラメータ

  • pad_token —

    パラメータ pad_token は非推奨となり、バージョン v2.0.0 で削除されます。代わりに、tokenizer.pad_token を直接設定し、processing_class としてトレーナーに渡してください。

SFTTrainerの構成クラスです。

このクラスには、SFT学習に固有のパラメータのみが含まれています。学習引数の完全なリストについては、TrainingArgumentsのドキュメントを参照してください。なお、このクラスのデフォルト値は、TrainingArgumentsのものと異なる場合があります。

HfArgumentParser を使用すると、このクラスをコマンドラインで指定できる argparse の引数に変換できます。

これらのパラメータは、TrainingArgumentsとは異なるデフォルト値を持っています:

  • logging_steps: デフォルト値が500ではなく10になります。
  • gradient_checkpointing: デフォルト値がFalseではなくTrueに変更されました。
  • bf16: fp16が設定されていない場合、デフォルトでFalseではなくTrueになります。
  • learning_rate: 5e-5ではなく、デフォルト値が2e-5に変更されました。
Update on GitHub