TRL documentation

SDPO

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

and get access to the augmented documentation experience

to get started

SDPO

Reinforcement Learning via Self-Distillation で Jonas Hübotter、Frederike Lübeck、Lejs Behric、Anton Baumann、Marco Bagatella、Daniel Marta、Ido Hakimi、Idan Shenfeld、Thomas Kleine Buening、Carlos Guestrin、Andreas Krause によって導入された Self-Distillation Policy Optimization (SDPO)

大規模言語モデルは、コードや数学といった検証可能なドメインにおいて、強化学習によるポストトレーニングがますます行われるようになっています。しかし、検証可能な報酬を用いた強化学習(RLVR)の現在の手法は、試行ごとにスカラーの成果報酬のみから学習するため、深刻なクレジットアサインメントのボトルネックを生み出しています。多くの検証可能な環境では、試行が失敗した理由を説明する実行時エラーやジャッジの評価といった豊富なテキストフィードバックが実際に提供されています。私たちはこの設定を豊富なフィードバックを用いた強化学習として形式化し、外部の教師や明示的な報酬モデルを一切必要とせずに、トークン化されたフィードバックを高密度な学習シグナルに変換する Self-Distillation Policy Optimization (SDPO) を提案します。SDPO は、フィードバックを条件とする現在のモデルを自己教師として扱い、そのフィードバックに基づく次のトークン予測をポリシーに蒸留します。これにより、SDPO はモデルがコンテキスト内で自らのミスを後から特定する能力を活用します。LiveCodeBench v6 における科学的推論、ツール使用、競技プログラミングにおいて、SDPO は強力な RLVR ベースラインと比較して、サンプル効率と最終精度を向上させます。特に、SDPO は、成功したロールアウトを失敗した試行の暗黙のフィードバックとして利用することで、スカラーのフィードバックのみを返す標準的な RLVR 環境でもベースラインを上回る性能を発揮します。最後に、テスト時に個々の問題に対して SDPO を適用することで、困難なバイナリ報酬タスクにおける発見が加速され、best-of-k サンプリングやマルチターン会話と同じ発見確率を、試行回数を 3 分の 1 に抑えた状態で達成します。

仕組み

SDPOは、検証可能な報酬(RLVR)を用いた強化学習をターゲットとしています。この設定では、各試行から得られるのはスパースなスカラー報酬のみです。SDPOはこれを、トークンレベルのデンスなシグナルに変換します。具体的には、各プロンプトに対してポリシーがnum_generations個の補完をサンプリングし、reward_funcsでスコアリングします。成功したロールアウト(および任意のprivileged_contextフィードバック)が教師用のリプロンプトとなり、教師のフィードバックを反映した補完上の分布がポリシーに蒸留されます。教師と生徒は同じネットワークであるため、検証器以外に外部の教師や報酬モデルは必要ありません。

損失モードと教師

distillation_weight は、2つのシグナルを凸結合として組み合わせる方法を制御します。損失は (1 - distillation_weight) * policy_loss + distillation_weight * distillation_loss として計算されます。1.0(デフォルト)では自己蒸留損失のみで学習し、0.0 では標準的な GRPO 形式のポリシー勾配にフォールバックし、中間の値では両方をブレンドします。蒸留の目的関数自体は distillation_mode によって設定されます。"sampled_token"(デフォルト)はトークンレベルの逆 KL を使用し、distillation_alpha=1.0 を必要とします。一方、"full_logits" と "topk_logits" は、全語彙または上位 distillation_topk の語彙に対して蒸留を行います。

teacher_model_kind は教師モデルの重みの選択を制御します。"ema"(デフォルト)は、teacher_sync_steps ステップごとに teacher_update_rate のレートで同期される指数移動平均によって学生モデルを追跡します。"live" は現在の学生モデルをそのまま再利用し、"base" は初期の重みを固定します。リプロンプトは use_successful_as_teacher、success_reward_threshold、dont_reprompt_on_self_success、および reprompt_template / solution_template / feedback_template 文字列によって制御されます。生成はデフォルトで Transformers 経由で実行されますが、use_vllm=True の場合は vLLM(colocate または server モード)が使用されます。

期待されるデータセットの列

