TRL documentation

Entraîneur DPO en ligne

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

Entraîneur DPO en ligne

model badge

Aperçu

Le DPO en ligne a été proposé dans Direct Language Model Alignment from Online AI Feedback par Shangmin Guo, Biao Zhang, Tianlin Liu, Tianqi Liu, Misha Khalman, Felipe Llinares, Alexandre Rame, Thomas Mesnard, Yao Zhao, Bilal Piot, Johan Ferret et Mathieu Blondel.

L'abstract de l'article est le suivant :

Les méthodes d’alignement direct à partir de préférences (DAP), telles que DPO, sont récemment apparues comme des alternatives efficaces à l’apprentissage par renforcement à partir de retours humains (RLHF), car elles ne nécessitent pas de modèle de récompense distinct. Toutefois, les jeux de données de préférences utilisés dans les méthodes DAP sont généralement collectés avant l’entraînement et ne sont jamais mis à jour, si bien que le retour est purement hors ligne. De plus, les réponses de ces jeux de données sont souvent échantillonnées à partir d’un modèle de langage distinct de celui qui est aligné, et comme le modèle évolue au fil de l’entraînement, la phase d’alignement est inévitablement hors politique. Dans cette étude, nous posons que le retour en ligne est essentiel et améliore les méthodes DAP. Notre méthode, le retour d’IA en ligne (OAIF), utilise un LLM comme annotateur : à chaque itération d’entraînement, nous échantillonnons deux réponses du modèle actuel et demandons à l’annotateur LLM de choisir laquelle est préférée, fournissant ainsi un retour en ligne. Malgré sa simplicité, nous démontrons par une évaluation humaine sur plusieurs tâches que OAIF surpasse à la fois les méthodes DAP hors ligne et RLHF. Nous montrons par ailleurs que le retour exploité dans OAIF est facilement contrôlable, via des invites d’instructions à l’annotateur LLM.

Cette méthode de post-entraînement a été proposée par Michael Noukhovitch, Shengyi Costa Huang, Quentin Gallouédec et Edward Beeching.

Démarrage rapide

Cet exemple montre comment entraîner un modèle à l'aide de la méthode DPO en ligne. Nous utilisons le modèle Qwen 0.5B comme modèle de base et le modèle de récompense trl-lib/Qwen2-0.5B-Reward. Nous utilisons les prompts du jeu de données UltraFeedback. Vous pouvez consulter les prompts du jeu de données ici :

Voici le script pour entraîner le modèle :

# 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()

Exécutez le script à l'aide de la commande suivante :

accelerate launch train_online_dpo.py

Réparti sur 8 GPU, l’entraînement prend environ 1 heure. Vous pouvez vérifier la progression de l’entraînement en consultant le graphique de la récompense. Une tendance à la hausse de la récompense pour les complétions rejetées et choisies indique que le modèle s’améliore et génère de meilleures réponses au fil du temps.

Pour voir les performances du modèle entraîné, vous pouvez utiliser le Transformers Chat CLI.

$ transformers chat trl-lib/Qwen2-0.5B-OnlineDPO
<quentin_gallouedec>:
What is the best programming language?

<trl-lib/Qwen2-0.5B-OnlineDPO>:
The best programming language depends on your specific needs and priorities. Some people prefer imperative programming languages (like Haskell or Lisp), while others prefer functional programming languages (like Scala or Python). It's important to consider your work style, programming environment, and project requirements when choosing a programming language.

Type de jeu de données attendu

Le DPO en ligne n’exige qu’un jeu de données de prompts (contrairement au DPO hors ligne, qui s’attend à un jeu de données de préférences). Le experimental.online_dpo.OnlineDPOTrainer prend en charge les formats de jeu de données conversationnels et standards. Lorsqu’un jeu de données conversationnel est fourni, l’entraîneur applique automatiquement le modèle de chat au jeu de données.

Conseils d'utilisation

Encourager la génération du jeton EOS

