【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大小,默认为8
- learning_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")



