各例は、以下を提供する必要があります:

  • prompt: 学生向けのプロンプト
  • privileged_context: 環境フィードバックなどの、include_environment_feedback=True の場合に使用される任意の権限付きテキスト

使用方法

from datasets import Dataset

from trl.experimental.sdpo import SDPOConfig, SDPOTrainer

dataset = Dataset.from_dict(
    {
        "prompt": [[{"role": "user", "content": "Solve 2+2."}]],
        "privileged_context": ["Your earlier answer used the wrong format."],
    }
)

training_args = SDPOConfig(
    output_dir="sdpo-model",
    distillation_mode="topk_logits",       # Explicitly select top-K logit distillation
    distillation_topk=100,                 # Required when using top-K logit distillation
    include_environment_feedback=True,     # Use dataset privileged_context for teacher reprompts
)

trainer = SDPOTrainer(
    model="Qwen/Qwen2.5-1.5B-Instruct",
    reward_funcs=reward_func,
    args=training_args,
    train_dataset=dataset,
)
trainer.train()

SDPOでは常にprompt列が必要です。環境フィードバックを使用するには、privileged_context列も含め、include_environment_feedback=Trueを設定してください。SDPOは、自己蒸留のための教師用リプロンプトの構築に、成功したロールアウトと、有効な場合のそのテキストを使用します。

vLLMサーバーから教師モデルをサービングする

teacher_model_kind="live" を設定すると、教師モデルは現在の学生モデルとなり、その重みは vLLM の サーバー がすでに保持しています(生成のために各ステップで同期されます)。use_teacher_server=True を設定すると、教師の対数尤度をその同じサーバー上でスコアリングし、別途ローカルで教師のフォワードパスを実行する必要がなくなります。これにより、教師モデルをトレーニングステップから完全に排除できます。

training_args = SDPOConfig(
    output_dir="sdpo-model",
    use_vllm=True,
    vllm_mode="server",
    teacher_model_kind="live",
    use_teacher_server=True,
    distillation_weight=1.0,
    distillation_mode="sampled_token",
)

教師サーバーを使用する場合:

  • use_vllm=True と vllm_mode="server" は必須です
  • teacher_model_kind は "live"(サーバーが現在の student の重みを保持している)である必要があります。
  • distillation_weight は 1.0 である必要があります(純粋な蒸留。ポリシー損失との凸結合には、完全な語彙の logits が必要です)
  • distillation_mode は "sampled_token"(実現トークンに対する reverse KL)または "topk_logits" である必要があります。サーバーは教師モデル自身の top-k log-probs を返すため、topk_logits は教師モデルの top-k サポート上で蒸留を行います(ローカルな目的関数とは異なり、生徒モデルのサポートは使用できません)。"live" 教師モデルの場合、両方のサポートはほぼ一致します。full_logits は利用できません。

コールバック

Trainer は、デバッグ、観測可能性、テストに有用な一連の小さなコールバックフックを出力します。これらのフックは、実験的な自己蒸留ワークフローのための実用的な統合ポイントとして意図されています。

共有された自己蒸留フック:

  • on_self_distillation_batch_prepared: セルフディストリレーションのバッチが準備できたときに発火します。ペイロードには、prompt_ids、completion_ids、および、インポータンスサンプリングのクリッピング用入力が利用可能な場合のold_per_token_logpsが含まれます。
  • on_generation_batch_built: 新しいバッファリングされた生成バッチが作成されたときに発火します。ペイロードにはgenerate_everyとsteps_per_generationが含まれます。

SDPO固有のフック:

  • on_teacher_context_built: SDPO が教師条件付き入力を構築した後に発火します。ペイロードには teacher_input_ids、teacher_attention_mask、completion_mask、self_distillation_mask が含まれます。

スクリプトの例

examples/sdpo_math/sdpo_math.py を使用して、コマンドラインから SDPO の学習を開始します。このスクリプトは、検証可能な数学報酬、--feedback_column による環境からのフィードバック、および標準的な ModelConfig フラグによる PEFT/LoRA をサポートしています。