Lors de l'utilisation d'un modèle de récompense, on peut souhaiter que le modèle génère des complétions dans une longueur donnée. Pendant l'entraînement, le modèle génère des complétions jusqu'à la longueur maximale spécifiée dans l'argument max_new_tokens de experimental.online_dpo.OnlineDPOConfig. Si vous souhaitez pénaliser le modèle pour ne pas générer de jeton EOS avant d'atteindre la longueur maximale, vous pouvez utiliser l'argument missing_eos_penalty de experimental.online_dpo.OnlineDPOConfig :

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

Journalisation des complétions

Pour mieux comprendre le comportement de votre modèle pendant l’entraînement, vous pouvez enregistrer périodiquement des complétions d’échantillons à l’aide du LogCompletionsCallback.

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

Ce rappel journalise les complétions générées par le modèle directement dans Weights & Biases.

Logged Completions

Métriques journalisées

Lors de l’entraînement et de l’évaluation, nous enregistrons les métriques suivantes. Voici un exemple d’exécution suivie sur Weights and Biases

  • objective/kl : divergence de Kullback-Leibler (KL) moyenne entre le modèle actuel et le modèle de référence.
  • objective/entropy : l'entropie moyenne du modèle, indiquant le caractère aléatoire des actions choisies par le modèle.
  • objective/non_score_reward : La récompense moyenne provenant de sources non liées au score, soit beta * kl.sum(1), où beta est le coefficient de pénalité KL et kl est la divergence KL par jeton.
  • objective/rlhf_reward : la récompense RLHF moyenne, qui est scores - non_score_reward. La rlhf_reward est l'objectif ultime de l'entraînement DPO en ligne. Si l'entraînement fonctionne comme prévu, cette métrique devrait continuer à augmenter.
  • objective/scores : Les scores moyens renvoyés par le modèle de récompense.
  • objective/scores_margin : Marge de score moyenne (selon le modèle de récompense externe) entre les complétions choisies et rejetées.
  • rewards/chosen : La récompense moyenne (selon le modèle de récompense implicite de l’online DPO) des complétions choisies.
  • rewards/rejected : La récompense moyenne (selon le modèle de récompense implicite de l’online DPO) des complétions rejetées.
  • rewards/accuracies : Les précisions du modèle de récompense implicite de l’online DPO.
  • rewards/margins : Marge de récompense moyenne (selon le modèle de récompense implicite du DPO en ligne) entre les complétions choisies et rejetées.
  • logps/chosen : Probabilités logiques moyennes des complétions choisies.
  • logps/rejected : Probabilités logiques moyennes des complétions rejetées.
  • val/contain_eos_token : La proportion de complétions contenant un jeton EOS.
  • beta : Le paramètre qui contrôle le poids du terme de perte représentant l'écart par rapport au modèle de référence. Généralement fixe, mais peut être rendu dynamique en passant une liste à experimental.online_dpo.OnlineDPOConfig.

Expériences de référence

Pour valider que l’implémentation de DPO en ligne fonctionne, nous avons mené des expériences avec les modèles Pythia 1B, 2.8B et 6.9B sur un nœud unique de 8 x H100. Voici les commandes que nous avons utilisées pour lancer les expériences, avec le script d’exemple de DPO en ligne tel qu’il existait à l’époque (examples/scripts/online_dpo.py, supprimé depuis) — pour les reproduire, exécutez depuis un checkout v1.10.0 (git checkout v1.10.0). Nous utilisons directement les modèles SFT / RM de The N+ Implementation Details of RLHF with PPO: A Case Study on TL;DR Summarization.

# 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

Les points de contrôle et le suivi des expériences sont disponibles à l'adresse suivante :

Le taux de victoire du point de contrôle DPO en ligne augmente à mesure que nous augmentons la taille des modèles. C'est un bon signe que l'implémentation DPO en ligne fonctionne comme prévu.

OnlineDPOTrainer

classe 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] = Nonereward_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 = Noneargs: trl.experimental.online_dpo.online_dpo_config.OnlineDPOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset, NoneType] = Noneeval_dataset: typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset, dict[str, typing.Union[datasets.arrow_dataset.Dataset, torch.utils.data.IterableDataset]], NoneType] = 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 = Nonepeft_config: PeftConfig | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: 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 )

