【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_epsilon
num_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 TrainingArguments
args = 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")