python examples/sdpo_math/sdpo_math.py \
    --model_name_or_path Qwen/Qwen2.5-Math-1.5B-Instruct \
    --dataset_name openai/gsm8k \
    --dataset_config main \
    --output_dir outputs/sdpo-qwen35-2b-gsm8k \
    --learning_rate 5e-5 \
    --dtype bfloat16 \
    --bf16 true \
    --max_completion_length 128 \
    --use_peft \
    --lora_target_modules q_proj k_proj v_proj o_proj gate_proj up_proj down_proj \
    --per_device_train_batch_size 1 \
    --gradient_accumulation_steps 2 \
    --num_generations 8 \
    --generation_batch_size 32 \
    --distillation_alpha 1.0 \
    --distillation_mode sampled_token \
    --distillation_weight 0.5 \
    --report_to none \
    --eval_strategy steps \
    --eval_steps 1000 \
    --save_strategy no

SDPOConfig

クラス trl.experimental.sdpo.SDPOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 5e-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 = 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 = Falselabel_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] | None = Nonetrust_remote_code: bool = Falsedisable_dropout: bool = Truemax_prompt_length: int | None = 512num_generations: int = 8num_generations_eval: int | None = Nonemax_completion_length: int | None = 256ds3_gather_for_generation: bool = Trueshuffle_dataset: bool = Truegeneration_batch_size: int | None = Nonesteps_per_generation: int | None = Nonetemperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonegeneration_kwargs: dict[str, typing.Any] | None = Nonechat_template_kwargs: dict[str, typing.Any] | None = Nonerepetition_penalty: float = 1.0cache_implementation: str | None = Noneuse_vllm: bool = Falseuse_teacher_server: bool = Falsevllm_mode: str = 'colocate'vllm_model_impl: str = 'vllm'vllm_enable_sleep_mode: bool = Falsevllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8000vllm_group_port: int = 51216vllm_server_timeout: float = 240.0vllm_tensor_parallel_size: int = 1vllm_gpu_memory_utilization: float = 0.3vllm_max_model_length: int | None = Nonenum_iterations: int = 1loss_type: str = 'dapo'mask_truncated_completions: bool = Falsedont_reprompt_on_self_success: bool = Truebeta: float = 0.0epsilon: float = 0.2epsilon_high: float | None = Noneimportance_sampling_level: str = 'token'reward_weights: list[float] | None = Nonescale_rewards: str = 'group'distillation_alpha: float = 1.0distillation_mode: typing.Literal['sampled_token', 'full_logits', 'topk_logits'] = 'sampled_token'distillation_topk: int | None = Nonedistillation_is_clip: float | None = 2.0distillation_add_tail: bool = Falsedistillation_weight: float = 1.0teacher_model_kind: str = 'ema'teacher_update_rate: float = 0.05teacher_sync_steps: int = 1max_reprompt_len: int = 10240use_successful_as_teacher: bool = Truesuccess_reward_threshold: float = 1.0reprompt_template: str = '{prompt}{solution}{feedback}\n\nCorrectly solve the original question.\n'solution_template: str = '\nCorrect solution:\n\n{successful_previous_attempt}\n\n'feedback_template: str = '\nThe following is feedback from your unsuccessful earlier attempt:\n\n{feedback_raw}\n\n'include_environment_feedback: bool = Falseenvironment_feedback_only_without_solution: bool = Falseremove_thinking_from_demonstration: bool = Falsediagnostics_warning_interval: int = 10diagnostics_flat_tolerance: float = 1e-08 )