Paramètres

  • model (str | nn.Module | PreTrainedModel) — Modèle à entraîner. Peut être soit :
    • Une chaîne de caractères, correspondant à l'identifiant du modèle d'un modèle pré-entraîné hébergé dans un dépôt de modèles sur huggingface.co, ou à un chemin vers un dossier contenant les poids du modèle enregistrés à l'aide de save_pretrained, par exemple './my_model_directory/'. Le modèle est chargé à l'aide de from_pretrained avec les arguments par mot-clé de args.model_init_kwargs.
    • Un objet PreTrainedModel. Seuls les modèles de langage causaux sont pris en charge.
  • ref_model (PreTrainedModel ou torch.nn.Module ou None) — Le modèle de référence à utiliser pour l’entraînement. Si None est spécifié, le modèle de référence sera créé à partir du modèle.
  • reward_funcs (RewardFunc | list[RewardFunc]) — Fonctions de récompense à utiliser pour le calcul des récompenses. Pour calculer les récompenses, nous appelons toutes les fonctions de récompense avec les prompts et les complétions, puis nous additionnons les récompenses. Peut être soit :
    • Une fonction de récompense unique : peut être une chaîne de caractères (chemin vers le modèle), un PreTrainedModel ou une fonction callable personnalisée.
    • Une liste de fonctions de récompense : toutes doivent être de types compatibles.
  • args (experimental.online_dpo.OnlineDPOConfig) — Les arguments de configuration DPO en ligne à utiliser pour l’entraînement.
  • data_collator (DataCollator) — Le collateur de données à utiliser pour l’entraînement. Si None est spécifié, le collateur de données par défaut (experimental.utils.DPODataCollatorWithPadding) sera utilisé, ce qui rembourra les séquences jusqu’à la longueur maximale des séquences du lot, étant donné un jeu de données de séquences appariées.
  • train_dataset (Dataset ou IterableDataset) — Le jeu de données à utiliser pour l’entraînement.
  • eval_dataset (Dataset, IterableDataset ou dict[str, Dataset | IterableDataset]) — Le jeu de données à utiliser pour l'évaluation.
  • processing_class (PreTrainedTokenizerBase ou ProcessorMixin, facultatif) — Classe de traitement utilisée pour traiter les données. Si fournie, elle sera utilisée pour traiter automatiquement les entrées du modèle et sera enregistrée avec le modèle afin de faciliter la reprise d'une formation interrompue ou la réutilisation du modèle affiné.
  • reward_processing_classes (PreTrainedTokenizerBase ou list[PreTrainedTokenizerBase], facultatif) — Classes de traitement correspondant aux fonctions de récompense spécifiées dans reward_funcs. Peut être soit :
    • Une seule classe de traitement : utilisée lorsque reward_funcs ne contient qu'une seule fonction de récompense.
    • Une liste de classes de traitement : doit correspondre à l'ordre et à la longueur des fonctions de récompense dans reward_funcs.

    Si défini sur None, le tokenizer de chaque fonction de récompense basée sur un modèle est chargé automatiquement à l’aide de from_pretrained.

  • peft_config (PeftConfig, facultatif) — Configuration PEFT utilisée pour envelopper le modèle. Si None, le modèle n'est pas enveloppé.
  • compute_metrics (Callable[[EvalPrediction], dict], facultatif) — La fonction à utiliser pour calculer les métriques. Elle doit prendre un EvalPrediction et renvoyer un dictionnaire de chaînes vers les valeurs des métriques.
  • callbacks (list[transformers.TrainerCallback]) — Les callbacks à utiliser pour l'entraînement.
  • optimizers (tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]) — L’optimiseur et le planificateur à utiliser pour l’entraînement.
  • preprocess_logits_for_metrics (Callable[[torch.Tensor, torch.Tensor], torch.Tensor]) — La fonction à utiliser pour prétraiter les logits avant de calculer les métriques.

Initialiser OnlineDPOTrainer.

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

Paramètres

  • resume_from_checkpoint (str ou bool, facultatif) — Si c'est une str, chemin local d'un point de contrôle enregistré par une instance précédente de Trainer. Si c'est un bool et vaut True, charge le dernier point de contrôle dans args.output_dir enregistré par une instance précédente de Trainer. S'il est présent, l'entraînement reprendra à partir des états du modèle/optimiseur/planificateur chargés ici.
  • trial (optuna.Trial ou dict[str, Any], facultatif) — L’exécution de l’essai ou le dictionnaire d’hyperparamètres pour la recherche d’hyperparamètres.
  • ignore_keys_for_eval (list[str], facultatif) — Une liste de clés dans la sortie de votre modèle (s’il s’agit d’un dictionnaire) qui doivent être ignorées lors de la collecte des prédictions pour l’évaluation pendant l’entraînement.

