飞桨自然语言处理框架 paddlenlp的 trainer
飞桨(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
。
这些参数提供了对训练过程的细粒度控制,允许用户根据他们的需求和硬件配置来优化训练。在实际应用中,这些参数可能需要根据具体情况进行调整,以达到最佳的训练效果。