オンラインポリシーの目的関数を制御するパラメータ

  • beta (float、任意、デフォルトは 0.0) — KL 係数です。0.0(デフォルト)の場合、参照モデルは読み込まれず、メモリ使用量が削減され、トレーニング速度が向上します。DeepSeek-R1 incentivizes reasoning in LLMs through reinforcement learning では、値として 0.001 が使用されています。
  • epsilon (float, 任意、デフォルトは 0.2) — クリッピング用のエプシロン値。
  • epsilon_high (float, 省略可能) — クリッピング用の上限エプシロン値です。指定しない場合、引数 epsilon で指定された下限値と同じ値がデフォルトとして使用されます。DAPO の論文では 0.28 が推奨されています。
  • importance_sampling_level (str, 任意、デフォルトは "token") — 重要度サンプリングの比率を 'token' レベルで計算するか、'sequence' レベルで計算するかを制御します。'token' は、トークンごとの生の対数尤度比を保持します(トークンごとに1つの重み)。'sequence' は、有効なトークン全体で対数尤度比を平均化し、シーケンスごとに1つの比率を生成します。GSPO の論文では、シーケンスレベルのサンプリングは、より安定した学習と、シーケンスレベルの報酬とのより良い整合性を生み出すことが示されています。
  • reward_weights (list[float], 任意) — 各報酬関数に対する重み。報酬関数の数と一致する必要があります。None の場合、すべての報酬が重み 1.0 で等しく重み付けされます。
  • scale_rewards (str または bool、省略可能、デフォルトは "group") — 報酬のスケーリング戦略を指定します。サポートされる値は以下の通りです: True または 'group' (デフォルト): 各グループ内の標準偏差によって報酬がスケーリングされ、グループ内の分散が 1 になるように保証されます。 'batch': PPO Lite 論文で推奨されているように、バッチ全体の標準偏差によって報酬がスケーリングされます。 False または 'none': スケーリングは適用されません。Dr. GRPO 論文では、標準偏差によるスケーリングは問題レベルの難易度バイアスを導入するため、報酬のスケーリングを行わないことを推奨しています。

SDPO損失を制御するパラメータ

  • distillation_weight (float、任意、デフォルトは 1.0) — ポリシー目標と自己蒸留目標の間の凸結合の重みです。損失は (1 - distillation_weight) * policy_loss + distillation_weight * distillation_loss として計算されます。[0, 1] の範囲である必要があります。1.0 (デフォルト)では純粋に自己蒸留で学習し、0.0 では標準的な GRPO スタイルのポリシー勾配にフォールバックし、中間の値では両方をブレンドします。
  • distillation_alpha (float、任意、デフォルトは 1.0) — 発散の補間係数です。サンプリングトークン SDPO には、公式の reverse-KL 設定 distillation_alpha=1.0 が必要です。
  • distillation_mode (Literal["sampled_token", "full_logits", "topk_logits"]、任意、デフォルトは"sampled_token") — 蒸留の目的モード。sampled_tokenはデフォルトのSDPOモードであり、distillation_alpha=1.0が必要です。
  • distillation_topk (int, 任意) — logit レベルの SDPO における Top-k 近似。distillation_mode=topk_logits の場合にのみ設定し、それ以外の場合は設定しないでください。
  • distillation_is_clip (float、任意、デフォルトは2.0) — 自己蒸留における重要度サンプリングのクリッピング係数です。Noneを指定すると、クリッピングが無効になります。
  • distillation_add_tail (bool、任意、デフォルトはFalse) — トップk以外の確率質量に対してテールバケットを追加するかどうかを指定します。

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

  • teacher_model_kind (str、任意、デフォルトは "ema") — セマンティックな教師モデルの選択です。base は初期の学生モデルを使用し、live は現在の学生モデルを使用し、ema は指数移動平均を用いた教師モデルを使用します。
  • teacher_update_rate (float, 任意, デフォルトは 0.05) — EMA教師同期に使用される教師更新率です。
  • teacher_sync_steps (int、任意、デフォルトは1) — EMA教師モデルを同期する頻度です。

