# オンライン DPO トレーナー

[![model badge](https://img.shields.io/badge/All_models-Online_DPO-blue)](https://huggingface.co/models?other=online-dpo,trl)

## 概要

Online DPOは、Shangmin Guo、Biao Zhang、Tianlin Liu、Tianqi Liu、Misha Khalman、Felipe Llinares、Alexandre Rame、Thomas Mesnard、Yao Zhao、Bilal Piot、Johan Ferret、Mathieu Blondelによる[Direct Language Model Alignment from Online AI Feedback](https://huggingface.co/papers/2402.04792)で提案されました。

論文の要旨は以下の通りです:

> DPOなどの、好みに基づく直接アライメント（DAP）手法は、個別の報酬モデルを必要としない、人間のフィードバックによる強化学習（RLHF）の効率的な代替手段として最近登場しました。しかし、DAP手法で使用される好みデータセットは通常、学習前に収集され、その後更新されないため、フィードバックは純粋にオフラインとなります。さらに、これらのデータセット内の応答は、アライメント対象のモデルとは異なる言語モデルからサンプリングされることが多く、モデルは学習の過程で進化するため、アライメント段階は必然的にオフポリシーとなります。本研究では、オンラインフィードバックが鍵であり、DAP手法を改善すると仮定しています。我々の手法であるオンラインAIフィードバック（OAIF）は、LLMをアノテーターとして使用します。各学習イテレーションにおいて、現在のモデルから2つの応答をサンプリングし、LLMアノテーターにどちらが好ましいかを選択させるプロンプトを与え、オンラインフィードバックを提供します。そのシンプルさにもかかわらず、複数のタスクにおける人間による評価を通じて、OAIFがオフラインDAP手法およびRLHF手法の両方を上回ることを示しました。さらに、OAIFで活用されるフィードバックは、LLMアノテーターへの指示プロンプトによって容易に制御可能であることを示しました。

このポストトレーニング手法は、[Michael Noukhovitch](https://huggingface.co/mnoukhov)、[Shengyi Costa Huang](https://huggingface.co/vwxyzjn)、[Quentin Gallouédec](https://huggingface.co/qgallouedec)、[Edward Beeching](https://huggingface.co/edbeeching) によって提供されました。

## クイックスタート

この例では、オンラインDPO手法を用いてモデルを学習する方法を示します。ベースモデルには[Qwen 0.5Bモデル](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct)を、報酬モデルには[trl-lib/Qwen2-0.5B-Reward](https://huggingface.co/trl-lib/Qwen2-0.5B-Reward)を使用します。プロンプトには[UltraFeedbackデータセット](https://huggingface.co/datasets/openbmb/UltraFeedback)のものを使用します。データセット内のプロンプトは、こちらで確認できます:

<iframe src="https://huggingface.co/datasets/trl-lib/ultrafeedback-prompt/embed/viewer/default/train?row=0" frameborder="0" width="100%" height="560px"
>

以下は、モデルを学習するためのスクリプトです：

```python
# train_online_dpo.py
from datasets import load_dataset
from trl.experimental.online_dpo import OnlineDPOConfig, OnlineDPOTrainer
from transformers import AutoModelForCausalLM, AutoModelForSequenceClassification, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
reward_model = AutoModelForSequenceClassification.from_pretrained("trl-lib/Qwen2-0.5B-Reward", num_labels=1)
train_dataset = load_dataset("trl-lib/ultrafeedback-prompt", split="train")

training_args = OnlineDPOConfig(output_dir="Qwen2-0.5B-OnlineDPO")
trainer = OnlineDPOTrainer(
    model=model, reward_funcs=reward_model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset
)
trainer.train()
```

以下のコマンドを使用してスクリプトを実行します:

```bash
accelerate launch train_online_dpo.py
```

8つのGPUに分散して学習を実行すると、約1時間かかります。報酬グラフを確認することで、学習の進捗を検証できます。拒否された補完と選択された補完の両方の報酬に上昇傾向が見られる場合、モデルが改善され、時間とともにより良い応答を生成していることを示しています。

![](https://huggingface.co/datasets/trl-lib/documentation-images/resolve/main/online-dpo-qwen2.png)

[学習済みモデル](https://huggingface.co/trl-lib/Qwen2-0.5B-OnlineDPO)の性能を確認するには、[Transformers Chat CLI](https://huggingface.co/docs/transformers/quicktour#chat-with-text-generation-models)を使用できます。

$ transformers chat trl-lib/Qwen2-0.5B-OnlineDPO &lt;quentin_gallouedec&gt;: 最高のプログラミング言語は何ですか？

&lt;trl-lib/Qwen2-0.5B-OnlineDPO&gt;: 最適なプログラミング言語は、あなたの具体的なニーズや優先事項によって異なります。命令型プログラミング言語（HaskellやLispなど）を好む人もいれば、関数型プログラミング言語（ScalaやPythonなど）を好む人もいます。プログラミング言語を選ぶ際には、作業スタイル、プログラミング環境、プロジェクトの要件を考慮することが重要です。

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

Online DPOには、[プロンプトのみを含むデータセット](dataset_formats#prompt-only)（オフラインDPOとは異なり、[選好データセット](dataset_formats#preference)を必要としない）のみが必要です。[experimental.online_dpo.OnlineDPOTrainer](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOTrainer)は、[会話形式](dataset_formats#conversational)と[標準形式](dataset_formats#standard)の両方のデータセット形式をサポートしています。会話形式のデータセットが提供されると、トレーナーは自動的にデータセットにチャットテンプレートを適用します。

## 使用のコツ

### EOSトークンの生成を促す

報酬モデルを使用する場合、指定された長さの範囲内で補完を生成するようにモデルに設定したい場合があります。トレーニング中、モデルは[experimental.online_dpo.OnlineDPOConfig](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOConfig)の`max_new_tokens`引数で指定された最大長まで補完を生成します。最大長に達する前にEOSトークンを生成しなかった場合にモデルをペナルティしたい場合は、[experimental.online_dpo.OnlineDPOConfig](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOConfig)の`missing_eos_penalty`引数を使用できます。

```python
training_args = OnlineDPOConfig(..., max_new_tokens=128, missing_eos_penalty=1.0)
```

### Completionsのロギング

トレーニング中のモデルの動作をより深く理解するために、[LogCompletionsCallback](/docs/trl/main/ja/callbacks#trl.LogCompletionsCallback) を使用してサンプルの補完を定期的に記録できます。

```python
trainer = OnlineDPOTrainer(..., eval_dataset=eval_dataset)
completions_callback = LogCompletionsCallback(trainer, num_prompts=8)
trainer.add_callback(completions_callback)
```

このコールバックは、モデルが生成した補完をWeights & Biasesに直接記録します。

![Logged Completions](https://huggingface.co/datasets/trl-lib/documentation-images/resolve/main/wandb_completions.png)

## 記録されたメトリクス

学習と評価の実行中、以下のメトリクスを記録します。以下は、[Weights and Biasesで追跡された実行の例](https://wandb.ai/huggingface/trl/runs/w4apmsi9)です。

* `objective/kl`: 現在のモデルと参照モデル間の平均Kullback-Leibler (KL) 分散。
* `objective/entropy`: モデルのエントロピーの平均値。モデルが選択するアクションのランダム性を示します。
* `objective/non_score_reward`: スコアに関連しないソースからの平均報酬。基本的には`beta * kl.sum(1)`で、`beta`はKLペナルティ係数、`kl`はトークンごとのKLダイバージェンスです。
* `objective/rlhf_reward`: 平均RLHF報酬です。`scores - non_score_reward`で計算されます。`rlhf_reward`はオンラインDPO学習の最終的な目的です。学習が意図通りに進んでいる場合、この指標は上昇し続けるはずです。
* `objective/scores`: 報酬モデルが返す平均スコア。
* `objective/scores_margin`: 選択された補完と拒否された補完の間の平均スコアマージン（外部報酬モデルによる）。
* `rewards/chosen`: 選択された補完の平均報酬（オンライン DPO の暗黙的な報酬モデルに基づく）。
* `rewards/rejected`: 拒否された補完の平均報酬（オンライン DPO の暗黙的な報酬モデルに基づく）。
* `rewards/accuracies`: オンライン DPO の暗黙的な報酬モデルの正解率。
* `rewards/margins`: 選択された補完と拒否された補完の間の平均リワードマージン（オンライン DPO の暗黙のリワードモデルに基づく）。
* `logps/chosen`: 選択された補完の平均対数確率。
* `logps/rejected`: 拒否された補完の平均対数確率。
* `val/contain_eos_token`: EOS トークンを含む補完の割合。
* `beta`: 参照モデルからの逸脱を表す損失項の重みを制御するパラメータです。通常は固定されますが、[experimental.online_dpo.OnlineDPOConfig](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOConfig) にリストを渡すことで動的に設定できます。

## ベンチマーク実験

オンラインDPOの実装が機能することを確認するために、単一ノードの8 x H100でPythia 1B、2.8B、6.9Bモデルを用いた実験を実行しました。以下は、当時存在していたオンラインDPOのサンプルスクリプト（[`examples/scripts/online_dpo.py`](https://github.com/huggingface/trl/blob/v1.10.0/examples/scripts/online_dpo.py)、現在は削除済み）を使用して実験を実行するために使用したコマンドです。再現するには、v1.10.0のチェックアウト（`git checkout v1.10.0`）から実行してください。SFT / RMモデルは、[The N+ Implementation Details of RLHF with PPO: A Case Study on TL;DR Summarization](https://huggingface.co/papers/2403.17031)から直接取得しています。

```shell
# 1B Online DPO experiment
accelerate launch --config_file examples/accelerate_configs/multi_gpu.yaml \
    examples/scripts/online_dpo.py \
    --model_name_or_path trl-lib/pythia-1b-deduped-tldr-sft  \
    --reward_model_path trl-lib/pythia-1b-deduped-tldr-rm \
    --dataset_name trl-lib/tldr \
    --learning_rate 5.0e-7 \
    --output_dir pythia-1b-deduped-tldr-online-dpo \
    --beta 0.1 \
    --per_device_train_batch_size 8 \
    --gradient_accumulation_steps 2 \
    --num_train_epochs 3 \
    --max_new_tokens 53 \
    --warmup_steps 0.1 \
    --missing_eos_penalty 1.0 \
    --save_steps 0.1 \
    --push_to_hub

# 2.8B Online DPO experiment
accelerate launch --config_file examples/accelerate_configs/deepspeed_zero2.yaml \
    examples/scripts/online_dpo.py \
    --model_name_or_path trl-lib/pythia-2.8b-deduped-tldr-sft  \
    --reward_model_path trl-lib/pythia-2.8b-deduped-tldr-rm \
    --dataset_name trl-lib/tldr \
    --learning_rate 5.0e-7 \
    --output_dir pythia-2.8b-deduped-tldr-online-dpo \
    --beta 0.1 \
    --per_device_train_batch_size 8 \
    --gradient_accumulation_steps 2 \
    --num_train_epochs 3 \
    --max_new_tokens 53 \
    --warmup_steps 0.1 \
    --missing_eos_penalty 1.0 \
    --save_steps 0.1 \
    --push_to_hub

# 6.9B Online DPO experiment
accelerate launch --config_file examples/accelerate_configs/deepspeed_zero2.yaml \
    examples/scripts/online_dpo.py \
    --model_name_or_path trl-lib/pythia-6.9b-deduped-tldr-sft  \
    --reward_model_path trl-lib/pythia-6.9b-deduped-tldr-rm \
    --dataset_name trl-lib/tldr \
    --learning_rate 5.0e-7 \
    --output_dir pythia-6.9b-deduped-tldr-online-dpo \
    --beta 0.1 \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --num_train_epochs 3 \
    --max_new_tokens 53 \
    --warmup_steps 0.1 \
    --missing_eos_penalty 1.0 \
    --save_steps 0.1 \
    --push_to_hub
```

チェックポイントと実験の追跡は、以下の場所で利用できます:

* [🤗 モデルチェックポイント](https://huggingface.co/collections/trl-lib/online-dpo-66acd3fa38a331a9cd457b07)
* [🐝 追跡された実験](https://wandb.ai/huggingface/trl/reports/Online-DPO-experiments-for-TL-DR-summarisation--Vmlldzo5MTczMDU0)

モデルサイズを拡大するにつれて、オンラインDPOのチェックポイントの勝率は向上しています。これは、オンラインDPOの実装が意図した通りに機能していることを示す良い兆候です。

## OnlineDPOTrainer[[trl.experimental.online_dpo.OnlineDPOTrainer]]

#### trl.experimental.online_dpo.OnlineDPOTrainer[[trl.experimental.online_dpo.OnlineDPOTrainer]]

```python
trl.experimental.online_dpo.OnlineDPOTrainer(model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str], ref_model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, NoneType] = None, reward_funcs: str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]] | list[str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]]] | None = None, args: trl.experimental.online_dpo.online_dpo_config.OnlineDPOConfig | None = None, data_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = None, train_dataset: typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset, NoneType] = None, eval_dataset: typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset, dict[str, typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset]], NoneType] = None, processing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = None, reward_processing_classes: transformers.tokenization_utils_base.PreTrainedTokenizerBase | list[transformers.tokenization_utils_base.PreTrainedTokenizerBase] | None = None, peft_config: PeftConfig | None = None, compute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = None, callbacks: list[transformers.trainer_callback.TrainerCallback] | None = None, optimizers: tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None), preprocess_logits_for_metrics: collections.abc.Callable[[torch.Tensor, torch.Tensor], torch.Tensor] | None = None)
```

[ソース](https://github.com/huggingface/trl/blob/main/trl/experimental/online_dpo/online_dpo_trainer.py#L94)

**パラメータ:**

model (`str | nn.Module | PreTrainedModel`) : 学習対象のモデル。以下のいずれかです。 - 文字列。huggingface.co のモデルリポジトリにホストされている事前学習モデルの *model id*、または [save_pretrained](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.save_pretrained) を使用してモデルの重みを保存した *ディレクトリ* へのパス。例: `'./my_model_directory/'`。モデルは `args.model_init_kwargs` のキーワード引数を使用して [from_pretrained](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoModelForCausalLM.from_pretrained) で読み込まれます。 - [PreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel) オブジェクト。causal language model のみサポートされています。

ref_model ([PreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel) または `torch.nn.Module` または `None`) : 学習に使用する参照モデル。None が指定された場合、モデルから参照モデルが作成されます。

reward_funcs (`RewardFunc | list[RewardFunc]`) : 報酬の計算に使用する報酬関数です。報酬を計算するには、プロンプトと補完を引数としてすべての報酬関数を呼び出し、得られた報酬を合計します。以下のいずれかになります。 - 単一の報酬関数: 文字列（モデルへのパス）、[PreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel)、またはカスタムの呼び出し可能関数にできます。 - 報酬関数のリスト: すべてが互換性のある型である必要があります。

args ([experimental.online_dpo.OnlineDPOConfig](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOConfig)) : 学習に使用するオンライン DPO の設定引数。

data_collator (`DataCollator`) : 学習に使用するデータコラレーター。None が指定されている場合、デフォルトのデータコラレーター (`experimental.utils.DPODataCollatorWithPadding`) が使用されます。このデフォルトのデータコラレーターは、ペアのシーケンスからなるデータセットに対して、バッチ内のシーケンスの最大長までシーケンスをパディングします。

train_dataset ([Dataset](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset) または [IterableDataset](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.IterableDataset)) : 学習に使用するデータセット。

eval_dataset ([Dataset](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset)、[IterableDataset](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.IterableDataset) または `dict[str, Dataset | IterableDataset]`) : 評価に使用するデータセット。

processing_class ([PreTrainedTokenizerBase](https://huggingface.co/docs/transformers/main/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase) または [ProcessorMixin](https://huggingface.co/docs/transformers/main/en/main_classes/processors#transformers.ProcessorMixin)、*任意*) : データを処理するために使用される処理クラス。指定された場合、モデルの入力を自動的に処理するために使用され、中断されたトレーニングを再開したり、ファインチューニングされたモデルを再利用したりしやすくするために、モデルとともに保存されます。

reward_processing_classes ([PreTrainedTokenizerBase](https://huggingface.co/docs/transformers/main/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase) または `list[PreTrainedTokenizerBase]`、*optional*) : `reward_funcs` で指定された報酬関数に対応する処理クラスです。以下のいずれかになります。 - 単一の処理クラス: `reward_funcs` に報酬関数が1つしかない場合に使用します。 - 処理クラスのリスト: `reward_funcs` 内の報酬関数の順序と長さに一致する必要があります。 `None` に設定した場合、各モデルベースの報酬関数について、[from_pretrained](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer.from_pretrained) を使用してトークナイザーが自動的に読み込まれます。

peft_config ([PeftConfig](https://huggingface.co/docs/peft/main/en/package_reference/config#peft.PeftConfig)、*任意*) : モデルをラップするために使用されるPEFT設定。`None`の場合、モデルはラップされません。

compute_metrics (`Callable[[EvalPrediction], dict]`、*任意*) : 指標を計算するために使用する関数。`EvalPrediction` を受け取り、文字列から指標の値への辞書を返す必要があります。

callbacks (`list[transformers.TrainerCallback]`) : 学習に使用するコールバックです。

optimizers (`tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]`) : 学習に使用するオプティマイザーとスケジューラー。

preprocess_logits_for_metrics (`Callable[[torch.Tensor, torch.Tensor], torch.Tensor]`) : メトリクスの計算前に logits を前処理するために使用する関数。

OnlineDPOTrainerを初期化します。

#### train[[trl.experimental.online_dpo.OnlineDPOTrainer.train]]

```python
train(resume_from_checkpoint: str | bool | None = None, trial: optuna.Trial | dict[str, Any] | None = None, ignore_keys_for_eval: list[str] | None = None)
```

[ソース](https://github.com/huggingface/trl/blob/main/transformers/trainer.py#L1447)

**パラメータ:**

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[[trl.experimental.online_dpo.OnlineDPOTrainer.save_model]]

```python
save_model(output_dir: str | None = None, _internal_call: bool = False)
```

[ソース](https://github.com/huggingface/trl/blob/main/transformers/trainer.py#L4036)

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

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

#### push_to_hub[[trl.experimental.online_dpo.OnlineDPOTrainer.push_to_hub]]

```python
push_to_hub(commit_message: str | None = 'End of training', blocking: bool = True, token: str | None = None, revision: str | None = None, **kwargs)
```

[ソース](https://github.com/huggingface/trl/blob/main/transformers/trainer.py#L4307)

**パラメータ:**

commit_message (`str`、*任意*、デフォルトは`"End of training"`) : push 時にコミットするメッセージ。

blocking (`bool`、*任意*、デフォルトは`True`) : `git push`が完了した後にのみ関数が返すかどうか。

token (`str`、*任意*、デフォルトは`None`) : Trainer の元の引数を上書きするための、書き込み権限を持つトークン。

revision (`str`, *任意*) : コミット元の git リビジョンです。デフォルトでは "main" ブランチの先頭です。

kwargs (`dict[str, Any]`、*省略可能*) : `~Trainer.create_model_card` に渡される追加のキーワード引数。

**戻り値:**

`blocking=False`の場合、モデルがプッシュされたリポジトリのURL、または`blocking=True`の場合、コミットの進捗を追跡する`Future`オブジェクトを返します。

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

## OnlineDPOConfig[[trl.experimental.online_dpo.OnlineDPOConfig]]

#### trl.experimental.online_dpo.OnlineDPOConfig[[trl.experimental.online_dpo.OnlineDPOConfig]]

```python
trl.experimental.online_dpo.OnlineDPOConfig(output_dir: str | None = None, per_device_train_batch_size: int = 8, num_train_epochs: float = 3.0, max_steps: int = -1, learning_rate: float = 5e-07, lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear', lr_scheduler_kwargs: dict | str | None = None, warmup_steps: float = 0, optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused', optim_args: str | None = None, weight_decay: float = 0.0, adam_beta1: float = 0.9, adam_beta2: float = 0.999, adam_epsilon: float = 1e-08, optim_target_modules: None | str | list[str] = None, gradient_accumulation_steps: int = 1, average_tokens_across_devices: bool = True, max_grad_norm: float = 1.0, label_smoothing_factor: float = 0.0, bf16: bool | None = None, fp16: bool = False, bf16_full_eval: bool = False, fp16_full_eval: bool = False, tf32: bool | None = None, gradient_checkpointing: bool = True, gradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = None, torch_compile: bool = False, torch_compile_backend: str | None = None, torch_compile_mode: str | None = None, use_liger_kernel: bool = False, liger_kernel_config: dict[str, bool] | None = None, use_cache: bool = False, neftune_noise_alpha: float | None = None, torch_empty_cache_steps: int | None = None, auto_find_batch_size: bool = False, logging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps', logging_steps: float = 10, logging_first_step: bool = False, log_on_each_node: bool = True, logging_nan_inf_filter: bool = True, include_num_input_tokens_seen: str | bool = 'no', log_level: str = 'passive', log_level_replica: str = 'warning', disable_tqdm: bool | None = None, report_to: None | str | list[str] = 'none', run_name: str | None = None, project: str = 'huggingface', trackio_space_id: str | None = None, trackio_bucket_id: str | None = None, trackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = None, eval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no', eval_steps: float | None = None, eval_delay: float = 0, per_device_eval_batch_size: int = 8, prediction_loss_only: bool = False, eval_on_start: bool = False, eval_do_concat_batches: bool = True, eval_use_gather_object: bool = False, eval_accumulation_steps: int | None = None, include_for_metrics: list[str] = <factory>, batch_eval_metrics: bool = False, save_only_model: bool = False, save_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps', save_steps: float = 500, save_on_each_node: bool = False, save_total_limit: int | None = None, enable_jit_checkpoint: bool = False, push_to_hub: bool = False, hub_token: str | None = None, hub_private_repo: bool | None = None, hub_model_id: str | None = None, hub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save', hub_always_push: bool = False, hub_revision: str | None = None, load_best_model_at_end: bool = False, metric_for_best_model: str | None = None, greater_is_better: bool | None = None, ignore_data_skip: bool = False, restore_callback_states_from_checkpoint: bool = False, full_determinism: bool = False, seed: int = 42, data_seed: int | None = None, use_cpu: bool = False, accelerator_config: dict | str | None = None, parallelism_config: accelerate.parallelism_config.ParallelismConfig | None = None, dataloader_drop_last: bool = False, dataloader_num_workers: int = 0, dataloader_pin_memory: bool = True, dataloader_persistent_workers: bool = False, dataloader_prefetch_factor: int | None = None, dataloader_multiprocessing_context: str | None = None, dataloader_in_order: bool = True, remove_unused_columns: bool = False, label_names: list[str] | None = None, train_sampling_strategy: str = 'random', length_column_name: str = 'length', ddp_find_unused_parameters: bool | None = None, ddp_bucket_cap_mb: int | None = None, ddp_broadcast_buffers: bool | None = None, ddp_static_graph: bool | None = None, ddp_backend: str | None = None, ddp_timeout: int = 1800, fsdp: str | None = None, fsdp_config: dict[str, typing.Any] | str | None = None, deepspeed: dict | str | None = None, debug: str | list[transformers.debug_utils.DebugOption] = '', skip_memory_metrics: bool = True, do_train: bool = False, do_eval: bool = False, do_predict: bool = False, resume_from_checkpoint: str | None = None, local_rank: int = -1, reward_model_path: str | None = None, max_new_tokens: int = 64, max_length: int = 512, temperature: float = 0.9, top_p: float = 1.0, top_k: int = 0, min_p: float | None = None, repetition_penalty: float = 1.0, generation_kwargs: dict | None = None, cache_implementation: str | None = None, missing_eos_penalty: float | None = None, beta: list[float] = <factory>, loss_type: str = 'sigmoid', disable_dropout: bool = True, use_vllm: bool = False, vllm_model_impl: str = 'vllm', vllm_structured_outputs_regex: str | None = None, vllm_gpu_memory_utilization: float | None = 0.55, vllm_mode: str = 'colocate', vllm_server_base_url: str | None = None, vllm_server_host: str = '0.0.0.0', vllm_server_port: int = 8000, vllm_server_timeout: float = 240.0, vllm_group_port: int = 51216, vllm_tensor_parallel_size: int = 1, vllm_enable_sleep_mode: bool = False, ds3_gather_for_generation: bool = True, model_init_kwargs: dict[str, typing.Any] | str | None = None, trust_remote_code: bool = False, reward_weights: list[float] | None = None)
```

[ソース](https://github.com/huggingface/trl/blob/main/trl/experimental/online_dpo/online_dpo_config.py#L23)

**パラメータ:**

reward_model_path (`str`, *任意*) : 報酬モデルへのパス。

max_new_tokens (`int`、*optional*、デフォルトは`64`) : 1回の補完で生成するトークンの最大数。

max_length (`int`、*optional*、デフォルトは`512`) : 対数尤度を計算するために使用されるシーケンス（プロンプト + 補完）の最大総長です。シーケンスがこの上限を超えた場合、補完部分をできるだけ多く保持するために、左端のトークンが切り捨てられます。入力に画像が含まれている場合は、切り捨てによって画像トークンが失われるため、この設定は適用されません。

temperature (`float`、*任意*、デフォルトは`0.9`) : サンプリング用の温度です。温度が高いほど、生成される補完はランダムになります。

missing_eos_penalty (`float`, *任意*) : モデルが EOS トークンを生成できなかった場合にスコアに適用されるペナルティです。これにより、最大長（`max_new_tokens`）より短い補完を生成することを促すのに役立ちます。ペナルティは正の値でなければなりません。

beta (`float` または `list[float]`、*任意*、デフォルトは `0.1`) : 参照モデルからの逸脱を制御するパラメータです。β が大きいほど、参照モデルからの逸脱は少なくなります。IPO ロス (`loss_type="ipo"`) の場合、β は [論文](https://huggingface.co/papers/2310.12036) で τ と表記される正則化パラメータです。float のリストが指定された場合、各新しいエポックごとに β が選択され、最後の β が残りのエポックで使用されます。

loss_type (`str`, *任意*, デフォルトは `"sigmoid"`) : 使用する損失の種類。指定可能な値は以下の通りです: - `"sigmoid"`: 元の [DPO](https://huggingface.co/papers/2305.18290) 論文の sigmoid 損失。 - `"ipo"`: [IPO](https://huggingface.co/papers/2310.12036) 論文の IPO 損失。

disable_dropout (`bool`、*任意*、デフォルトは`True`) : モデルとリファレンスモデルのdropoutを無効にするかどうか。

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

top_p (`float`、*optional*、デフォルトは`1.0`) : 考慮する上位トークンの累積確率を制御する浮動小数点数です。値は(0, 1]の範囲でなければなりません。すべてのトークンを考慮するには`1.0`に設定してください。

top_k (`int`、*optional*、デフォルトは`0`) : top-kフィルタリングのために保持する、確率の高い語彙トークンの数。`0`の場合、top-kフィルタリングは無効になり、すべてのトークンが考慮されます。

min_p (`float`, *optional*) : 最小トークン確率です。最も確率の高いトークンの確率でスケーリングされます。`0.0` から `1.0` までの値である必要があります。一般的な値は `0.01-0.2` の範囲です。

repetition_penalty (`float`、*optional*、デフォルトは`1.0`) : プロンプトとこれまでに生成されたテキストにトークンが出現しているかどうかに基づいて、新しいトークンをペナルティする浮動小数点数です。値が`1.0`より大きい場合、モデルは新しいトークンを使用するよう促され、値が`1.0`より小さい場合、モデルはトークンを繰り返すよう促されます。

cache_implementation (`str`, *任意*) : `use_vllm` が `False` に設定されている場合、より高速な生成のためのキャッシュメソッドの実装。

generation_kwargs (`dict[str, Any]`, *任意*) : 補完をサンプリングする際に、[GenerationConfig](https://huggingface.co/docs/transformers/main/en/main_classes/text_generation#transformers.GenerationConfig)（transformers を使用する場合）または `SamplingParams`（vLLM を使用する場合）に渡す追加のキーワード引数です。`suppress_tokens` や `num_beams` を設定するなど、生成の動作をさらにカスタマイズするために使用できます。他の生成パラメータ（`min_p` や `top_p` など）と競合するキーが含まれている場合、それらが上書きされます。

**vLLM による生成の高速化を制御するパラメータ:**

use_vllm (`bool`、*任意*、デフォルトは`False`) : 補完の生成に vLLM を使用するかどうか。これを`True`に設定すると、トレーナーはデフォルトの model.generate() の代わりに vLLM を生成に使用します。`vllm`のインストールが必要です。

vllm_model_impl (`str`、*任意*、デフォルトは`"vllm"`) : vLLMで使用するモデル実装です。`"transformers"`または`"vllm"`のいずれかである必要があります。`"transformers"`: モデル実装に`transformers`バックエンドを使用します。`"vllm"`: モデル実装に`vllm`ライブラリを使用します。

vllm_mode (`str`, *任意*, デフォルトは `"colocate"`) : `use_vllm` が `True` に設定されている場合の vLLM 統合で使用するモードです。 `"server"` または `"colocate"` のいずれかである必要があります。 - `"server"`: トレーナーが生成リクエストを別の vLLM サーバーに送信します。 vLLM サーバーが実行されていることを確認してください（`vllm serve` で起動します）。 - `"colocate"`: vLLM が同じプロセス内で実行され、トレーニング用の GPU を共有します。 別のサーバーは不要ですが、トレーニングとの間でリソースの競合が発生する可能性があります。

vllm_structured_outputs_regex (`str`, *任意*) : vLLMの構造化出力用の正規表現。`None`（デフォルト）の場合、構造化出力は無効になります。

**vLLMサーバーを制御するパラメータ（`vllm_mode`が`"server"`の場合のみ使用）:**

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_server_timeout (`float`、*任意*、デフォルトは`240.0`) : vLLMサーバーが起動するまで待機する合計タイムアウト時間（秒）。タイムアウト後にサーバーが起動していない場合、`ConnectionError`が発生します。

vllm_group_port (`int`、*optional*、デフォルトは`51216`) : 重み更新グループのポート番号です。vLLMサーバーとの通信に使用されます。ポートが占有されていない限り、変更する必要はありません。

**colocateされたvLLMの実行を制御するパラメータ（`vllm_mode`が`"colocate"`の場合にのみ使用）:**

vllm_gpu_memory_utilization (`float`、*任意*、デフォルトは`0.55`) : vLLM の GPU メモリ使用率を制御します。この設定は、`vllm_mode` が `"colocate"` に設定されている場合にのみ適用されます。`vllm_mode="server"` を使用している場合は、`--vllm_gpu_memory_utilization` フラグを指定して vLLM サーバーを起動する際に、このパラメータを別途渡す必要があります。

vllm_tensor_parallel_size (`int`、*任意*、デフォルトは`1`) : vLLM のテンソル並列サイズを制御します。この設定は、`vllm_mode` が `"colocate"` に設定されている場合にのみ適用されます。`vllm_mode="server"` を使用している場合は、`--vllm_tensor_parallel_size` フラグを指定して vLLM サーバーを起動する際に、このパラメータを別途渡す必要があります。

vllm_enable_sleep_mode (`bool`、*任意*、デフォルトは`False`) : オプティマイザーステップ中に重み/キャッシュをオフロードするための vLLM のスリープモードを有効にします。GPU メモリ使用量を低く保ちますが、エンジンの復帰時にホストとデバイス間の転送遅延が発生します。

**その他のパラメータ:**

ds3_gather_for_generation (`bool`、*任意*、デフォルトは`True`) : この設定はDeepSpeed ZeRO-3に適用されます。有効にすると、生成のためにポリシーモデルの重みが集約され、生成速度が向上します。ただし、このオプションを無効にすると、単一GPUのVRAM容量を超えるモデルのトレーニングが可能になりますが、生成速度が遅くなるという代償があります。このオプションの無効化は、vLLMによる生成と互換性がありません。

model_init_kwargs (`dict[str, Any]`、*省略可*) : 文字列からモデルをインスタンス化する際に`AutoModelForCausalLM.from_pretrained`に渡すキーワード引数です。`revision`の値は、報酬処理クラスの読み込み時にも使用されます。

trust_remote_code (`bool`、*任意*、デフォルトは`False`) : HubからカスタムPythonコードを同梱したモデルの読み込みを許可するかどうか。[from_pretrained](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoModelForCausalLM.from_pretrained)に転送されます。報酬モデルおよび報酬トークナイザーの読み込みにも適用されます。

reward_weights (`list[float]`, *optional*) : 複数の報酬関数を組み合わせるための重みです。報酬関数の数と一致する必要があります。`None`の場合、すべての報酬関数が等しく重み付けされます。

[experimental.online_dpo.OnlineDPOTrainer](/docs/trl/main/ja/online_dpo_trainer#trl.experimental.online_dpo.OnlineDPOTrainer)の構成クラスです。

このクラスには、Online DPO 学習に固有のパラメータのみが含まれます。学習引数の完全なリストについては、[TrainingArguments](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments)のドキュメントを参照してください。なお、このクラスのデフォルト値は、[TrainingArguments](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments)のものと異なる場合があります。

[HfArgumentParser](https://huggingface.co/docs/transformers/main/en/internal/trainer_utils#transformers.HfArgumentParser) を使用すると、このクラスをコマンドラインで指定できる [argparse](https://docs.python.org/3/library/argparse#module-argparse) の引数に変換できます。

> [!NOTE]
> これらのパラメータは、[TrainingArguments](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments)とは異なるデフォルト値を持っています: - `logging_steps`: `500`ではなく、デフォルトで`10`になります。 - `gradient_checkpointing`: `False`ではなく、デフォルトで`True`になります。 - `bf16`: `fp16`が設定されていない場合、`False`ではなく、デフォルトで`True`になります。 - `learning_rate`: `5e-5`ではなく、デフォルトで`5e-7`になります。 - `remove_unused_columns`: `True`ではなく、デフォルトで`False`になります。

