尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Transformers Trainer 全指南:从训练循环到分布式加速的完整实战手册

Transformers Trainer 全指南:从训练循环到分布式加速的完整实战手册 Transformers Trainer 全指南从训练循环到分布式加速的完整实战手册【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersTrainer是 Hugging Face Transformers 库当前仓库即为其源码中开箱即用的 PyTorch 训练/评估循环你只需传入模型、数据集、预处理组件与超参数即可免手写训练循环同时它又高度可定制支持子类化、回调、NEFTune 噪声增强以及与 Accelerate 的分布式训练集成。读完本文你将掌握Trainer的基本用法、断点续训、自定义损失/回调、日志级别控制以及基于 Accelerate 的 DDP/FSDP/DeepSpeed 多机多卡实战配置。本文基于当前仓库源码src/transformers/trainer.py、src/transformers/training_args.py、src/transformers/trainer_seq2seq.py、src/transformers/trainer_callback.py撰写所有示例与配置均可在本仓库中验证。什么是 Trainer一个完整的训练循环Trainer是 Transformers 库中面向 PyTorch 模型实现的完整训练与评估循环。你只需传入训练所必需的组件——模型、分词器tokenizer、数据集、评估函数、训练超参数等——其余一切由Trainer接管。这让你无需手动编写训练循环即可更快地开始训练与此同时Trainer高度可定制提供了大量训练选项可以按你的确切需求裁剪。一个基础训练循环通常包含以下步骤而Trainer将其全部抽象封装执行一次训练步骤forward计算损失通过accelerator.backward计算梯度基于梯度更新权重重复上述过程直到达到预设的 epoch 数。从源码看这一流程对应 trainer.py 中的training_step方法它依次完成model.train()、self.compute_loss(model, inputs, ...)计算损失、多卡场景下对损失取平均loss loss.mean()、梯度累积归一化最后调用self.accelerator.backward(loss, **kwargs)反向传播——Accelerate是这一切分布式能力的地基。除了Trainer本身仓库还提供Seq2SeqTrainer继承自Trainer专为序列到序列任务翻译、摘要等设计TRL 库的SFTTrainer包装Trainer面向 Llama-2、Mistral 等语言模型的自回归训练支持序列打包、LoRA、量化与 DeepSpeed 扩展属于外部库 TRL 的能力。一般来说Trainer是最通用的选择适用于广泛的任务Seq2SeqTrainer面向序列到序列任务SFTTrainer面向语言模型训练。前置依赖Trainer由 Accelerate 驱动开始前请确保已安装pip install accelerate # 升级 pip install accelerate --upgrade基本用法十分钟跑通第一个训练任务使用Trainer只需三步配置TrainingArguments、组装Trainer、调用train()。1. 配置 TrainingArguments训练选项与超参数统一收敛在TrainingArguments类中它是Trainer的“总控台”集中了超参数、优化设置、日志偏好与基础设施选择。下面定义输出目录、学习率、批次大小等核心参数from transformers import TrainingArguments training_args TrainingArguments( output_diryour-model, learning_rate2e-5, per_device_train_batch_size16, per_device_eval_batch_size16, num_train_epochs2, weight_decay0.01, eval_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, push_to_hubTrue, )对照 training_args.py 的源码 docstring这些参数的含义与边界如下output_dir模型预测与检查点的输出目录默认trainer_outputlearning_rate优化器初始学习率默认5e-5通常也是 warmup 后达到的峰值学习率per_device_train_batch_size/per_device_eval_batch_size每设备批次大小默认 8。全局批次 per_device_batch_size × 设备数多卡/分布式场景按此公式放大num_train_epochs训练总 epoch 数默认 3.0若为小数则最后一个 epoch 只跑对应比例weight_decay优化器施加的权重衰减L2 正则默认 0会自动排除 bias 与 LayerNorm 参数常用 0.01eval_strategyepoch每个 epoch 末评估一次save_strategyepoch每个 epoch 末保存一次检查点load_best_model_at_endTrue训练结束时自动加载验证指标最优的检查点需与save_strategy/eval_strategy配合push_to_hubTrue训练结束后将模型推送到 Hub。2. 组装 Trainer 并开始训练将training_args连同模型、数据集、预处理组件根据数据类型可能是 tokenizer、特征提取器或图像处理器、数据收集器data collator与评估函数一并传给Trainerfrom transformers import Trainer trainer Trainer( modelmodel, argstraining_args, train_datasetdataset[train], eval_datasetdataset[test], processing_classtokenizer, data_collatordata_collator, compute_metricscompute_metrics, ) trainer.train()调用trainer.train()即启动训练循环。检查点保存与断点续训Trainer会将模型检查点保存到TrainingArguments.output_dir指定目录下的checkpoint-000子文件夹中末尾数字对应当前训练步数step。保存检查点便于后续恢复训练# 从最新检查点恢复 trainer.train(resume_from_checkpointTrue) # 从输出目录中的指定检查点恢复 trainer.train(resume_from_checkpointyour-model/checkpoint-1000)检查点也可推送到 Hub。设置push_to_hubTrue后通过hub_strategy参数决定检查点的保存方式hub_strategycheckpoint将最后一个检查点发送到名为last-checkpoint的子文件夹可从中恢复训练hub_strategyall_checkpoints将所有检查点发送到output_dir指定目录模型仓库中每个检查点一个文件夹。关于确定性从检查点恢复训练时Trainer会尽量将 Python、NumPy 与 PyTorch 的随机数生成器RNG状态恢复至保存时的状态。但由于 PyTorch 存在多项默认的非确定性设置RNG 状态无法保证完全一致。如需完全确定性可参考 PyTorch 官方 “Controlling sources of randomness” 指南启用相关设置但需要注意部分确定性配置可能拖慢训练速度。对应实现可参见trainer.py中_rotate_checkpoints、_load_optimizer_and_scheduler等保存/恢复逻辑位于src/transformers/trainer.py的检查点相关方法区域。定制 Trainer子类化与回调Trainer在设计上既易用又可深挖它的大多数方法都可以被子类化并重写从而在不重写整个训练循环的前提下加入自定义逻辑。源码中这些方法均带 “Subclass and override to inject custom behavior” 的注释例如 training_step 的 docstring 明确写道“子类化并重写以注入自定义行为”。可定制的核心方法包括方法作用get_train_dataloader创建训练 DataLoaderget_eval_dataloader创建评估 DataLoaderget_test_dataloader创建测试 DataLoaderlog记录训练过程中观察到的各类信息create_optimizer_and_scheduler若__init__未传入则创建优化器与学习率调度器也可分别通过create_optimizer与create_scheduler独立定制compute_loss基于训练输入批量计算损失training_step执行单步训练prediction_step执行预测与测试步骤evaluate评估模型并输出评估指标predict在测试集上做预测有标签时附带指标例如若要使用加权损失替代默认损失重写compute_loss即可from torch import nn from transformers import Trainer class CustomTrainer(Trainer): def compute_loss(self, model, inputs, return_outputsFalse): labels inputs.pop(labels) # 前向传播 outputs model(**inputs) logits outputs.get(logits) # 为 3 个标签按不同权重计算自定义损失 loss_fct nn.CrossEntropyLoss(weighttorch.tensor([1.0, 2.0, 3.0], devicemodel.device)) loss loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1)) return (loss, outputs) if return_outputs else loss回调Callbacks另一种定制途径是使用回调。回调不会改动训练循环本身它们检查训练循环的状态再依据状态执行某些动作提前停止、记录结果等。换句话说回调无法实现自定义损失函数这类需要修改前向/反向逻辑的功能——那必须通过子类化并重写compute_loss来完成。仓库中回调的基类是TrainerCallback其on_step_end、on_train_end等钩子方法定义于同一文件中见 trainer_callback.py 的on_step_end与 trainer_callback.py 的on_train_end。例如在训练满 10 步后触发提前停止from transformers import TrainerCallback class EarlyStoppingCallback(TrainerCallback): def __init__(self, num_steps10): self.num_steps num_steps def on_step_end(self, args, state, control, **kwargs): if state.global_step self.num_steps: return {should_training_stop: True} else: return {}然后通过callback参数传入Trainerfrom transformers import Trainer trainer Trainer( modelmodel, argstraining_args, train_datasetdataset[train], eval_datasetdataset[test], processing_classtokenizer, data_collatordata_collator, compute_metricscompute_metrics, callback[EarlyStoppingCallback()], )日志Logging控制Trainer默认将日志级别设为logging.INFO会输出错误、警告及其他基础信息而分布式环境中的副本进程replica默认设为logging.WARNING只输出错误与警告。可以通过TrainingArguments的log_level与log_level_replica参数调整日志级别并用log_on_each_node决定是每个节点都按该级别记录还是只在主节点记录。提示Trainer会在其初始化方法中为每个节点分别设置日志级别因此如果你在创建Trainer对象之前使用了 Transformers 的其他功能可能需要提前设置日志级别。例如让主代码与各模块按节点采用统一的日志级别logger logging.getLogger(__name__) logging.basicConfig( format%(asctime)s - %(levelname)s - %(name)s - %(message)s, datefmt%m/%d/%Y %H:%M:%S, handlers[logging.StreamHandler(sys.stdout)], ) log_level training_args.get_process_log_level() logger.setLevel(log_level) datasets.utils.logging.set_verbosity(log_level) transformers.utils.logging.set_verbosity(log_level) trainer Trainer(...)单节点场景下组合使用log_level与log_level_replica即可控制各节点记录什么my_app.py ... --log_level warning --log_level_replica error多节点场景下额外加上log_on_each_node 0my_app.py ... --log_level warning --log_level_replica error --log_on_each_node 0 # 只报告错误 my_app.py ... --log_level error --log_level_replica error --log_on_each_node 0TrainingArguments之所以能以--log_level这样的命令行参数形式使用是因为HfArgumentParser可将该类转换为 argparse 命令行参数见 training_args.py 的类说明。NEFTune向嵌入注入噪声提升效果NEFTune 是一种通过在训练过程中向嵌入向量embedding vectors添加噪声来提升性能的技术。启用方式是在TrainingArguments中设置neftune_noise_alpha参数控制注入噪声的大小from transformers import TrainingArguments, Trainer training_args TrainingArguments(..., neftune_noise_alpha0.1) trainer Trainer(..., argstraining_args)源码层面的验证在 trainer.py 中训练启动阶段会调用activate_neftune(self.model, self.neftune_noise_alpha, self.accelerator)为嵌入层挂载 forward 后置钩子post hook训练结束时trainer.py调用deactivate_neftune(self.model, self.neftune_hook_handle, self.accelerator)移除钩子恢复原始嵌入层避免任何意外行为——这正是文档中“训练后自动关闭 NEFTune”的代码级依据。Accelerate 与 Trainer分布式训练实战Trainer由 Accelerate英文版及其它语言版本。生成 Accelerate 配置文件要配合Trainer使用 Accelerate先运行accelerate config命令按训练环境生成配置该命令会创建一个config_file.yaml启动训练脚本时自动加载。下面给出几种典型配置对应accelerate config生成文件的完整形态DDPDistributedDataParallel多机多卡compute_environment: LOCAL_MACHINE distributed_type: MULTI_GPU downcast_bf16: no gpu_ids: all machine_rank: 0 # 按节点修改 rank main_process_ip: 192.168.20.1 main_process_port: 9898 main_training_function: main mixed_precision: fp16 num_machines: 2 num_processes: 8 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: falseFSDPFully Sharded Data Parallelcompute_environment: LOCAL_MACHINE distributed_type: FSDP downcast_bf16: no fsdp_config: fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_backward_prefetch_policy: BACKWARD_PRE fsdp_forward_prefetch: true fsdp_offload_params: false fsdp_sharding_strategy: 1 fsdp_state_dict_type: FULL_STATE_DICT fsdp_sync_module_states: true fsdp_transformer_layer_cls_to_wrap: BertLayer fsdp_use_orig_params: true machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 2 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: falseDeepSpeed通过外部 JSON 配置文件compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: /home/user/configs/ds_zero3_config.json zero3_init_flag: true distributed_type: DEEPSPEED downcast_bf16: no machine_rank: 0 main_training_function: main num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: falseDeepSpeed直接使用 Accelerate 插件配置不依赖外部 JSONcompute_environment: LOCAL_MACHINE deepspeed_config: gradient_accumulation_steps: 1 gradient_clipping: 0.7 offload_optimizer_device: cpu offload_param_device: cpu zero3_init_flag: true zero_stage: 2 distributed_type: DEEPSPEED downcast_bf16: no machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false用 accelerate launch 启动训练accelerate launch是在分布式系统上配合 Accelerate 与Trainer启动训练脚本的推荐方式它会按config_file.yaml中的参数执行该文件保存在 Accelerate 缓存目录中运行accelerate launch时自动加载。例如以上述 FSDP 配置运行仓库中的 GLUE 文本分类示例 run_glue.pyaccelerate launch \ ./examples/pytorch/text-classification/run_glue.py \ --model_name_or_path bert-base-cased \ --task_name $TASK_NAME \ --do_train \ --do_eval \ --max_seq_length 128 \ --per_device_train_batch_size 16 \ --learning_rate 5e-5 \ --num_train_epochs 3 \ --output_dir /tmp/$TASK_NAME/ \也可以在命令行直接以参数形式指定config_file.yaml中的配置项而不必提前写配置文件accelerate launch --num_processes2 \ --use_fsdp \ --mixed_precisionbf16 \ --fsdp_auto_wrap_policyTRANSFORMER_BASED_WRAP \ --fsdp_transformer_layer_cls_to_wrapBertLayer \ --fsdp_sharding_strategy1 \ --fsdp_state_dict_typeFULL_STATE_DICT \ ./examples/pytorch/text-classification/run_glue.py --model_name_or_path bert-base-cased \ --task_name $TASK_NAME \ --do_train \ --do_eval \ --max_seq_length 128 \ --per_device_train_batch_size 16 \ --learning_rate 5e-5 \ --num_train_epochs 3 \ --output_dir /tmp/$TASK_NAME/ \小结Trainer的价值在于“开箱即用 深度可定制”的平衡日常训练只需TrainingArgumentsTrainertrain()三件套检查点保存/恢复与 Hub 推送开箱即得进阶场景可通过子类化重写compute_loss、training_step等核心方法实现自定义逻辑或用回调在不侵入训练循环的前提下观测状态、控制流程配合 Accelerate 的 DDP/FSDP/DeepSpeed 配置与accelerate launch启动器即可平滑地从单卡实验扩展到多机多卡训练。相关实现与示例均可在当前仓库中查阅trainer.py、training_args.py、trainer_callback.py、trainer_seq2seq.py 以及 run_glue.py。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表