リプロンプトを制御するパラメータ

  • use_successful_as_teacher (bool、省略可、デフォルトはTrue) — 成功したロールアウトを自己蒸留の暗黙的なフィードバックとして使用します。
  • success_reward_threshold (float、任意、デフォルトは1.0) — ロールアウトが成功したデモとみなされるための最小報酬。
  • dont_reprompt_on_self_success (bool、任意、デフォルトはTrue) — モデルが正しい応答を生成した場合に、リプロンプトをスキップします。
  • max_reprompt_len (int、任意、デフォルトは10240) — 自己蒸留におけるリプロンプトの最大長。
  • reprompt_template (str、任意、デフォルトは "{prompt}{solution}{feedback}\n\nCorrectly solve the original question.\n") — 成功したデモを用いて教師モデルに再プロンプトを送るためのテンプレート。
  • solution_template (str、任意、デフォルトは"\nCorrect solution -- \n\n{successful_previous_attempt}\n\n"): 成功したデモのテキストを整形するためのテンプレート。
  • feedback_template (str、任意、デフォルトは"\nThe following is feedback from your unsuccessful earlier attempt -- \n\n{feedback_raw}\n\n"): 再プロンプト用の環境フィードバックを整形するためのテンプレート。
  • include_environment_feedback (bool、省略可能、デフォルトは False) — 利用可能な場合、教師の再プロンプトに環境フィードバックを含めるかどうかを指定します。
  • environment_feedback_only_without_solution (bool、省略可能、デフォルトはFalse) — 成功したソリューションが利用できない場合にのみフィードバックを使用するかどうか。
  • remove_thinking_from_demonstration (bool、任意、デフォルトはFalse) — デモテキストから<think>…</think>ブロックを削除するかどうか。

診断を制御するパラメータ

  • diagnostics_warning_interval (int、任意、デフォルトは10) — 連続する N ステップの間に、トレーナーの診断情報を繰り返し出力します。0 に設定すると無効になります。
  • diagnostics_flat_tolerance (float、任意、デフォルトは1e-8) — 報酬の分散やリプロンプトの活動が実質的にゼロかどうかを判定するために使用される許容誤差。

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

  • model_init_kwargs (dict[str, Any]、省略可) — SDPOTrainerのmodel引数が文字列として指定された場合、transformers.AutoModelForCausalLM.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. Also applied to reward-model and reward-tokenizer loads.
  • disable_dropout (bool、任意、デフォルトはTrue) — モデル内の dropout を無効にするかどうか。参照モデルを用いた学習時に有用であり、同じ入力に対してモデルが異なる logprobs を生成することを防ぎます。

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

  • remove_unused_columns (bool、任意、デフォルトは False) — データセットから ‘prompt’ 列のみを残すかどうかを指定します。 ‘prompts’ と ‘completions’ 以外の列を必要とするカスタム報酬関数を使用する場合は、この値を False に設定してください。
  • max_prompt_length (int、任意、デフォルトは512) — プロンプトの最大長です。これを超える長いプロンプトは、左側から切り詰められます。
  • shuffle_dataset (bool、任意、デフォルトはTrue) — 学習データセットをシャッフルするかどうか。

生成を制御するパラメータ

  • num_generations (int、任意、デフォルトは8) — サンプリングする世代数。実効バッチサイズ (num_processes per_device_batch_size gradient_accumulation_steps) は、この値で割り切れる必要があります。
  • num_generations_eval (int, 任意) — 評価時にサンプリングする生成回数です。評価時に生成回数を減らすことで計算量を節約できます。None の場合、num_generations の値が使用されます。
  • max_completion_length (int、任意、デフォルトは256) — 生成される補完の最大長。
  • temperature (float、任意、デフォルトは1.0) — サンプリング用の温度です。温度が高いほど、補完はランダムになります。
  • top_p (float、任意、デフォルトは1.0) — 考慮する上位トークンの累積確率を制御する浮動小数点数です。(0, 1] の範囲で指定する必要があります。すべてのトークンを考慮するには 1.0 を設定してください。
  • top_k (int、任意、デフォルトは0) — トップkフィルタリングのために保持する、確率の高い語彙トークンの数。0の場合、トップkフィルタリングは無効になり、すべてのトークンが対象となります。
  • min_p (float, 任意) — トークンの最小確率です。最も確率の高いトークンの確率でスケーリングされます。0.0から1.0の間の値である必要があります。一般的な値は0.01から0.2の範囲です。
  • repetition_penalty (float、任意、デフォルト値は1.0) — プロンプトとこれまでに生成されたテキストにトークンが出現しているかどうかに基づいて、新しいトークンをペナルティする浮動小数点数です。 値が 1.0 より大きい場合、モデルは新しいトークンを使用するよう促され、値が 1.0 より小さい場合、モデルはトークンを繰り返すよう促されます。
  • cache_implementation (str, 任意) — use_vllm が False に設定されている場合、より高速な生成のためのキャッシュメソッドの実装。
  • generation_kwargs (dict[str, Any], 省略可) — 補完のサンプリング時に、GenerationConfig(transformers を使用する場合)または SamplingParams(vLLM を使用する場合)に渡す追加のキーワード引数です。suppress_tokens や num_beams などを設定することで、生成の動作をさらにカスタマイズできます。他の生成パラメータ(min_p や top_p など)と競合するキーが含まれている場合、それらが上書きされます。
  • chat_template_kwargs (dict[str, Any], 省略可) — 補完を生成する際にapply_chat_template関数に渡す追加のキーワード引数。
  • ds3_gather_for_generation (bool、任意、デフォルトは True) — この設定は DeepSpeed ZeRO-3 に適用されます。有効にすると、生成のためにポリシーモデルの重みが集約され、生成速度が向上します。ただし、このオプションを無効にすると、1 つの GPU の VRAM 容量を超えるモデルのトレーニングが可能になりますが、その代わりとして生成速度は低下します。このオプションを無効にすると、vLLM による生成と互換性がありません。

