【Python】科研代码学习:七 TrainingArguments,Trainer
- TrainingArguments
- 重要的方法
- Trainer
- 重要的方法
- 使用 Trainer 的简单例子
TrainingArguments
- HF官网API:Training
众所周知,推理是一个大头,训练是另一个大头
之前的很多内容,都是为训练这里做了一个小铺垫
如何快速有效地调用代码,训练大模型,才是重中之重(不然学那么多HF库感觉怪吃苦的) - 首先看训练参数,再看训练器吧。
首先,它的头文件是transformers.TrainingArguments
再看它源码的参数,我勒个去,太多了吧。
※ 我这里挑重要的讲解,全部请看API去。 output_dir (str):设置模型输出预测,或者中继点 (checkpoints) 的输出目录。模型训练到一半,肯定需要有中继点文件的嘛,就相当于游戏存档有很多一样,防止跑一半直接程序炸了,还要从头训练overwrite_output_dir (bool, optional, defaults to False):把这个参数设置成True,就会覆盖其中output_dir中的文档。一般在从中继点继续训练时需要这么用do_train (bool, optional, defaults to False):指明我在做训练集的训练任务do_eval (bool, optional):指明我在做验证集的评估任务do_predict (bool, optional, defaults to False):指明我在做测试集的预测任务evaluation_strategy:评估策略:训练时不评估 / 每eval_steps步评估,或者每 epoch 评估
"no": No evaluation is done during training.
"steps": Evaluation is done (and logged) every eval_steps.
"epoch": Evaluation is done at the end of each epoch.
per_device_train_batch_size:训练时每张卡的batch大小,默认为8
per_device_eval_batch_size:评估时每张卡的batch大小,默认为8learning_rate (float, optional, defaults to 5e-5):学习率,里面使用的是 AdamW optimizer
其他相应的AdamW Optimizer的参数还有:
weight_decay,adam_beta1,adam_beta2,adam_epsilonnum_train_epochs:训练的epoch个数,默认为3,可以设置小数。lr_scheduler_type:具体作用要查看transformers里的Scheduler是干什么用的warmup_ratio、warmup_steps:让一开始的学习率从0逐渐升到learning_rate用的logging_dir:设置logging输出的文档
除此之外还有一些和 logging相关的参数:
logging_strategy ,logging_first_step ,logging_steps ,logging_nan_inf_filter设置日志的策略- 与保存模型中继文件相关的参数:
save_strategy:不保存中继文件 / 每 epoch 保存 / 每save_steps步保存
"no": No save is done during training.
"epoch": Save is done at the end of each epoch.
"steps": Save is done every save_steps.
save_steps :如果是整数,表示多少步保存一次;小数,则是按照总训练步,多少比例之后保存一次
save_total_limit :最多中继文件的保存上限,如果超过上限,会先把最旧的那个中继文件删了再保存新的
save_safetensors :使用 savetensor来存储和加载 tensors,默认为 True
push_to_hub :是否保存到 HF hub
use_cpu (bool, optional, defaults to False):是否用 cpu 训练seed (int, optional, defaults to 42):训练的种子,方便复现和可重复实验data_seed:数据采样的种子- 数据精读相关的一些参数:
FP32、TF32、FP16、BF16、FP8、FP4、NF4、INT8
bf16 (bool, optional, defaults to False)、fp16 (bool, optional, defaults to False)
tf32 (bool, optional) run_name:展示在 wandb and mlflow logging 中的描述load_best_model_at_end (bool, optional, defaults to False):是否保存效果最好的中继点作为最终模型,与save_total_limit有些交互操作
如果上述设置成True的话,考虑metric_for_best_model,即如何评估效果最好。默认为loss即损失最小
如果你修改了metric_for_best_model的话,考虑greater_is_better,即指标越大越好还是越小越好- 一些加速相关的参数,貌似都比较麻烦
fsdp
fsdp_config
deepspeed
accelerator_config optim:设置optimizer,默认为adamw_torch
也可以设置成adamw_hf, adamw_torch, adamw_torch_fused, adamw_apex_fused, adamw_anyprecision or adafactor.resume_from_checkpoint:传入中继点文件的目录,从中继点继续训练
重要的方法
- ※ 那我怎么访问或者修改上述参数呢?
由于这个需要实例化,所以我们需要使用OO的方法修改
下面讲一下其中重要的方法 set_dataloader:设置 dataloader

from transformers import TrainingArgumentsargs = TrainingArguments("working_dir")
args = args.set_dataloader(train_batch_size=16, eval_batch_size=64)
args.per_device_train_batch_size
- 设置 logging 相关的参数

- 设置 optimizer

- 设置保存策略

- 设置训练策略

- 设置评估策略

- 设置测试策略

Trainer
- 终于到大头了。
Trainer是主要用pt训练的,主要支持GPUs (NVIDIA GPUs, AMD GPUs)/ TPUs - 看下源码,它要的东西不少,讲下重要参数:
model:要么是transformers.PretrainedModel类型的,要么是简单的torch.nn.Module类型的args:TrainingArguments类型的训练参数。如果不提供的话,默认使用output_dir/tmp_trainer里面的那个训练参数data_collator:DataCollator类型参数,给训练集或验证集做数据分批和预处理用的,如果没有tokenizer默认使用default_data_collator,否则默认使用DataCollatorWithPadding(Will default to default_data_collator() if no tokenizer is provided, an instance of DataCollatorWithPadding otherwise.)train_dataset (torch.utils.data.Dataset or torch.utils.data.IterableDataset, optional):提供训练的数据集,当然也可以是Datasets类型的数据eval_dataset:类似的验证集的数据集tokenizer:提供 tokenizer 分词器compute_metrics:验证集使用时候的计算指标,具体得参考EvalPrediction类型optimizers:可以提供Tuple(optimizer, scheduler)。默认使用AdamW 以及 get_linear_schedule_with_warmup() controlled by args

重要的方法
compute_loss:设置如何计算损失

train:设置训练集训练任务,第一个参数可以设置是否从中继点开始训练

evaluate:设置验证集评估任务,需要提供验证集

predict:设置测试集任务

save_model:保存模型参数到output_dir
training_step:设置每一个训练的 step,把一个batch的输入经过了何种操作,得到一个torch.Tensor

使用 Trainer 的简单例子
- 主要就是加载一些参数,传进去即可
模型、训练参数、训练集、验证集、计算指标
调用训练方法.train()
最后保存模型即可.save_model()
from transformers import (Trainer,)
trainer = Trainer(model=model,args=training_args,train_dataset=small_train_dataset,eval_dataset=small_eval_dataset,compute_metrics=compute_metrics,
)trainer.train()
trainer.save_model(outputdir="./xxx")