Retourne

~trainer_utils.TrainOutput

Objet contenant le nombre d'étapes globales, la perte d'entraînement et les métriques.

Point d'entrée principal de l'entraînement.

save_model

< >

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

Enregistrera le modèle, ce qui vous permettra de le recharger à l'aide de from_pretrained().

N'enregistrera que depuis le processus principal.

push_to_hub

< >

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

Paramètres

  • commit_message (str, facultatif, par défaut "End of training") — Message à committer lors de la poussée.
  • blocking (bool, facultatif, par défaut True) — Indique si la fonction doit ne renvoyer que lorsque le git push est terminé.
  • token (str, facultatif, par défaut None) — Jeton avec permission d’écriture pour écraser les arguments originaux du Trainer.
  • revision (str, facultatif) — La révision git à partir de laquelle effectuer le commit. Par défaut, il s'agit de la tête de la branche « main ».
  • kwargs (dict[str, Any], facultatif) — Arguments supplémentaires passés à ~Trainer.create_model_card.

Téléchargez self.model et self.processing_class sur le hub de modèles 🤗 dans le dépôt self.args.hub_model_id.

OnlineDPOConfig

classe trl.experimental.online_dpo.OnlineDPOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 5e-07lr_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 = -1reward_model_path: str | None = Nonemax_new_tokens: int = 64max_length: int = 512temperature: float = 0.9top_p: float = 1.0top_k: int = 0min_p: float | None = Nonerepetition_penalty: float = 1.0generation_kwargs: dict | None = Nonecache_implementation: str | None = Nonemissing_eos_penalty: float | None = Nonebeta: list[float] = <factory>loss_type: str = 'sigmoid'disable_dropout: bool = Trueuse_vllm: bool = Falsevllm_model_impl: str = 'vllm'vllm_structured_outputs_regex: str | None = Nonevllm_gpu_memory_utilization: float | None = 0.55vllm_mode: str = 'colocate'vllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8000vllm_server_timeout: float = 240.0vllm_group_port: int = 51216vllm_tensor_parallel_size: int = 1vllm_enable_sleep_mode: bool = Falseds3_gather_for_generation: bool = Truemodel_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falsereward_weights: list[float] | None = None )

Paramètres

  • reward_model_path (str, facultatif) — Chemin vers le modèle de récompense.
  • max_new_tokens (int, facultatif, par défaut 64) — Nombre maximal de jetons à générer par complétion.
  • max_length (int, facultatif, par défaut 512) — Longueur totale maximale de la séquence (invite + complétion) utilisée pour calculer les log-probabilités. Si la séquence dépasse cette limite, les jetons les plus à gauche seront tronqués afin de conserver le maximum de la complétion. Non appliqué lorsque les entrées contiennent des images, car la troncature supprimerait les jetons d’image.
  • temperature (float, facultatif, par défaut 0.9) — Température pour l'échantillonnage. Plus la température est élevée, plus les complétions sont aléatoires.
  • missing_eos_penalty (float, facultatif) — Pénalité appliquée au score lorsque le modèle ne génère pas de jeton EOS. Cela est utile pour encourager la génération de complétions plus courtes que la longueur maximale (max_new_tokens). La pénalité doit être une valeur positive.
  • beta (float ou list[float], facultatif, par défaut 0.1) — Paramètre contrôlant l'écart par rapport au modèle de référence. Plus β est élevé, moins l'écart par rapport au modèle de référence est important. Pour la perte IPO (loss_type="ipo"), β est le paramètre de régularisation noté τ dans l'article. Si une liste de flottants est fournie, β est sélectionné pour chaque nouvel epoch et le dernier β est utilisé pour le reste des epochs.
  • loss_type (str, facultatif, par défaut "sigmoid") — Type de perte à utiliser. Les valeurs possibles sont :
    • "sigmoid" : perte sigmoïde issue de l’article original DPO.
    • "ipo" : perte IPO issue de l’article IPO.
  • disable_dropout (bool, facultatif, valeur par défaut True) — Indique s'il faut désactiver le dropout dans le modèle et le modèle de référence.

