飞桨(PaddlePaddle)的NLP库PaddleNLP中的Trainer类是一个用于训练和评估模型的简单但功能完整的循环。它被优化用于与PaddleNLP一起使用。Trainer类简化了训练过程,提供了自动的批处理、模型保存、日志记录等特性。
 以下是Trainer类的主要参数和功能:
- 模型: - model:可以是一个预训练的模型或一个自定义的- paddle.nn.Layer。如果使用自定义模型,它需要与PaddleNLP提供的模型工作方式相同。
 
- criterion: - 如果模型只输出logits,并且您想对模型的输出进行更多的计算,可以添加criterion层。
 
- args: - args:用于调整训练的参数。如果未提供,将默认使用一个具有- output_dir设置为当前目录中名为- tmp_trainer的目录的基本- TrainingArguments实例。
 
- 数据整理器(DataCollator): - data_collator:用于从- train_dataset或- eval_dataset的列表中形成一批数据的功能。如果没有提供- tokenizer,将默认使用- default_data_collator;否则,将使用- DataCollatorWithPadding的实例。
 
- 训练数据集和评估数据集: - train_dataset和- eval_dataset:用于训练和评估的数据集。如果数据集是- datasets.Dataset的实例,则不会接受- model.forward()方法不接受的字段。
 
- 分词器(Tokenizer): - tokenizer:用于预处理数据的分词器。如果提供了,将在批量输入时自动将输入填充到最大长度,并在中断训练或重用模型时保存分词器。
 
- 计算指标(compute_metrics): - compute_metrics:用于在评估时计算指标的函数。它必须接受一个- EvalPrediction对象并返回一个字典,字典中的字符串表示指标名称,对应的值表示指标值。
 
- 回调函数(callbacks): - callbacks:一个回调函数列表,用于自定义训练循环。可以将这些回调函数添加到默认回调函数列表中。如果想要移除默认使用的回调函数,可以使用- Trainer.remove_callback方法。
 
- 优化器(optimizers): - optimizers:一个包含优化器和调度器的元组。如果没有提供,将默认使用- AdamW优化器,并根据- args使用- get_linear_schedule_with_warmup调度器。
 
- 预处理logits用于指标(preprocess_logits_for_metrics): - preprocess_logits_for_metrics:一个函数,用于在每次评估步骤后预处理logits。它必须接受两个张量,即logits和labels,并返回处理后的logits。此函数的修改将在- compute_metrics中反映在接收到的预测值上。
 - Trainer类简化了训练流程,让用户可以更加专注于模型的设计和训练策略,而不必担心底层的训练细节。通过提供这些参数和功能,用户可以轻松地训练、评估和部署模型。
 paddlenlp/trainer/training_args.py
 
TrainingArguments 类是 PaddleNLP 中用于定义与训练循环相关的命令行参数的子集。这些参数用于配置训练过程的各种方面,例如输出目录、训练和评估的批处理大小、学习率、训练周期数等。通过 PdArgumentParser,可以将这个类转换为 argparse 参数,以便在命令行上指定。
 以下是 TrainingArguments 类中一些关键参数的详细介绍:
- output_dir:模型预测和检查点的输出目录。
- overwrite_output_dir:如果为 True,将覆盖输出目录中的内容。
- do_train:是否运行训练。
- do_eval:是否在验证集上评估模型。
- do_predict:是否在测试集上进行预测。
- evaluation_strategy:训练期间采用的评估策略,可以是 “no”(不评估)、“steps”(每指定步数评估一次)或 “epoch”(每轮训练结束后评估)。
- per_device_train_batch_size:训练时的每个 GPU 核心/CPU 的批处理大小。
- per_device_eval_batch_size:评估时的每个 GPU 核心/CPU 的批处理大小。
- learning_rate:AdamW 优化器的初始学习率。
- num_train_epochs:要执行的总训练周期数。
- max_steps:要执行的总训练步数。
- log_on_each_node:在多节点分布式训练中,是否每个节点都进行日志记录。
- logging_dir:日志目录。
- logging_strategy:训练期间采用的日志策略,可以是 “no”(不记录日志)、“epoch”(每轮训练结束后记录日志)或 “steps”(每指定步数记录一次日志)。
- save_strategy:训练期间采用的检查点保存策略,可以是 “no”(不保存检查点)、“epoch”(每轮训练结束后保存检查点)或 “steps”(每指定步数保存一次检查点)。
 这些参数可以在您的训练脚本中使用,以配置和控制训练过程。TrainingArguments类可以被转换为命令行参数,使用户能够轻松地在运行脚本时指定这些参数。
 TrainingArguments类中的剩余参数用于进一步控制训练过程的高级特性,如混合精度训练、并行训练策略等。以下是对这些参数的详细介绍:
