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是 Transformers 内置的完整训练与评估循环它封装了批处理batching、打乱shuffling、填充padding、前向传播、损失计算、反向传播与权重更新等全部底层细节。本文以仓库文档 docs/source/en/trainer.md 为骨架结合 training.md 微调教程与 trainer_customize.md 扩展指南深入讲解如何用Trainer快速完成大模型微调、如何用TrainingArguments精细化配置训练、以及如何通过子类化改写训练循环实现 DPO/GRPO 等进阶玩法。读完本文你将掌握一套可直接落地的端到端微调方案并能按需对Trainer做定制化改造。Trainer 是什么一条开箱即用的训练/评估循环Trainer的核心定位非常明确你只需要一个模型和一份数据集就能开始训练。文档中把它描述为 a complete training and evaluation loop for Transformers models也就是说它替你处理了以下所有机械化工作数据管线将数据集按批次切分、随机打乱、pad 成张量由 data collator 组装每个 batch训练循环执行 forward pass → 计算 loss → 反向传播梯度 → 更新权重训练配置通过TrainingArguments一站式定制批量大小、训练时长、分布式策略、模型编译等一切选项。从源码看Trainer.train是主训练入口它依次处理模型重初始化model_init、梯度检查点激活、NEFTune 钩子、断点续训resume_from_checkpoint最终把核心工作交给_inner_training_loop完成实际的迭代。整个类在 src/transformers/trainer.py 中实现包含约 4500 行代码覆盖数据加载、优化器调度器构建、日志、评估、checkpoint 保存等完整生命周期。与Trainer配套的关键参考文档均已存在于当前仓库微调教程入门第一个大模型微调项目Trainer 方法子类化改写法定制训练行为数据整理器 Data collators自定义批次组装方式回调 Callbacks挂钩训练事件梯度检查点内存与速度的权衡细节Trainer 特性配方自定义损失、内存高效评估等最小可运行示例。端到端微调实战以 Qwen3 因果语言模型为例下面完整走一遍微调流程这是Trainer最典型的使用场景在较少的算力、数据和时间预算下让预训练模型适配某个特定任务或领域例如用编程语料微调提升代码能力。微调与预训练的唯一区别是不从头随机初始化权重。第一步登录 Hugging Face 账号要把微调好的模型推送到 Hub先用用户令牌登录from huggingface_hub import login login()第二步数据准备与分词加载数据集并对模型将要训练的文本列示例数据集中的horoscope列做分词from datasets import load_dataset from transformers import AutoTokenizer, DataCollatorForLanguageModeling model_name Qwen/Qwen3-0.6B tokenizer AutoTokenizer.from_pretrained(model_name) dataset load_dataset(karthiksagarn/astro_horoscope, splittrain) def tokenize(batch): return tokenizer( batch[horoscope], truncationTrue, max_length512, ) dataset dataset.map(tokenize, batchedTrue, remove_columnsdataset.column_names) dataset dataset.train_test_split(test_size0.1)分词器产出模型的输入input_ids和attention_mask。由于模型 forward 方法只接受这两类输入通过remove_columns在分词后把horoscope等原始列删掉。要点设置truncationTrue并配合max_length把过长的序列截断到指定最大长度用 [datasets.train_test_split] 划分出测试集供后续评估使用。接下来用data collator把样本组装成模型可处理的 batch。DataCollatorForLanguageModeling采用动态填充策略每个 batch 只填充到该 batch 内最长序列的长度而不是把全数据集所有序列统一 pad 到同一长度从而避免计算大量无意义的 padding token节省显存与算力。对因果语言建模需要设置mlmFalse避免随机遮蔽 tokendata_collator DataCollatorForLanguageModeling(tokenizer, mlmFalse)第三步加载预训练模型加载待微调的预训练 checkpoint关键参数是dtypeauto——它让权重按保存时的原始 dtype 加载。如果不加PyTorch 会默认以torch.float32加载当权重原本是torch.bfloat16时内存占用会翻倍from transformers import AutoModelForCausalLM, TrainingArguments, Trainer model_name Qwen/Qwen3-0.6B model AutoModelForCausalLM.from_pretrained(model_name, dtypeauto)第四步用 TrainingArguments 配置训练TrainingArguments提供全部训练选项。文档将其分为四类核心配置训练时长类num_train_epochs训练轮数per_device_train_batch_size单设备 batch 大小learning_rate优化器初始学习率。训练优化类bf16True硬件支持时Ampere 及更新架构 GPU启用 BF16 混合精度加速老硬件退回fp16Truegradient_accumulation_steps通过多次前向累加梯度再统一更新权重模拟更大的有效 batch sizegradient_checkpointing以计算换显存反向传播时重算中间激活而非存储。折中方案可参考 partial checkpointing当gradient_checkpointingTrue时设置gradient_checkpointing_kwargs{offload: True}可把保存的激活驻留在页锁定主机内存显著降低长序列下的 GPU 显存占用代价是速度变慢详见 offloading the saved activationstrain_sampling_strategygroup_by_length把长度相近的样本分到同一 batch减少 padding。对基于 processor 的多模态数据集和预计算长度场景见 trainer_recipes 中的 group samples by length。评估与保存类eval_strategy与save_strategy决定训练中何时评估模型、何时保存 checkpointload_best_model_at_end训练结束时加载最优 checkpoint前提是必须设置eval_strategy。日志类logging_steps控制训练过程中 loss 的更新与输出频率。从源码实现看这些参数在 src/transformers/training_args.py 中以 dataclass field 形式定义并附带了详细的help元数据例如gradient_checkpointing_kwargs在 第 910 行 解释了every_n_layers与offload的行为train_sampling_strategy在 第 1362 行 定义了random/sequential/group_by_length/batch_rebalance四种取值。关于gradient_checkpointing_kwargs的更多细节every_n_layers只对每第 n 个解码器层做 checkpointing1即全部层都检查点化的常规行为更大的值用少量显存换回速度其他键会被透传给torch.utils.checkpoint.checkpoint。这些解释与 trainer.py 中train方法对gradient_checkpointing_kwargs的实际解析逻辑完全一致。一个完整的训练配置示例training_args TrainingArguments( output_dirqwen3-finetuned, num_train_epochs3, per_device_train_batch_size2, gradient_accumulation_steps8, gradient_checkpointingTrue, gradient_checkpointing_kwargs{every_n_layers: 4}, bf16True, learning_rate2e-5, logging_steps10, eval_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, )第五步创建 Trainer 并启动训练把所有组件组装进Trainer实例调用train()即可开始训练结束后用push_to_hub()把结果上传trainer Trainer( modelmodel, argstraining_args, train_datasetdataset[train], eval_datasetdataset[test], processing_classtokenizer, data_collatorDataCollatorForLanguageModeling(tokenizer, mlmFalse), ) trainer.train() trainer.push_to_hub()Trainer.push_to_hub会把微调后的权重、generation config、tokenizer 和模型 config 一并上传到 Hub提交信息默认为 End of training可通过commit_message参数修改也支持blocking、token、revision等参数。进阶子类化 Trainer 方法定制训练行为当标准Trainer无法满足需求时不必重写整个训练循环——子类化对应方法即可它修改的是训练循环中做了什么如 forward pass、loss 计算。在动手之前先判断需求性质需要改变何时 / 是否执行某个动作日志、评估、早停→ 用 Callback需要改变计算什么损失计算、数据加载、优化→ 子类化Trainer方法。[!NOTE] 完整的可子类化方法清单见TrainerAPI 文档。以下划线开头的私有方法如_save_checkpoint、_evaluate也可以覆写但可能随时变动不保证向后兼容。覆写 get_train_dataloaderGRPO 的批量生成优化标准实现get_train_dataloader源码见 trainer.py的逻辑是加载一个 batch → 训练 → 丢弃 → 加载下一个 batchdef get_train_dataloader(self): return self._get_dataloader( batch_sizeself._train_batch_size, ... )GRPO是一种在线强化学习算法训练前先要生成完成序列。逐 step 生成非常昂贵512 token 的完成序列需要约 512 次顺序前向而一个训练 step 只需要 1 次前向。GRPOTrainer通过子类化get_train_dataloader把多个 step 的生成提示词一次性批量加载将 batch size 乘以steps_per_generation参数。若train_batch_size4、steps_per_generation8dataloader 产出 batch 大小为 32生成成本降低 8 倍def get_train_dataloader(self): dataloader_params { batch_size: self._train_batch_size * self.args.steps_per_generation, # this is the only change ... }覆写 compute_lossDPO 的自定义损失标准compute_loss源码见 trainer.py返回模型计算的交叉熵损失并支持return_outputs、num_items_in_batch等可选参数def compute_loss(self, model, inputs, return_outputsFalse, num_items_in_batchNone): ... outputs model(**inputs) ... loss outputs[loss] # get loss from model return (loss, outputs) if return_outputs else lossDPODirect Preference Optimization衡量策略模型相对参考模型对选中回答 vs 被拒回答的偏好强度其损失计算与标准交叉熵在多个层面不同因此DPOTrainer需要覆写compute_loss模型看不到 labels只返回 logits由 DPO 自行计算 log-probschosen 与 rejected 回答被拼接在同一 batch 中参考模型独立计算自己的 log-probs损失是π_chosen、π_rejected、π_ref_chosen、π_ref_rejected的函数。这些都不符合标准Trainer.compute_loss的形态覆写后的实现如下def compute_loss( self, model: PreTrainedModel | nn.Module, inputs: dict[str, torch.Tensor | Any], return_outputsFalse, num_items_in_batchNone, ) - torch.Tensor | tuple[torch.Tensor, dict[str, float]]: ... outputs model(**inputs) logits outputs.logits logps get_logps(logits, inputs) chosen_logps, rejected_logps logps.chunk(2, dim0) # batch is [chosen, rejected] ref_logits self.ref_model(**inputs).logits ref_logps get_logps(ref_logits, inputs) ref_chosen_logps, ref_rejected_logps ref_logps.chunk(2, dim0) # batch is [chosen, rejected] chosen_scores chosen_logps - ref_chosen_logps rejected_scores rejected_logps - ref_rejected_logps per_sequence_loss -F.logsigmoid(self.beta * chosen_scores - rejected_scores) loss per_sequence_loss.mean() return (loss, outputs) if return_outputs else loss注意子类化compute_loss时若自定义损失不使用num_items_in_batch应把self.model_accepts_loss_kwargs覆写为False否则梯度累积场景下损失计算可能略微不准这是compute_lossdocstring 中明确提示的注意事项。更多真实案例可参考GRPOTrainer、DPOTrainer对Trainer的扩展方式以及基于它构建自定义 trainer 的开源项目。下一步学习路径从微调教程开始掌握用Trainer训练大语言模型的完整流程阅读子类化 Trainer 方法了解更丰富的覆写示例参考数据整理器学习自定义 batch 组装阅读回调学习挂钩训练事件日志、早停等浏览 Trainer 特性配方获取自定义损失函数、内存高效评估、checkpointing 等最小可运行示例仓库中的 examples/pytorch 目录如 text-generation 下的run_generation.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),仅供参考
返回列表