Paramètres qui contrôlent la génération

  • top_p (float, facultatif, par défaut 1.0) — Flottant qui contrôle la probabilité cumulée des jetons de tête à prendre en compte. Doit être dans (0, 1]. Définissez-le à 1.0 pour prendre en compte tous les jetons.
  • top_k (int, facultatif, par défaut 0) — Nombre de jetons du vocabulaire ayant la plus haute probabilité à conserver pour le filtrage top-k. Si la valeur est 0, le filtrage top-k est désactivé et tous les jetons sont pris en compte.
  • min_p (float, facultatif) — Probabilité minimale du jeton, qui sera mise à l'échelle par la probabilité du jeton le plus probable. Elle doit être une valeur comprise entre 0.0 et 1.0. Les valeurs typiques se situent dans la plage 0.01-0.2.
  • repetition_penalty (float, facultatif, par défaut 1.0) — Flottant qui pénalise les nouveaux jetons en fonction de leur présence dans le prompt et dans le texte généré jusqu’à présent. Les valeurs > 1.0 encouragent le modèle à utiliser de nouveaux jetons, tandis que les valeurs < 1.0 encouragent le modèle à répéter les jetons.
  • cache_implementation (str, facultatif) — Implémentation de la méthode de cache pour une génération plus rapide lorsque use_vllm est défini sur False.
  • generation_kwargs (dict[str, Any], facultatif) — Arguments supplémentaires à passer à GenerationConfig (si vous utilisez transformers) ou SamplingParams (si vous utilisez vLLM) lors de l'échantillonnage des complétions. Cela permet de personnaliser davantage le comportement de la génération, par exemple en définissant suppress_tokens, num_beams, etc. S'il contient des clés qui entrent en conflit avec les autres paramètres de génération (comme min_p, top_p, etc.), ils les remplaceront.

Paramètres qui contrôlent l'accélération de la génération propulsée par vLLM

  • use_vllm (bool, facultatif, valeur par défaut False) — Indique s'il faut utiliser vLLM pour générer des complétions. Si défini sur True, l'entraîneur utilisera vLLM pour la génération au lieu de model.generate() par défaut. Nécessite l'installation de vllm.
  • vllm_model_impl (str, facultatif, par défaut "vllm") — Implémentation du modèle à utiliser pour vLLM. Doit être l'une des valeurs "transformers" ou "vllm". "transformers" : utiliser le backend transformers pour l'implémentation du modèle. "vllm" : utiliser la bibliothèque vllm pour l'implémentation du modèle.
  • vllm_mode (str, facultatif, valeur par défaut "colocate") — Mode à utiliser pour l'intégration vLLM lorsque use_vllm est défini sur True. Doit être l'un des "server" ou "colocate".
    • "server" : le formateur enverra les requêtes de génération à un serveur vLLM distinct. Assurez-vous qu’un serveur vLLM est en cours d’exécution (à démarrer avec vllm serve).
    • "colocate" : vLLM s’exécute dans le même processus et partage les GPU d’entraînement. Cela évite d’avoir besoin d’un serveur séparé, mais peut provoquer une concurrence pour les ressources avec l’entraînement.
  • vllm_structured_outputs_regex (str, facultatif) — Expression régulière pour les sorties structurées de vLLM. Si None (par défaut), les sorties structurées sont désactivées.

Paramètres qui contrôlent le serveur vLLM (utilisés uniquement lorsque `vllm_mode` est `"server"`)

  • vllm_server_base_url (str, facultatif) — URL de base du serveur vLLM (par exemple, "http://localhost:8000"). Si fournie, vllm_server_host et vllm_server_port sont ignorés.
  • vllm_server_host (str, facultatif, par défaut "0.0.0.0") — Hôte du serveur vLLM auquel se connecter. Ignoré si vllm_server_base_url est fourni.
  • vllm_server_port (int, facultatif, par défaut 8000) — Port du serveur vLLM auquel se connecter. Ignoré si vllm_server_base_url est fourni.
  • vllm_server_timeout (float, facultatif, valeur par défaut 240.0) — Durée totale de temporisation, en secondes, à attendre pour que le serveur vLLM soit opérationnel. Si le serveur n'est pas opérationnel après le dépassement de ce délai, une ConnectionError est levée.
  • vllm_group_port (int, facultatif, valeur par défaut 51216) — Numéro de port du groupe de mise à jour des poids. Il est utilisé pour communiquer avec le serveur vLLM. Sauf si le port est occupé, il n'est pas nécessaire de le modifier.