- save_steps:如果 save_strategy="steps",则在达到指定的步数之前保存两次检查点。
- save_total_limit:如果指定了值,将限制保存的检查点总数,并在 output_dir中删除较旧的检查点。
- save_on_each_node:在多节点分布式训练中,是否在每个节点上保存模型和检查点。如果不同节点使用相同的存储,则不应激活此选项,因为文件名将相同。
- no_cuda:是否即使可用也禁用 CUDA。
- seed:训练开始时设置的随机种子,用于确保跨运行的可重复性。
- fp16:是否使用 16 位(混合)精度训练而不是 32 位训练。
- fp16_opt_level:对于 16 位训练,选择的 AMP 优化级别。
- amp_custom_black_list:自定义黑名单,用于指定哪些操作不应转换为 16 位或 32 位。
- amp_custom_white_list:自定义白名单,用于指定哪些操作应转换为 16 位或 32 位。
- amp_master_grad:对于 AMP 优化级别 'O2',是否使用 float32 权重梯度进行计算。
- sharding:是否使用 Paddle Sharding Data Parallel 训练。
- sharding_parallel_degree:在特定卡组中的 Sharding 参数。
- tensor_parallel_degree:张量并行度,用于指定将 Transformer 层分割成多少部分。
- pipeline_parallel_degree:流水线并行度,用于指定将所有 Transformer 层分割成多少阶段。
- sep_parallel_degree:Paddle 序列并行策略,可以减少激活 GPU 内存。
- tensor_parallel_config:一些影响模型并行性能的额外配置。
- pipeline_parallel_config:一些影响流水线并行使用的额外配置。
- sharding_parallel_config:一些影响 Sharding 并行的额外配置。
- recompute:是否在训练过程中重新计算梯度。
- num_workers:数据加载过程中使用的线程数。
- max_predictions_per_batch:每个批处理中最大预测的数量。
- prediction_loss_only:在评估和生成预测时,是否只返回损失。
 这些参数提供了对训练过程的细粒度控制,允许用户根据他们的需求和硬件配置来优化训练。在实际应用中,这些参数可能需要根据具体情况进行调整,以达到最佳的训练效果。
 在您提供的TrainingArguments类的参数说明中,涵盖了训练循环中涉及的各种配置选项。以下是对这些参数的详细介绍:
- per_device_train_batch_size:指定每个GPU核心/CPU在训练时使用的批处理大小。
- per_device_eval_batch_size:指定每个GPU核心/CPU在评估时使用的批处理大小。
- gradient_accumulation_steps:在执行反向传播和更新参数之前,累积梯度的步数。使用梯度累积时,一次步数对应一次反向传播。
- eval_accumulation_steps:在将预测结果移动到CPU之前,累积的预测步数。如果未设置,则整个预测结果将在GPU/TPU上累积后再移动到CPU。
- learning_rate:指定AdamW优化器的初始学习率。
- weight_decay:对AdamW优化器中的所有层(除偏置和LayerNorm层)应用的权重衰减。
- adam_beta1:AdamW优化器的beta1超参数。
- adam_beta2:AdamW优化器的beta2超参数。
- adam_epsilon:AdamW优化器的epsilon超参数。
- max_grad_norm:用于梯度裁剪的最大梯度范数。
- num_train_epochs:要执行的总训练周期数。
- max_steps:要执行的总训练步数。如果设置为正数,将覆盖num_train_epochs。
- lr_scheduler_type:指定的学习率调度器类型。
- warmup_ratio:用于线性预热的总训练步数的比例。
- warmup_steps:用于从0到学习率进行线性预热的步数。
- num_cycles:余弦调度器中的波数。
- lr_end:多项式调度器中的结束学习率。
- power:多项式调度器中的幂因子。
 在训练过程的其他方面,还提供了以下配置选项:
- log_on_each_node:在多节点分布式训练中,是否每个节点都进行日志记录。
- logging_dir:日志目录。
- logging_strategy:训练期间采用的日志策略。
- logging_first_step:是否记录和评估第一个全局步骤。
- logging_steps:如果logging_strategy="steps",则两次日志之间的更新步数。
- save_strategy:训练期间采用的检查点保存策略。
- save_steps:如果save_strategy="steps",则在两次检查点保存之间的更新步数。
- save_total_limit:限制保存的检查点总数。
- save_on_each_node:在多节点分布式训练中,是否每个节点都保存模型和检查点。
- no_cuda:是否禁用CUDA。
- seed:训练开始时设置的随机种子。
- fp16:是否使用16位(混合)精度训练。
- fp16_opt_level:16位训练的AMP优化级别。
- amp_custom_black_list:自定义黑名单,用于指定哪些操作不应转换为16位或32位。
- amp_custom_white_list:自定义白名单,用于指定哪些操作应转换为16位或32位。
- amp_master_grad:是否使用float32权重梯度进行计算。
- sharding:是否使用Paddle Sharding Data Parallel训练。
- sharding_parallel_degree:Sharding参数,用于指定在特定卡组中的并行度。
- tensor_parallel_degree:张量并行度,用于指定将Transformer层分割成多少部分。
- pipeline_parallel_degree:流水线并行度,用于指定将所有Transformer层分割成多少阶段。
在您提供的TrainingArguments类的参数说明中,涵盖了训练循环中涉及的各种配置选项。以下是对这些参数的详细介绍:
- tensor_parallel_config:影响模型并行性能的一些额外配置,例如: - enable_mp_async_allreduce:支持在列并行线性反向传播期间的all_reduce(dx)与matmul(dw)重叠,可以加速模型并行性能。
- enable_mp_skip_c_identity:支持在列并行线性和行并行线性中跳过c_identity,当与- mp_async_allreduce一起设置时,可以进一步加速模型并行。
- enable_mp_fused_linear_param_grad_add:支持在列并行线性中融合线性参数梯度添加,当与- mp_async_allreduce一起设置时,可以进一步加速模型并行。
- enable_delay_scale_loss:在优化器步骤累积梯度,所有梯度除以累积步数,而不是直接在损失上除以累积步数。
 