vLLM による生成加速を制御するパラメータ

  • use_vllm (bool、省略可、デフォルトは False) — 補完の生成に vLLM を使用するかどうかを指定します。True に設定すると、デフォルトの model.generate() の代わりに、vLLM を生成に使用します。vllm のインストールが必要です。
  • use_teacher_server (bool、省略可、デフォルトはFalse) — ローカルでの教師モデルのフォワードではなく、実行中の vLLM 生成サーバーから教師の logprobs を計算します。 teacher_model_kind='live'、use_vllm=True、vllm_mode='server'、 distillation_weight=1.0(純粋な蒸留)、およびdistillation_modeが {‘sampled_token’, ‘topk_logits’} のいずれかである場合にのみサポートされます (サーバーは教師の top-k logprobs を返し、完全な語彙は返しませんが、topk_logits は教師自身の top-k サポート上で蒸留を行います)。
  • vllm_mode (str, 省略可、デフォルトは "colocate") — use_vllm が True に設定されている場合の vLLM 統合で使用するモードです。'server' または 'colocate' のいずれかである必要があります。'server': トレーナーが生成リクエストを別の vLLM サーバーに送信します。 vLLM サーバーが実行されていることを確認してください (vllm serve で起動)。 'colocate': vLLM が同じプロセス内で実行され、 トレーニング用の GPU を共有します。これにより別のサーバーの必要性はなくなります が、トレーニングとの間でリソースの競合が発生する可能性があります。
  • vllm_model_impl (str、任意、デフォルトは"vllm") — vLLM に使用するモデル実装です。transformers または vllm のいずれかである必要があります。transformers: モデル実装に transformers バックエンドを使用します。vllm: モデル実装に vllm ライブラリを使用します。
  • vllm_enable_sleep_mode (bool、任意、デフォルトはFalse) — オプティマイザーステップ中に重み/キャッシュをオフロードするために、vLLM のスリープモードを有効にします。GPU メモリ使用率を低く保ちますが、エンジンの復帰時にホストとデバイス間の転送遅延が発生します。
  • vllm_server_base_url (str, 省略可) — vLLM サーバーのベース URL (例: ‘http://localhost:8000’)。指定された場合、vllm_server_host および vllm_server_port は無視されます。
  • vllm_server_host (str、任意、デフォルトは"0.0.0.0") — 接続する vLLM サーバーのホストです。vllm_server_base_url が指定されている場合は無視されます。
  • vllm_server_port (int, 任意, デフォルトは 8000) — 接続する vLLM サーバーのポートです。vllm_server_base_url が指定されている場合は無視されます。
  • vllm_group_port (int, 任意、デフォルトは 51216) — 重み更新グループ用のポート番号です。vLLM サーバーとの通信に使用されます。ポートが占有されていない限り、変更する必要はありません。
  • vllm_server_timeout (float, 省略可能、デフォルト値は 240.0) — vLLM サーバーの起動を待機する合計タイムアウト時間(秒)です。タイムアウト後にサーバーが起動していない場合、ConnectionError が発生します。
  • vllm_tensor_parallel_size (int、任意、デフォルトは 1) — vLLM のテンソル並列サイズを制御します。この設定は、vllm_mode が 'colocate' に設定されている場合にのみ適用されます。vllm_mode='server' を使用している場合は、--vllm_tensor_parallel_size フラグを指定して vLLM サーバーを起動する際に、このパラメータを別途渡す必要があります。
  • vllm_gpu_memory_utilization (float、任意、デフォルト値は 0.3) — vLLM の GPU メモリ使用率を制御します。この設定は、vllm_mode が 'colocate' に設定されている場合にのみ適用されます。vllm_mode='server' を使用している場合は、--vllm_gpu_memory_utilization フラグを指定して vLLM サーバーを起動する際に、このパラメータを別途渡す必要があります。
  • vllm_max_model_length (int, 省略可) — vLLM のコンテキストウィンドウです。データセット内の最大プロンプト長に max_completion_length を加えた値以上を設定してください。省略した場合、モデルの設定から推論されます。

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

  • loss_type (str、任意、デフォルトは "dapo") — 使用する損失関数の形式を指定します。サポートされる値は ‘grpo’、‘bnpo’、‘dr_grpo’、および ‘dapo’ です。‘grpo’: シーケンス長で正規化することにより、トークンレベルの損失を集約します。長さバイアスがあるため推奨されません。このアプローチは、正のアドバンテージを持つ短い補完や、負のアドバンテージを持つ長い補完を優先する傾向があります。‘dapo’ (デフォルト): グローバルに蓄積されたバッチ内のアクティブなトークン数で正規化することにより、トークンレベルの損失を集約します。この手法は、長さバイアスを排除するために DAPO 論文で導入されました。 ‘dr_grpo’: グローバルな定数で正規化することにより、トークンレベルの損失を集約します。この手法は、長さバイアスを排除するために Dr. GRPO 論文で導入されました。この定数の値は max_completion_length に対応します。‘bnpo’: ローカルバッチ内のアクティブなトークン数で正規化することにより、トークンレベルの損失を集約します。正規化はローカルバッチのみに対して行われるため、実効バッチサイズが一定であっても、ローカルバッチサイズによって結果がわずかに異なる場合があります。per_device_train_batch_size==1 を使用する場合、損失は GRPO 損失と同等になります。
  • num_iterations (int、任意、デフォルトは1) — バッチあたりの反復回数(アルゴリズムでは μ と表記されます)。
  • generation_batch_size (int, 省略可) — 生成に使用するバッチサイズ。None の場合、実効的な学習バッチサイズ、すなわち per_device_train_batch_size * num_processes * steps_per_generation がデフォルトとして使用されます。
  • steps_per_generation (int, 任意) — 1回の生成あたりのステップ数。Noneの場合、gradient_accumulation_stepsがデフォルト値として使用されます。
  • mask_truncated_completions (bool、任意、デフォルトはFalse) — 有効にすると、切り詰められた補完は損失計算から除外され、誤ってペナルティを課されることによる学習中のノイズの導入を防ぎます。DAPO論文によると、これは学習の安定性にとって良いプラクティスです。

experimental.sdpo.SDPOTrainer用の設定クラスです。

SDPOTrainer

クラス trl.experimental.sdpo.SDPOTrainer

< >

( model: typing.Union[str, transformers.modeling_utils.PreTrainedModel, torch.nn.Module]reward_funcs: typing.Any | list[typing.Any] | None = Noneargs: trl.experimental.sdpo.sdpo_config.SDPOConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonereward_processing_classes: transformers.tokenization_utils_base.PreTrainedTokenizerBase | list[transformers.tokenization_utils_base.PreTrainedTokenizerBase] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)peft_config = None )

自己蒸留ポリシー最適化(SDPO)用のTrainer。

SDPOは、モデル自身の高報酬トラジェクトリからの自己蒸留によって、オンポリシー最適化を拡張します。外部の教師モデルや明示的な報酬モデルを一切用いずに、トークン化されたフィードバックを密な学習シグナルに変換します。SDPOでは、フィードバックを条件とする現在のモデルを自己教師として扱い、フィードバックを反映した次のトークンの予測をポリシーに蒸留します。

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 = None**kwargs )

パラメータ

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

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

Update on GitHub