Paramètres qui contrôlent l'exécution de vLLM co-localisée (utilisés uniquement lorsque `vllm_mode` est `"colocate"`)

  • vllm_gpu_memory_utilization (float, facultatif, valeur par défaut 0.55) — Contrôle l'utilisation de la mémoire GPU pour vLLM. Ce paramètre ne s'applique que lorsque vllm_mode est défini sur "colocate". Si vous utilisez vllm_mode="server", ce paramètre doit être transmis séparément lors du démarrage du serveur vLLM via le drapeau --vllm_gpu_memory_utilization.
  • vllm_tensor_parallel_size (int, facultatif, valeur par défaut 1) — Contrôle la taille du parallélisme de tenseurs pour vLLM. Ce paramètre ne s’applique que lorsque vllm_mode est défini sur "colocate". Si vous utilisez vllm_mode="server", ce paramètre doit être transmis séparément lors du démarrage du serveur vLLM via le drapeau --vllm_tensor_parallel_size.
  • vllm_enable_sleep_mode (bool, facultatif, valeur par défaut False) — Active le mode veille de vLLM pour décharger les poids et le cache pendant l'étape d'optimisation. Cela maintient l'utilisation de la mémoire GPU au plus bas, mais le réveil du moteur ajoute une latence de transfert hôte-appareil.

Autres paramètres

  • ds3_gather_for_generation (bool, facultatif, valeur par défaut True) — Ce paramètre s’applique à DeepSpeed ZeRO-3. S’il est activé, les poids du modèle de politique sont regroupés pour la génération, ce qui améliore la vitesse de génération. Toutefois, désactiver cette option permet d’entraîner des modèles dont la taille dépasse la capacité VRAM d’une seule GPU, au prix d’une génération plus lente. La désactivation de cette option n’est pas compatible avec la génération vLLM.
  • model_init_kwargs (dict[str, Any], facultatif) — Arguments par mot-clé à passer à AutoModelForCausalLM.from_pretrained lors de l’instanciation du modèle à partir d’une chaîne de caractères. La valeur de revision est également utilisée lors du chargement des classes de traitement des récompenses.
  • trust_remote_code (bool, facultatif, valeur par défaut False) — Indique s'il faut autoriser le chargement de modèles qui incluent du code Python personnalisé depuis le Hub. Transmis à from_pretrained. S'applique également au chargement des modèles de récompense et des tokenizers de récompense.
  • reward_weights (list[float], facultatif) — Poids pour combiner plusieurs fonctions de récompense. Doit correspondre au nombre de fonctions de récompense. Si None, toutes les fonctions de récompense sont pondérées de manière égale.

Classe de configuration pour le experimental.online_dpo.OnlineDPOTrainer.

Cette classe ne contient que les paramètres spécifiques à l’entraînement Online DPO. Pour la liste complète des arguments d’entraînement, veuillez consulter la documentation de TrainingArguments. Notez que les valeurs par défaut de cette classe peuvent différer de celles de TrainingArguments.

À l’aide de HfArgumentParser, nous pouvons transformer cette classe en arguments argparse qui peuvent être spécifiés sur la ligne de commande.

Ces paramètres ont des valeurs par défaut différentes de TrainingArguments :

  • logging_steps : la valeur par défaut est 10 au lieu de 500.
  • gradient_checkpointing : la valeur par défaut est True au lieu de False.
  • bf16 : passe à True par défaut si fp16 n’est pas défini, au lieu de False.
  • learning_rate : passe par défaut à 5e-7 au lieu de 5e-5.
  • remove_unused_columns : la valeur par défaut est False au lieu de True.
Update on GitHub