- pipeline_parallel_config:影响流水线并行使用的额外配置,例如: - disable_p2p_cache_shape:如果您使用的最大序列长度变化,请设置此选项。
- disable_partial_send_recv:优化tensor并行的发送速度。
- enable_delay_scale_loss:在优化器步骤累积梯度,所有梯度除以内部流水线累积步数,而不是直接在损失上除以累积步数。
- enable_dp_comm_overlap:融合数据并行梯度通信。
- enable_sharding_comm_overlap:融合sharding stage 1并行梯度通信。
- enable_release_grads:在每次迭代后释放梯度,以减少峰值内存使用。梯度的创建将推迟到下一迭代的反向传播。
 
- sharding_parallel_config:影响Sharding并行的额外配置,例如: - enable_stage1_tensor_fusion:将小张量融合成大的张量块来加速通信,可能会增加内存占用。
- enable_stage1_overlap:在回传计算之前,将小张量融合成大的张量块来加速通信,可能会损害回传速度。
- enable_stage2_overlap:重叠stage2 NCCL通信与计算。重叠有一些约束,例如,对于广播重叠,- logging_step应该大于1,在训练期间不应调用其他同步操作。
 
- recompute:是否重新计算前向传播以计算梯度。用于节省内存。仅支持具有transformer块的网络。
- scale_loss:fp16的初始scale_loss值。
- local_rank:分布式训练过程中的进程排名。
- dataloader_drop_last:是否丢弃最后一个不完整的批处理(如果数据集的长度不能被批处理大小整除)。
- eval_steps:如果evaluation_strategy="steps",则两次评估之间的更新步数。
- max_evaluate_steps:要执行的总评估步数。
- dataloader_num_workers:数据加载过程中使用的子进程数。
- past_index:一些模型如TransformerXL或XLNet可以使用过去的隐状态为其预测。如果此参数设置为正整数,Trainer将使用相应的输出(通常是索引2)作为过去状态,并在下一次训练步骤中将其提供给模型,作为关键字参数mems。
- run_name:运行的描述符。通常用于日志记录。
- disable_tqdm:是否禁用tqdm进度条和指标表。
- remove_unused_columns:如果使用datasets.Dataset数据集,是否自动删除模型前向方法未使用的列。
- label_names:输入字典中对应于标签的键的列表。
- load_best_model_at_end:是否在训练结束时加载找到的最佳模型。
 在您提供的TrainingArguments类的参数说明中,涵盖了训练循环中涉及的各种配置选项。以下是对这些参数的详细介绍:
- metric_for_best_model:与load_best_model_at_end配合使用,指定用于比较两个不同模型的度量。必须是评估返回的度量名称,可以是带前缀"eval_"或不带前缀。如果未指定且load_best_model_at_end=True,则默认为"loss"(使用评估损失)。
- greater_is_better:与load_best_model_at_end和metric_for_best_model配合使用,指定更好的模型是否应该有更大的度量。默认为:- 如果metric_for_best_model设置为不是"loss"或"eval_loss"的值,则默认为True。
- 如果metric_for_best_model未设置,或设置为"loss"或"eval_loss",则默认为False。
 
- 如果
- ignore_data_skip:在继续训练时,是否跳过某些 epochs 和 batches 以确保数据加载与之前训练的数据加载阶段相同。如果设置为True,训练将更快开始,但结果可能与中断的训练结果不同。
- optim:要使用的优化器:adamw或adafactor。
- length_column_name:预计算长度的列名。如果该列存在,则按长度分组将使用这些值,而不是在训练启动时计算它们。除非group_by_length为True且数据集是Dataset的实例。
- report_to:报告结果和日志的集成列表。支持的平台是"visualdl"/"wandb"/"tensorboard"。"none"表示不使用任何集成。
- wandb_api_key:Weights & Biases (WandB) API 密钥,用于与 WandB 服务进行身份验证。
- resume_from_checkpoint:要从中恢复的模型检查点的路径。此参数不直接由Trainer使用,而是由您的训练/评估脚本使用。
- flatten_param_grads:是否在优化器中使用flatten_param_grads方法,仅用于 NPU 设备。默认为False。
- skip_profile_timer:是否跳过分析时间计时器,计时器将记录前向/反向/步等的时间使用情况。
- distributed_dataloader:是否使用分布式数据加载器。默认为False。
 这些参数提供了对训练过程的细粒度控制,允许用户根据他们的需求和硬件配置来优化训练。在实际应用中,这些参数可能需要根据具体情况进行调整,以达到最佳的训练效果。