训练器
在TRL中,我们支持使用了类似于D. Ziegler等人论文“From Human Preferences to Fine-tuning Language Models”提出的结构的PPO(近端策略优化)实现方式。[论文, 代码] 训练器和模型类主要受transformers.Trainer
和transformers.AutoModel
类的启发,并针对强化学习进行了适配。我们还支持一个可用来训练奖励模型的RewardTrainer
。
CPOConfig
类 trl.CPOConfig
< 来源 >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: float = 1e-08 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: bool = True save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'auto' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = None tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = None ddp_bucket_cap_mb: Optional = None ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False eval_use_gather_object: Optional = False max_length: Optional = None max_prompt_length: Optional = None max_completion_length: Optional = None max_target_length: Optional = None beta: float = 0.1 label_smoothing: float = 0 loss_type: Literal = 'sigmoid' disable_dropout: bool = True cpo_alpha: float = 1.0 simpo_gamma: float = 0.5 label_pad_token_id: int = -100 padding_value: int = None truncation_mode: str = 'keep_end' generate_during_eval: bool = False is_encoder_decoder: Optional = None model_init_kwargs: Optional = None dataset_num_proc: Optional = None )
参数
- max_length (
int
, 默认值None
) — 批次中序列的最大长度。如果您想使用默认数据合并器,则此参数是必需的。 - max_prompt_length (
int
, 默认值None
) — 提示的最大长度。如果您想使用默认数据合并器,则此参数是必需的。 - max_target_length (
int
, 默认值None
) — 目标的最大长度。如果您想使用默认数据合并器且您的模型是编码器-解码器类型,则此参数是必需的。 - beta (
float
, 默认值 0.1) — CPO 损失函数中的 beta 因子。 - label_smoothing (
float
,默认值为 0) — 标签平滑系数。如果想要使用默认的数据调度器,则必须此参数。 - loss_type (
str
,默认值为sigmoid
) — 使用的损失类型。如果想要使用默认的数据调度器,则必须此参数。 - label_pad_token_id (
int
,默认值为-100
) — 标签填充token ID。如果想要使用默认的数据调度器,则必须此参数。 - cpo_alpha (
float
,默认值为1.0
) — 控制CPO训练中BC正则化器强度的超参数。 - simpo_gamma (
float
,默认为0.5
) —— SimPO损失的期望奖励边际,仅在启用“simpo”选项时使用。 - padding_value (
int
,默认为None
) —— 如果与分词器的pad_token_id不同,则为填充值。 - truncation_mode (
str
,默认为keep_end
) —— 要使用的截断模式,可以是keep_end
或keep_start
。如果您想使用默认的数据复列器,则需要此参数。 - generate_during_eval (
bool
,默认为False
)— 在评估步骤期间是否采样和记录生成。 - is_encoder_decoder (
Optional[bool]
,可选
,默认为None
)—如果不提供模型,我们需要知道 model_init 返回的是编码器-解码器模型。 - disable_dropout (
bool
,默认为True
)— 是否在model
中禁用 dropout。 - model_init_kwargs (
Optional[Dict]
,可选)— 实例化模型时需传递的附加参数的字典。 - dataset_num_proc (
Optional[int]
, 可选) — 用于对数据进行分词的工作者数量。默认为 None。
CPOConfig收集与类 CPOTrainer 相关的所有训练参数。
使用 HfArgumentParser
,我们可以将这个类转换为 argparse 参数,这些参数可以在命令行中指定。
CPOTrainer
类 trl.CPOTrainer
< 源 >( model: 联合体 = Noneargs: 可选 = Nonedata_collator: 可选 = Nonetrain_dataset: 可选 = Noneeval_dataset: 联合体 = Nonetokenizer: 可选 = Nonemodel_init: 可选 = Nonecallbacks: 可选 = Noneoptimizers: 元组 = (None, None)preprocess_logits_for_metrics: 可选 = Nonepeft_config: 可选 = Nonecompute_metrics: 可选 = None )
参数
- model (
transformers.PreTrainedModel
) — 要训练的模型,最好是一个AutoModelForSequenceClassification
。 - args (
CPOConfig
) — 用于训练的 CPO 配置参数。 - data_collator (
transformers.DataCollator
) — 用于训练的数据合并器。如果未指定,将使用默认数据合并器 (DPODataCollatorWithPadding
),它会将序列填充到批次中序列的最大长度,给定成对序列的数据集。 - train_dataset (
datasets.Dataset
) — 使用于训练的数据集。 - eval_dataset (
datasets.Dataset
) — 使用于评估的数据集。 - tokenizer (
transformers.PreTrainedTokenizerBase
) — 用于训练的标记化器。如果想要使用默认的数据拼接器,则需要指定此参数。 - model_init (
Callable[[], transformers.PreTrainedModel]
) — 用于训练的模型初始化器。如果没有指定,将使用默认的模型初始化器。 - 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 的函数。 - peft_config (
Dict
, 默认值None
) — 用于训练的 PEFT 配置。如果您传递一个 PEFT 配置,模型将被包装在一个 PEFT 模型中。 - compute_metrics (
Callable[[EvalPrediction], Dict]
, 可选) — 用于计算指标的函数。必须接受一个EvalPrediction
并返回一个字符串到指标值的字典。
初始化 CPOTrainer。
lama分词器满足enc(a + b) = enc(a) + enc(b)
。它还确保enc(a + b) = enc(a) + enc(a + b)[len(enc(a)):]
。参考:https://github.com/EleutherAI/lm-evaluation-harness/pull/531#issuecomment-1595586257
在给定的输入批次上运行指定的模型,将选择的和拒绝的输入一起拼接。
我们这样做是为了避免进行两次正向传递,因为对FSDP来说更快。
concatenated_inputs
< source >( batch: 字典 is_encoder_decoder: 布尔 = False label_pad_token_id: 整数 = -100 padding_value: 整数 = 0 device: 可选 = None )
将选中和拒绝的输入连接成一个单一生成器。
cpo_loss
< 源代码 >( policy_chosen_logps: FloatTensor policy_rejected_logps: FloatTensor ) → 三个张量元组
返回
三个张量元组
(losses, chosen_rewards, rejected_rewards)。losses张量包含批次中每个示例的CPO损失。chosen_rewards和rejected_rewards张量包含选中和拒绝的响应的奖励。
计算一批策略和参考模型对数概率的CPO损失。
evaluation_loop
< 源代码 >( dataloader: DataLoader description: str prediction_loss_only: Optional = None ignore_keys: Optional = None metric_key_prefix: str = 'eval' )
覆盖内置评估循环以存储每个批次的指标。预测/评估循环,由Trainer.evaluate()
和Trainer.predict()
共享。
支持有或没有标签的情况。
get_batch_logps
< 源代码 >( logits: FloatTensor labels: LongTensor average_log_prob: bool = False label_pad_token_id: int = -100 is_encoder_decoder: bool = False )
计算在给定logits下给定标签的对数概率。
计算给定训练或测试批次输入的CPN损失和其他指标。
从给定的输入批次生成模型和参考模型的样本。
在监控训练的各个对象上记录 logs
,包括存储的指标。
单行从CPO特定数据集中进行标记化。
在此阶段,我们还没有将其转换为PyTorch张量;我们只是处理了截断的情况,如果提示 + 选择或提示 + 拒绝的响应过长。首先我们截断提示;如果我们仍然太长,我们将截断选择的/拒绝的。
我们还创建了选择/拒绝的响应的标签,其长度等于提示和选择的/拒绝的响应长度的总和,提示标记的_id用于提示标记。
DDPOConfig
类 trl.DDPOConfig
< source >( exp_name: str = 'doc-buil' run_name: Optional = '' seed: int = 0 log_with: Optional = None tracker_kwargs: dict = <factory> accelerator_kwargs: dict = <factory> project_kwargs: dict = <factory> tracker_project_name: str = 'trl' logdir: str = 'logs' num_epochs: int = 100 save_freq: int = 1 num_checkpoint_limit: int = 5 mixed_precision: str = 'fp16' allow_tf32: bool = True resume_from: Optional = '' sample_num_steps: int = 50 sample_eta: float = 1.0 sample_guidance_scale: float = 5.0 sample_batch_size: int = 1 sample_num_batches_per_epoch: int = 2 train_batch_size: int = 1 train_use_8bit_adam: bool = False train_learning_rate: float = 0.0003 train_adam_beta1: float = 0.9 train_adam_beta2: float = 0.999 train_adam_weight_decay: float = 0.0001 train_adam_epsilon: float = 1e-08 train_gradient_accumulation_steps: int = 1 train_max_grad_norm: float = 1.0 train_num_inner_epochs: int = 1 train_cfg: bool = True train_adv_clip_max: float = 5 train_clip_range: float = 0.0001 train_timestep_fraction: float = 1.0 per_prompt_stat_tracking: bool = False per_prompt_stat_tracking_buffer_size: int = 16 per_prompt_stat_tracking_min_count: int = 16 async_reward_computation: bool = False max_workers: int = 2 negative_prompts: Optional = '' )
DDPOTrainer配置类
DDPOTrainer
类 trl.DDPOTrainer
< 源代码 >( config: DDPOConfig reward_function: Callable prompt_function: Callable sd_pipeline: DDPOStableDiffusionPipeline image_samples_hook: Optional = None )
参数
- **config** (
DDPOConfig
) — DDPOTrainer 的配置对象。有关更多信息,请检查PPOConfig
的文档。 - **reward_function** (Callable[[torch.Tensor, Tuple[str], Tuple[Any]], torch.Tensor]) — 要使用的奖励函数 —
- **prompt_function** (Callable[[], Tuple[str, Any]]) — 生成指导模型的提示的函数 —
- **sd_pipeline** (
DDPOStableDiffusionPipeline
) — 用于训练的Stable Diffusion管道。 — - **image_samples_hook** (Optional[Callable[[Any, Any, Any], Any]]) — 调用以记录图像的钩子 —
DDPOTrainer使用了深度扩散策略优化来优化扩散模型。请注意,此训练器深受以下工作的启发:[链接](https://github.com/kvablack/ddpo-pytorch)。目前仅支持基于Stable Diffusion的管道。
calculate_loss
< 源代码 >( 隐含变量 时间步 下一个隐含变量 对数概率 优势 嵌入 )
参数
- 隐含变量 (torch.Tensor) — 从扩散模型采样的隐含变量,形状:[batch_size, num_channels_latents, height, width]
- 时间步 (torch.Tensor) — 从扩散模型采样的时间步,形状:[batch_size]
- next_latents (torch.Tensor) — 从扩散模型中采样的下一个潜在的值,形状:[batch_size, num_channels_latents, height, width]
- log_probs (torch.Tensor) — 潜在值的对数概率,形状:[batch_size]
- advantages (torch.Tensor) — 潜在的优势,形状:[batch_size]
- embeds (torch.Tensor) — 提示的嵌入,形状:[2*batch_size or batch_size, …] 注:这里的“或”是因为如果train_cfg是True,预期的负提示将连接到embeds
计算一组未打包样本的损失
创建模型卡片
< 来源 >( path: str model_name: Optional = 'TRL DDPO Model' )
创建并保存 TRL 模型的模型卡片。
步骤
< 源代码 >( epoch: int global_step: int ) → global_step (int)
执行一次训练步骤。
副作用
- 模型权重更新
- 将统计数据记录到加速器追踪器中。
- 如果 `self.image_samples_callback` 不为 None,则将使用提示图像对、全局步数和加速器追踪器调用它。
训练模型给定的epoch数量
DPOTrainer
类 trl.DPOTrainer
< 来源 >( model: Union = None ref_model: Union = None beta: float = 0.1 label_smoothing: float = 0 loss_type: Literal = 'sigmoid' args: Optional = None data_collator: Optional = None label_pad_token_id: int = -100 padding_value: Optional = None truncation_mode: str = 'keep_end' train_dataset: Optional = None eval_dataset: Union = None tokenizer: Optional = None model_init: Optional = None callbacks: Optional = None optimizers: Tuple = (None, None) preprocess_logits_for_metrics: Optional = None max_length: Optional = None max_prompt_length: Optional = None max_target_length: Optional = None peft_config: Optional = None is_encoder_decoder: Optional = None disable_dropout: bool = True generate_during_eval: bool = False compute_metrics: Optional = None precompute_ref_log_probs: bool = False dataset_num_proc: Optional = None model_init_kwargs: Optional = None ref_model_init_kwargs: Optional = None model_adapter_name: Optional = None ref_adapter_name: Optional = None reference_free: bool = False force_use_ref_model: bool = False )
参数
- model (
transformers.PreTrainedModel
) — 要训练的模型,最好是一个AutoModelForSequenceClassification
模型。 - ref_model (
PreTrainedModelWrapper
) — 具有休闲语言建模头部的 Hugging Face transformer 模型。用于隐式奖励计算和损失。如果没有提供参考模型,则训练器将创建一个与要优化的模型具有相同架构的参考模型。 - args (
DPOConfig
) — 用于训练的 DPO 配置参数。 - data_collator (
transformers.DataCollator
) — 用于训练的数据合并器。如果没有指定,将使用默认的数据合并器(DPODataCollatorWithPadding
),它会将序列填充到批次中序列的最大长度。 - train_dataset (
datasets.Dataset
) — 用于训练的数据集。 - eval_dataset (
datasets.Dataset
) — 用于评估的数据集。 - tokenizer (
transformers.PreTrainedTokenizerBase
) — 用于训练的分词器。如果你想使用默认的数据合并器,则必须指定此参数。 - model_init (
Callable[[], transformers.PreTrainedModel]
) — 用于训练的模型初始化器。如果没有指定,将使用默认模型初始化器。 - 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 的函数。 - peft_config (
Dict
, 默认为None
) — 用于训练的PEFT配置。如果传递PEFT配置,模型将被包装在PEFT模型中。 - compute_metrics (
Callable[[EvalPrediction], Dict]
, 可选) — 用于计算指标的功能。必须接受一个代码块,并将一个字典从字符串值 作为指标值返回。
初始化DPOTrainer。
lama分词器满足enc(a + b) = enc(a) + enc(b)
。它还确保enc(a + b) = enc(a) + enc(a + b)[len(enc(a)):]
。参考:https://github.com/EleutherAI/lm-evaluation-harness/pull/531#issuecomment-1595586257
计算单个填充批次DPO特定数据集的参考模型的对数概率。
在给定的输入批次上运行指定的模型,将选择的和拒绝的输入一起拼接。
我们这样做是为了避免进行两次正向传递,因为对FSDP来说更快。
concatenated_inputs
< source >( batch: 字典 is_encoder_decoder: 布尔值 = False is_vision_model: 布尔值 = False label_pad_token_id: 整数 = -100 padding_value: 整数 = 0 device: 可选 = None )
将选中和拒绝的输入连接成一个单一生成器。
dpo_loss
< 源代码 >( policy_chosen_logps: 浮点张量 policy_rejected_logps: 浮点张量 reference_chosen_logps: 浮点张量 reference_rejected_logps: 浮点张量 ) → 三个张量的元组
返回
三个张量元组
(losses,选择的奖励,拒绝的奖励)。损失张量包含批次中每个示例的 DPO 损失。选择的奖励和拒绝的奖励张量分别包含选择的和拒绝的响应的奖励。
计算策略和参考模型日志概率批次的 DPO 损失。
evaluation_loop
< 源代码 >( dataloader: DataLoader description: str prediction_loss_only: Optional = None ignore_keys: Optional = None metric_key_prefix: str = 'eval' )
覆盖内置评估循环以存储每个批次的指标。预测/评估循环,由Trainer.evaluate()
和Trainer.predict()
共享。
支持有或没有标签的情况。
get_batch_logps
< 来源 >( logits: FloatTensor labels: LongTensor label_pad_token_id: int = -100 is_encoder_decoder: bool = False )
计算在给定logits下给定标签的对数概率。
根据给定的输入批次计算训练或测试的DPO损失和其他指标。
从给定的输入批次生成模型和参考模型的样本。
get_eval_dataloader
< 来源 >( eval_dataset: 可选 = None )
参数
- eval_dataset (
torch.utils.data.Dataset
, 可选) — 如提供,将覆盖self.eval_dataset
。如果它是一个 Dataset,则自动删除不被model.forward()
方法接受的列。它必须实现__len__
。
返回评估 ~torch.utils.data.DataLoader
。
是 transformers.src.transformers.trainer.get_eval_dataloader 的子类,用于预先计算 ref_log_probs
。
返回训练 ~torch.utils.data.DataLoader
。
是 transformers.src.transformers.trainer.get_train_dataloader 的子类,用于预先计算 ref_log_probs
。
在监控训练的各个对象上记录 logs
,包括存储的指标。
处理 null 引用模型的上下文管理器(即 peft 适配器操作)。
将特定于 DPO 的数据集的单行进行分词。
在此阶段,我们还没有将其转换为PyTorch张量;我们只是处理了截断的情况,如果提示 + 选择或提示 + 拒绝的响应过长。首先我们截断提示;如果我们仍然太长,我们将截断选择的/拒绝的。
我们还创建了选择/拒绝的响应的标签,其长度等于提示和选择的/拒绝的响应长度的总和,提示标记的_id用于提示标记。
IterativeSFTTrainer
类 trl.IterativeSFTTrainer
< 来源 >( model: 可选 = None args: 可选 = None tokenizer: 可选 = None optimizers: 元组 = (None, None) data_collator: 可选 = None eval_dataset: 联合 = None max_length: 可选 = None truncation_mode: 可选 = 'keep_end' preprocess_logits_for_metrics: 可选 = None compute_metrics: 可选 = None optimize_device_cache: 可选 = False )
参数
- **model** (
PreTrainedModel
) — 需要优化的模型,可以是‘AutoModelForCausalLM’或‘AutoModelForSeq2SeqLM’。 — 更多的细节请查看PreTrainedModel
的文档。 - **args** (
transformers.TrainingArguments
) — — 用于训练的参数。 - **tokenizer** (
PreTrainedTokenizerBase
) — 用于编码数据的分词器。更详细的文档请查看transformers.PreTrainedTokenizer
和transformers.PreTrainedTokenizerFast
。 - **optimizers** (
Tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]
) — — 用于训练的优化器和调度器。 - **data_collator** (Union[DataCollatorForLanguageModeling, DataCollatorForSeq2Seq], 可选) — 用于训练和传递给数据加载器的数据合器。
- **eval_dataset** (
datasets.Dataset
) — 用于评估的数据集。 - **max_length** (
int
, 默认为None
) — 输入的最大长度。 - **truncation_mode** (
str
, 默认为keep_end
) — 要使用的截断模式,可以是keep_end
或keep_start
。 - **preprocess_logits_for_metrics** (
Callable[[torch.Tensor, torch.Tensor], torch.Tensor]
) - 在计算指标之前用于预处理logits的函数。 - **compute_metrics** (
Callable[[EvalPrediction], Dict]
,可选) - 用于计算指标的功能。必须接受一个EvalPrediction
并返回一个包含指标值的字典。 - **optimize_device_cache** * (
bool
,可选,默认为False
) - 优化CUDA缓存以实现更高效的内存使用。-
IterativeSFTTrainer可以用于使用需要在优化之间执行一些步骤的方法微调模型。
步骤
< 源代码 >( input_ids: Optional = None attention_mask: Optional = None labels: Optional = None texts: Optional = None texts_labels: Optional = None ) → dict[str, Any]
参数
- input_ids (List
torch.LongTensor
) — 包含input_ids的列表(如果没有提供,则使用文本) - attention_mask (List
torch.LongTensor
, 可选) — 包含attention_mask的列表 - labels (List
torch.FloatTensor
, 可选) — 包含标签的张量列表(如果设为None,将默认为input_ids) - texts (List
str
, 可选) — 包含文本输入的字符串列表(如果未提供,将直接使用input_ids) - texts_labels (List
str
, 可选) — 包含文本标签的字符串列表(如果设为None,将默认为text)
返回
dict[str, 任意类型]
训练统计数据摘要
根据输入的input_ids、attention_mask和labels或在提供的text和text_labels列表上运行优化步骤。
KTOConfig
类 trl.KTOConfig
< source >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: float = 1e-08 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: bool = True save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'auto' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = None tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = None ddp_bucket_cap_mb: Optional = None ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False eval_use_gather_object: Optional = False max_length: Optional = None max_prompt_length: Optional = None max_completion_length: Optional = None beta: float = 0.1 desirable_weight: Optional = 1.0 undesirable_weight: Optional = 1.0 label_pad_token_id: int = -100 padding_value: int = None truncation_mode: str = 'keep_end' generate_during_eval: bool = False is_encoder_decoder: Optional = None precompute_ref_log_probs: bool = False model_init_kwargs: Optional = None ref_model_init_kwargs: Optional = None dataset_num_proc: Optional = None loss_type: Literal = 'kto' prompt_sample_size: int = 1024 min_density_ratio: float = 0.5 max_density_ratio: float = 10.0 )
参数
- max_length (
int
, 可选, 默认为None
) — 批量中序列的最大长度。如果想要使用默认数据合并器,则需要此参数。 - max_prompt_length (
int
, 可选, 默认为None
) — 提示的最大长度。如果想要使用默认数据合并器,则需要此参数。 - max_completion_length (
int
, 可选, 默认为None
) — 目标的最大长度。如果想要使用默认的数据合并器并且您的模型是编码器-解码器,则此参数是必需的。 - beta (
float
, 默认为 0.1) — KTO损失中的beta因子。较高的beta值意味着更少的与初始策略的偏差。 - desirable_weight (
float
, 可选, 默认为 1.0) — 通过此因子对期望的损失进行加权,以平衡期望和不可接受的 对的数量。 - undesirable_weight (浮点数,可选,默认为 1.0)— 否定损失的加权因子,以抵消理想和不理想配对数量不等的情况。
- label_pad_token_id (整数,默认为 -100)— 标签填充token ID。如果您想使用默认数据合并程序,则需要此参数。
- padding_value (整数,默认为 0)— 当与分词器的 pad_token_id 不同时,使用的填充值。
- truncation_mode (字符串,默认为 keep_end)— 使用裁剪模式,可以是 keep_end 或 keep_start。如果您想使用默认数据合并程序,则需要此参数。
- generate_during_eval (
bool
,默认为False
) — 是否在评估步骤中对生成进行采样和记录。 - is_encoder_decoder (
Optional[bool]
,可选
,默认为None
) — 如果没有提供模型,我们需要知道model_init返回的是编码器-解码器。 - precompute_ref_log_probs (
bool
,默认为False
) — 用于预计算训练和评估数据集中参考模型对数概率的标志。如果您想在不使用参考模型的训练中减少总GPU内存,这很有用。model_init_kwargs —(Optional[Dict]
,可选):字符串实例化模型时传递的可选kwargs字典。ref_model_init_kwargs —(《code>Optional[Dict],可选):从字符串实例化参考模型时传递的可选kwargs字典。dataset_num_proc — 《code>Optional[int],可选,默认为《code>None):处理数据集时使用的过程数。loss_type —(《code>Literal["kto", "bco"],可选):要使用的损失类型。默认为KTO损失,或从BCO论文中的损失。prompt_sample_size —(《code>int,默认为1024):提供给密度比分类器的提示数量。min_density_ratio —(《code>float,默认为0.5):密度比的最小值。估计的密度比将夹抓紧这个值。max_density_ratio —(《code>float,默认为10.0):密度比的最大值。估计的密度比将夹抓紧这个值。
KTOConfig收集与KTOTrainer类相关的所有训练参数。
使用 HfArgumentParser
,我们可以将这个类转换为 argparse 参数,这些参数可以在命令行中指定。
KTOTrainer
类 trl.KTOTrainer
< 来源 >( model: 联合体 = None ref_model: 联合体 = None args: KTOConfig = None train_dataset: 可选 = None eval_dataset: 联合体 = None tokenizer: 可选 = None data_collator: 可选 = None model_init: 可选 = None callbacks: 可选 = None optimizers: 元组 = (None, None) preprocess_logits_for_metrics: 可选 = None peft_config: 可选 = None compute_metrics: 可选 = None model_adapter_name: 可选 = None ref_adapter_name: 可选 = None embedding_func: 可选 = None embedding_tokenizer: 可选 = None )
参数
- model (
transformers.PreTrainedModel
) — 要训练的模型,最好是AutoModelForSequenceClassification
。 - ref_model (
PreTrainedModelWrapper
) — Hugging Face Transformer 模型,具有休闲语言建模头部。用于隐式奖励计算和损失。如果没有提供参考模型,训练器将创建与要优化的模型具有相同架构的参考模型。 - args (
KTOConfig
) — 用于训练的参数。 - train_dataset (
datasets.Dataset
) — 用于训练的数据集。 - eval_dataset (
datasets.Dataset
) — 用于评估的数据集。 - tokenizer (
transformers.PreTrainedTokenizerBase
) — 用于训练的标记器。如果想要使用默认的数据整理器,此参数是必需的。 - data_collator (
transformers.DataCollator
, 可选, 默认为None
) — 用于训练的数据整理器。如果指定为 None,将使用默认的数据整理器(DPODataCollatorWithPadding
),它将在给定成对序列的数据集的情况下,将序列填充到批序列的最大长度。 - model_init (
Callable[[], transformers.PreTrainedModel]
) — 用于训练的模型初始化器。如果没有指定,将使用默认的模型初始化器。 - 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]
) — 预处理预测值以用于计算指标的功能。 - peft_config (
Dict
, 默认值None
) — 用于训练的PEFT配置。如果您传入PEFT配置,则模型将包裹在一个PEFT模型中。 - disable_dropout (
bool
, 默认为True
) — 是否在model
和ref_model
中禁用dropouts。 - compute_metrics (
Callable[[EvalPrediction], Dict]
, 可选) — 使用此函数来计算指标。必须接收一个EvalPrediction
并返回一个包含字符串到指标值的字典。 - model_adapter_name (
str
, 默认为None
) — 当使用多个适配器时,LoRA的训练目标PEFT适配器的名称。 - ref_adapter_name (
str
, 默认为None
) — 使用 LoRA 与多个适配器时,参考 PEFT 适配器的名称。
初始化 KTOTrainer。
bco_loss
< source >( policy_chosen_logps: FloatTensor policy_rejected_logps: FloatTensor reference_chosen_logps: FloatTensor reference_rejected_logps: FloatTensor chosen_embeddings: Optional rejected_embeddings: Optional ) → 四个张量组成的元组
返回
四个张量组成的元组
(失真张量,选定奖励张量,拒绝奖励张量,KL)。损失张量包含批次中每个示例的 KTO 损失。选定奖励张量和拒绝奖励张量分别包含选定和拒绝响应的奖励。delta(变化值)包含所有隐式奖励的移动平均值。
计算策略和参考模型日志概率批次的 BCO 损失。
计算KTO特定数据集中单个填充批次的参考模型的日志概率。
evaluation_loop
< 源代码 >( dataloader: DataLoader description: str prediction_loss_only: Optional = None ignore_keys: Optional = None metric_key_prefix: str = 'eval' )
覆盖内置评估循环以存储每个批次的指标。预测/评估循环,由Trainer.evaluate()
和Trainer.predict()
共享。
支持有或没有标签的情况。
get_batch_logps
< 源代码 >( logits: FloatTensor labels: LongTensor average_log_prob: bool = False label_pad_token_id: int = -100 is_encoder_decoder: bool = False )
计算在给定logits下给定标签的对数概率。
计算给定批次的训练或测试输入的KTO损失和其他指标。
从给定的输入批次生成模型和参考模型的样本。
get_eval_dataloader
< 来源 >( eval_dataset: 可选 = None )
参数
- eval_dataset (
torch.utils.data.Dataset
, 可选) — 如果提供,将覆盖self.eval_dataset
。如果是一个 Dataset,则自动移除不接受model.forward()
方法的列。必须实现__len__
。
返回评估 ~torch.utils.data.DataLoader
。
是 transformers.src.transformers.trainer.get_eval_dataloader 的子类,用于预先计算 ref_log_probs
。
返回训练 ~torch.utils.data.DataLoader
。
是 transformers.src.transformers.trainer.get_train_dataloader 的子类,用于预先计算 ref_log_probs
。
_kto_loss
< 源代码 >( policy_chosen_logps: FloatTensor policy_rejected_logps: FloatTensor policy_KL_logps: FloatTensor reference_chosen_logps: FloatTensor reference_rejected_logps: FloatTensor reference_KL_logps: FloatTensor ) → 四个张量组成的元组
返回
四个张量组成的元组
(losses, chosen_rewards, rejected_rewards, KL)。其中,losses 张量包含了批次中每个示例的 KTO 损失。chosen_rewards 和 rejected_rewards 张量分别包含所选择和所拒绝的响应的奖励。KL 张量包含了策略和参考模型之间的分离的 KL 散度估计。
计算策略和参考模型的一批日志概率的 KTO 损失。
在监控训练的各个对象上记录 logs
,包括存储的指标。
处理 null 引用模型的上下文管理器(即 peft 适配器操作)。
ORPOConfig
类 trl.ORPOConfig
< 来源 >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: float = 1e-08 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: bool = True save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'auto' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = None tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = None ddp_bucket_cap_mb: Optional = None ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False eval_use_gather_object: Optional = False max_length: Optional = None max_prompt_length: Optional = None max_completion_length: Optional = None beta: float = 0.1 disable_dropout: bool = True label_pad_token_id: int = -100 padding_value: int = None truncation_mode: str = 'keep_end' generate_during_eval: bool = False is_encoder_decoder: Optional = None model_init_kwargs: Optional = None dataset_num_proc: Optional = None )
参数
- max_length (
int
, 默认为None
) — 批量序列的最大长度。如果您想使用默认数据合并器,则需要此参数。 - max_prompt_length (
int
, 默认为None
) — 提示的最大长度。如果您想使用默认数据合并器,则需要此参数。 - max_completion_length (
int
, 默认为None
) — 完成内容的最大长度。如果您想使用默认数据合并器并且您的模型是编码器-解码器,则需要此参数。 - beta (
float
, 默认为 0.1) — ORPO 损失中的 beta 因子(论文/代码中的 lambda/alpha),表示 SFT 损失中相对损失比重的权重。 - label_pad_token_id (
int
, 默认为-100
) — 标签填充标记的 ID。如果您想使用默认数据聚合器,则需要此参数。 - padding_value (
int
, 默认为None
) — 当与分词器的 pad_token_id 不同时,用于填充的值。 - truncation_mode (
str
, 默认为keep_end
) — 要使用的截断模式,可以是keep_end
或keep_start
。如果您想使用默认数据聚合器,则需要此参数。 - generate_during_eval (布尔值,默认为
False
) — 在评估步骤是否进行采样和记录生成内容。 - is_encoder_decoder (
Optional[bool]
,可选,默认为None
)— 如果未提供模型,则需要知道model_init返回的是编码器-解码器模型。 - disable_dropout (布尔值,默认为
True
)— 是否在model
中禁用dropout。 - model_init_kwargs (
Optional[Dict]
,可选)— 从字符串实例化模型时传递的可选kwargs字典 - dataset_num_proc (
Optional[int]
, optional) — 用于对数据进行标记的工人数量。默认值为None。
ORPOConfig收集了与ORPOTrainer类相关的所有训练参数。
使用 HfArgumentParser
,我们可以将这个类转换为 argparse 参数,这些参数可以在命令行中指定。
ORPOTrainer
类 trl.ORPOTrainer
< 源 >( model: 联合体 = Noneargs: 可选 = Nonedata_collator: 可选 = Nonetrain_dataset: 可选 = Noneeval_dataset: 联合体 = Nonetokenizer: 可选 = Nonemodel_init: 可选 = Nonecallbacks: 可选 = Noneoptimizers: 元组 = (None, None)preprocess_logits_for_metrics: 可选 = Nonepeft_config: 可选 = Nonecompute_metrics: 可选 = None )
参数
- model (
transformers.PreTrainedModel
) — 用于训练的模型,最好是AutoModelForSequenceClassification
。 - args (
ORPOConfig
) — 用于训练的ORPO配置参数。 - data_collator (
transformers.DataCollator
) — 用于训练的数据合器。如果没有指定,将使用默认数据合器(DPODataCollatorWithPadding
),将序列填充到批次数组中序列的最大长度。 - train_dataset (
datasets.Dataset
) — 用于训练的数据集。 - eval_dataset (
datasets.Dataset
) — 用于评估的数据集。 - tokenizer (
transformers.PreTrainedTokenizerBase
) — 用于训练的标记器。如果您想使用默认的数据收集器,则此参数是必需的。 - model_init (
Callable[[], transformers.PreTrainedModel]
) — 用于训练的模型初始化器。如果指定为None,则将使用默认模型初始化器。 - 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进行预处理的函数。 - peft_config (
Dict
, 默认为None
) — 使用的 PEFT 配置。如果您传入 PEFT 配置,则将模型包裹在 PEFT 模型中。 - compute_metrics (
Callable[[EvalPrediction], Dict]
, 可选) — 用于计算指标的功能。必须接受一个EvalPrediction
并返回具有计量值字符串的字典。
初始化 ORPOTrainer。
lama分词器满足enc(a + b) = enc(a) + enc(b)
。它还确保enc(a + b) = enc(a) + enc(a + b)[len(enc(a)):]
。参考:https://github.com/EleutherAI/lm-evaluation-harness/pull/531#issuecomment-1595586257
在给定的输入批次上运行指定的模型,将选择的和拒绝的输入一起拼接。
我们这样做是为了避免进行两次正向传递,因为对FSDP来说更快。
concatenated_inputs
< source >( batch: 字典 is_encoder_decoder: 布尔 = False label_pad_token_id: 整数 = -100 padding_value: 整数 = 0 device: 可选 = None )
将选中和拒绝的输入连接成一个单一生成器。
evaluation_loop
< 来源 >( dataloader: DataLoader description: str prediction_loss_only: Optional = None ignore_keys: Optional = None metric_key_prefix: str = 'eval' )
覆盖内置评估循环以存储每个批次的指标。预测/评估循环,由Trainer.evaluate()
和Trainer.predict()
共享。
支持有或没有标签的情况。
get_batch_logps
< 来源 >( logits: FloatTensor labels: LongTensor average_log_prob: bool = False label_pad_token_id: int = -100 is_encoder_decoder: bool = False )
计算在给定logits下给定标签的对数概率。
计算给定输入批次的ORPO损失和其他指标(训练或测试)。
从给定的输入批次生成模型和参考模型的样本。
在监控训练的各个对象上记录 logs
,包括存储的指标。
odds_ratio_loss
< 源代码 >( policy_chosen_logps: FloatTensor policy_rejected_logps: FloatTensor ) → 三个张量元组
返回
三个张量元组
(losses, chosen_rewards, rejected_rewards)。losses 张量包含批次中每个示例的 ORPO 损失值。chosen_rewards 和 rejected_rewards 张量分别包含所选和被拒绝响应的奖励值。记录所选响应与被拒绝响应失真比率的对数。用于记录:log(sigmoid(log_odds_chosen))
。
为策略和参考模型的对数概率批次计算 ORPO 的概率比率 (OR) 损失。
从 ORPO 特定数据集中提取一行进行标记化。
在此阶段,我们还没有将其转换为PyTorch张量;我们只是处理了截断的情况,如果提示 + 选择或提示 + 拒绝的响应过长。首先我们截断提示;如果我们仍然太长,我们将截断选择的/拒绝的。
我们还创建了选择/拒绝的响应的标签,其长度等于提示和选择的/拒绝的响应长度的总和,提示标记的_id用于提示标记。
PPOConfig
类 trl.PPOConfig
< source >( exp_name: str = 'doc-buil' seed: int = 0 log_with: Optional = None task_name: Optional = None model_name: Optional = 'gpt2' query_dataset: Optional = 'imdb' reward_model: Optional = 'sentiment-analysis:lvwerra/distilbert-imdb' remove_unused_columns: bool = True tracker_kwargs: Annotated = <factory> accelerator_kwargs: Annotated = <factory> project_kwargs: Annotated = <factory> tracker_project_name: str = 'trl' push_to_hub_if_best_kwargs: Annotated = <factory> steps: int = 20000 learning_rate: float = 1.41e-05 adap_kl_ctrl: bool = True init_kl_coef: Optional = 0.2 kl_penalty: Literal = 'kl' target: Optional = 6 horizon: Optional = 10000 gamma: float = 1 lam: float = 0.95 cliprange: float = 0.2 cliprange_value: float = 0.2 vf_coef: float = 0.1 batch_size: int = 128 forward_batch_size: Optional = None mini_batch_size: int = 128 gradient_accumulation_steps: int = 1 world_size: Annotated = None ppo_epochs: int = 4 max_grad_norm: Optional = None optimize_cuda_cache: Optional = None optimize_device_cache: Optional = False early_stopping: bool = False target_kl: float = 1 compare_steps: int = 1 ratio_threshold: float = 10.0 use_score_scaling: bool = False use_score_norm: bool = False score_clip: Optional = None whiten_rewards: bool = False gradient_checkpointing: bool = False is_encoder_decoder: Optional = None is_peft_model: Optional = None backward_batch_size: Annotated = None global_backward_batch_size: Annotated = None global_batch_size: Annotated = None )
PPOTrainer 配置类
PPOTrainer
类 trl.PPOTrainer
< 来源 >( config: Optional = None model: Optional = None ref_model: Optional = None tokenizer: Optional = None dataset: Union = None optimizer: Optional = None data_collator: Optional = None num_shared_layers: Optional = None lr_scheduler: Optional = None training_data_collator: Optional = None )
参数
- **config** (
PPOConfig
) — PPOTrainer 的配置对象。有关PPOConfig
的详细信息,请参阅文档。 - **model** (
PreTrainedModelWrapper
) — 待优化的模型,包含值头的Hugging Face transformer模型。— 请查看PreTrainedModelWrapper
的文档获取更多详细信息。 - **ref_model** (
PreTrainedModelWrapper
, 可选) — 用于KL惩罚的参考模型,Hugging Face transformer模型,带有休闲语言建模头。— 请查看PreTrainedModelWrapper
的文档获取更多详细信息。如果没有提供参考模型,训练器将使用与待优化模型相同的架构创建一个参考模型,并具有共享层。 - **tokenizer** (
PreTrainedTokenizerBase
) — 用于编码数据的分词器。— 请查看transformers.PreTrainedTokenizer
和transformers.PreTrainedTokenizerFast
的文档获取更多详细信息。 - **dataset** (Union[
torch.utils.data.Dataset
,datasets.Dataset
], 可选) — PyTorch 数据集或 Hugging Face 数据集。用于创建 PyTorch 的数据加载器。如果不提供数据集,数据加载器必须在训练器之外创建。用户需要设计自己的数据加载器,并确保使用的批大小与配置对象中指定的批大小相同。 - **optimizer** (
torch.optim.Optimizer
, 可选) — 用于训练的优化器。如果不提供优化器,训练器将使用配置对象中指定的学习率创建 Adam 优化器。 - **data_collator** (DataCollatorForLanguageModeling, 可选) — 用于训练和传递给数据加载器的数据归一器。
- **num_shared_layers** (int,可选) — 模型和参考模型之间要共享的层数(如果没有提供参考模型,则为模型本身)。如果没有提供数字,则所有层都将共享。
- **lr_scheduler** (
torch.optim.lr_scheduler
,可选) — 用于训练的学习率调度器。
PPOTrainer使用近端策略优化(Proximal Policy Optimization)来优化语言模型。请注意,这个训练器在很大程度上受到以下开源项目的影响:[OpenAI/summarize-from-feedback](https://github.com/openai/summarize-from-feedback)
batched_forward_pass
< 源代码 >( model: PreTrainedModelWrapper queries: Tensor responses: Tensor model_inputs: dict return_logits: bool = False response_masks: Optional = None ) → (tuple)
参数
- queries (
torch.LongTensor
) — 包含编码查询的张量列表,形状为 (batch_size
,query_length
) - responses (
torch.LongTensor
) — 包含编码响应当量的列表,形状为 (batch_size
,response_length
) - return_logits (
bool
, optional, defaults toFalse
) — 是否返回所有 logits。如果不需要 logits 以减少内存消耗,则设置为False
。
返回
(元组)
- all_logprobs (
torch.FloatTensor
):响应的对数概率,形状为 (batch_size, response_length) - all_ref_logprobs (
torch.FloatTensor
):响应的对数概率,形状为 (batch_size, response_length) - all_values (
torch.FloatTensor
):响应的值,形状为 (batch_size, response_length)
在多个批次中计算模型输出。
compute_rewards
< source >( scores: FloatTensor logprobs: FloatTensor ref_logprobs: FloatTensor masks: LongTensor ) → torch.FloatTensor
参数
- 得分 (
torch.FloatTensor
) — 奖励模型得出的得分,形状为 (batch_size
) - 对数概率 (
torch.FloatTensor
) — 模型的对数概率,形状为 (batch_size
,response_length
) - 参考模型对数概率 (
torch.FloatTensor
) — 参考模型的对数概率,形状为 (batch_size
,response_length
)
返回
torch.FloatTensor
每段文字的奖励,形状为 (batch_size
, response_length
) torch.FloatTensor
:非得分奖励,形状为 (batch_size
, response_length
) torch.FloatTensor
:KL 惩罚,形状为 (batch_size
, response_length
)
从得分和 KL 惩罚中计算每段文字的奖励。
创建模型卡片
< source >( path: str model_name: Optional = 'TRL Model' )
创建并保存 TRL 模型的模型卡片。
gather_stats
< source >( stats ) → dict[str, Any]
Gather stats from all processes. Useful in the context of distributed training.
generate
< source >( query_tensor: Union length_sampler: Optional = None batch_size: int = 4 return_prompt: bool = True generate_ref_response: bool = False **generation_kwargs ) → torch.LongTensor
参数
- query_tensor (
torch.LongTensor
) — 包含查询标记的形状为 (seq_len
) 的张量或 shape 为 (seq_len
) 的张量列表。 - length_sampler (
Callable
, 可选) — 返回新生成标记数量的可调用对象。 - batch_size (
int
, *可选) — 生成时使用的批量大小,默认为4
。 - return_prompt (
bool
, 可选) — 如果设置为False
,则不返回提示但仅返回新生成的标记,默认为True
。 - generate_ref_response (类型:布尔值,可选) — 如果设置为
True
,则同时生成参考响应,默认为False
。 - generation_kwargs (类型:字典[str, Any]) — 生成时的关键字参数。
返回
torch.LongTensor
形状为(batch_size
,gen_len
)的响应标记张量。
给定查询张量的模型生成响应。调用模型的 generate
方法。
log_stats
< source >( stats: dict batch: dict rewards: List columns_to_log: Iterable = ('query', 'response') )
一个记录所有训练统计的函数。在每个epoch结束时调用它。
损失
< source >( old_logprobs: FloatTensor values: FloatTensor logits: FloatTensor vpreds: FloatTensor logprobs: FloatTensor mask: LongTensor advantages: FloatTensor returns: FloatTensor )
参数
- old_logprobs (
torch.FloatTensor
) — 模型的对数概率,形状为 (batch_size
,response_length
) - values (
torch.FloatTensor
) — 价值头的值,形状为 (batch_size
,response_length
) - rewards (
torch.FloatTensor
) — 来自奖励模型的奖励,形状为 (batch_size
,response_length
) - logits (
torch.FloatTensor
) — 模型的logits,形状为 (batch_size
,response_length
,vocab_size
) - v_pred (
torch.FloatTensor
) — 值头的值,形状为 (batch_size
,response_length
) - logprobs (
torch.FloatTensor
) — 模型的对数概率,形状为 (batch_size
,response_length
)
计算策略和值损失。
prepare_dataloader
< 源码 >( 数据集: 联合 数据合并器= None ) → torch.utils.data.DataLoader
为训练准备数据加载器。
记录步骤统计信息
< 来源 >( kl_coef: float **data ) → stats (dict
)
记录训练步骤统计信息。
步骤
< source >( queries: 列表 responses: 列表 scores: 列表 response_masks: 可选 = None ) → dict[str, Any]
根据查询列表、模型响应和奖励运行PPO优化步骤。
train_minibatch
< source >( old_logprobs: FloatTensor values: FloatTensor logprobs: FloatTensor logits: FloatTensor vpreds: FloatTensor mask: LongTensor advantages: FloatTensor returns: FloatTensor ) → train_stats (dict[str, torch.Tensor
])
参数
- logprobs (
torch.FloatTensor
) — 模型的对数概率,形状 [mini_batch_size, response_length] - values (
torch.FloatTensor
) — 价值头部的值,形状 [mini_batch_size, response_length] - query (
torch.LongTensor
) — 编码查询,形状 [mini_batch_size, query_length] - response (
torch.LongTensor
) — 编码响应,形状 [mini_batch_size, response_length] - model_input (
torch.LongTensor
) — 查询和响应的拼接,形状 [mini_batch_size, query_length+response_length]
返回
train_stats (dict[str, torch.Tensor
])
训练统计字典
训练一个PPO子批量
RewardConfig
class trl.RewardConfig
< source >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: float = 1e-08 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: bool = True save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'auto' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = None tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = None ddp_bucket_cap_mb: Optional = None ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False eval_use_gather_object: Optional = False max_length: Optional = None )
参数
- max_length (
int
, optional, defaults toNone
) — The maximum length of the sequences in the batch. This argument is required if you want to use the default data collator. - gradient_checkpointing (
bool
, optional, defaults toTrue
) — If True, use gradient checkpointing to save memory at the expense of slower backward pass.
RewardConfig收集与RewardTrainer类相关的所有训练参数。
使用 HfArgumentParser
,我们可以将这个类转换为 argparse 参数,这些参数可以在命令行中指定。
RewardTrainer
类 trl.RewardTrainer
< 源代码 >( model: Union = None args: Optional = None data_collator: Optional = None train_dataset: Optional = None eval_dataset: Union = None tokenizer: Optional = None model_init: Optional = None compute_metrics: Optional = None callbacks: Optional = None optimizers: Tuple = (None, None) preprocess_logits_for_metrics: Optional = None max_length: Optional = None peft_config: Optional = None )
RewardTrainer可用于训练自定义奖励模型。它是transformers.Trainer类的子类,继承了其所有属性和方法。建议使用AutoModelForSequenceClassification作为奖励模型。奖励模型应在配对示例的数据集上进行训练,每个示例都是一个包含两个序列的元组。奖励模型应被训练来预测这对示例中哪一个与当前任务更相关。
奖励训练器期望数据集具有非常特定的格式。如果未使用默认的RewardDataCollatorWithPadding数据合并器,则数据集应包含至少两个条目。条目应命名为
input_ids_chosen
attention_mask_chosen
input_ids_rejected
attention_mask_rejected
可选,您还可以将margin
条目传递给数据集。该条目应包含在https://ai.meta.com/research/publications/llama-2-open-foundation-and-fine-tuned-chat-models/中概述的边缘,用于调节奖励模型的损失。如果不传递边缘,则不使用边缘。
可视化样本
< source >( num_print_samples: int )
可视化奖励模型概率预测
SFTTrainer
类 trl.SFTTrainer
< 来源 >( model: 联合 = None args: 可选 = None data_collator: 可选 = None train_dataset: 可选 = None eval_dataset: 联合 = None tokenizer: 可选 = None model_init: 可选 = None compute_metrics: 可选 = None callbacks: 可选 = None optimizers: 元组 = (None, None) preprocess_logits_for_metrics: 可选 = None peft_config: 可选 = None dataset_text_field: 可选 = None packing: 可选 = False formatting_func: 可选 = None max_seq_length: 可选 = None infinite: 可选 = None num_of_sequences: 可选 = 1024 chars_per_token: 可选 = 3.6 dataset_num_proc: 可选 = None dataset_batch_size: int = 1000 neftune_noise_alpha: 可选 = None model_init_kwargs: 可选 = None dataset_kwargs: 可选 = None eval_packing: 可选 = None )
参数
- model (Union[
transformers.PreTrainedModel
,nn.Module
,str
]) — 训练的模型,可以是PreTrainedModel
,torch.nn.Module
或是包含模型名称的字符串,用于从缓存或下载中加载。如果向peft_config
参数传递了PeftConfig
对象,模型也可以转换为PeftModel
。 - args (可选
SFTConfig
) — 用于调整训练的参数。如果未提供,则默认为设置output_dir
为当前目录下以 tmp_trainer 命名的目录的基本实例的SFTConfig
。 - data_collator (可选
transformers.DataCollator
) — 用于训练的数据合并器。 - train_dataset(可选datasets.Dataset)—用于训练的数据集。我们建议用户使用
trl.trainer.ConstantLengthDataset
来创建数据集。 - eval_dataset(可选[Union[
datasets.Dataset
, Dict[str
,datasets.Dataset
]]])—用于评估的数据集。我们建议用户使用trl.trainer.ConstantLengthDataset
来创建数据集。 - tokenizer(可选
transformers.PreTrainedTokenizer
)—用于训练的标记器。如果未指定,将使用与模型关联的标记器。 - model_init(
Callable[[], transformers.PreTrainedModel]
)—用于训练的模型初始化器。如果指定为None,将使用默认模型初始化器。 - compute_metrics (
Callable[[transformers.EvalPrediction], Dict]
, 可选默认为None) — 评估期间计算指标的函数。它应该返回一个将指标名称映射到指标值的字典。如果没有指定,则评估期间将只计算损失。 - 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的函数。 - peft_config (
Optional[PeftConfig]
) — 使用 PeftConfig 对象初始化 PeftModel 使用的对象。 - formatting_func (
Optional[Callable]
) — 用于创建ConstantLengthDataset
的格式化函数。
监督微调训练器(SFT 训练器)的类定义。该类是对 transformers.Trainer
类的封装,并继承了其所有属性和方法。当用户传递一个 PeftConfig
对象时,训练器将负责正确初始化 PeftModel。
set_seed
为在 random
、numpy
和 torch
中设置种子而设计的辅助函数,以实现可复现的行为。