资讯动态

Transformers 预训练模型微调实战:从 Trainer 到原生 PyTorch 训练循环

发布时间:2026/9/10 8:27:26 来源:尧图企业网站定制
Transformers 预训练模型微调实战从 Trainer 到原生 PyTorch 训练循环【免费下载链接】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导读本文基于 Transformers 官方日语文档 docs/source/ja/training.md 编写系统讲解如何对预训练模型进行微调Fine-tuning先走一遍使用Trainer的高层训练流程再深入原生 PyTorch 手写训练循环的底层实现。读完本文你将掌握从数据集加载与分词、训练超参数配置、评估指标接入到优化器与学习率调度器创建、完整训练循环与评估的全链路能力并能将这些技能直接复用到文本分类、生成、序列标注等各类任务上。为什么需要微调使用预训练模型可以显著降低计算成本与碳排放无需从零开始训练即可获得 SOTA 模型。 Transformers 提供了数千个面向不同任务的预训练模型而将预训练模型迁移到自己的特定任务数据集上继续训练这一过程称为微调Fine-tuning——它是当今 NLP 领域最强大的训练技术之一。微调的本质是模型不再从随机权重起步而是在一个已经学到大语言规律的权重基础上用较小的领域数据继续优化。因此它所需的算力、数据和时间都远小于从零预训练。在动手之前请确保已按官方安装指南准备好环境并安装了datasets、evaluate、accelerate等配套库。准备数据集Prepare a dataset微调的第一步是下载并预处理数据集。本教程使用 Yelp Reviews 数据集包含 5 个情感标签的评论数据进行序列分类任务的演示。加载数据集通过datasets库的load_dataset一行代码即可加载 from datasets import load_dataset dataset load_dataset(yelp_review_full) dataset[train][100] {label: 0, text: My expectations for McDonalds are t rarely high. ...}每个样本包含两个字段text评论文本与label情感标签 0~4共 5 个类别。分词与批处理分词器负责把文本转换为模型可理解的 token id同时处理可变序列长度问题padding 与 truncation。利用datasets的map方法可以将预处理函数一次性应用到整个数据集 from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(google-bert/bert-base-cased) def tokenize_function(examples): ... return tokenizer(examples[text], paddingmax_length, truncationTrue) tokenized_datasets dataset.map(tokenize_function, batchedTrue)paddingmax_length将每条样本填充到固定最大长度便于组成 batchtruncationTrue截断超长序列batchedTrue让预处理函数对一批样本而非单条批量执行充分利用 GPU/CPU 向量化能力显著缩短预处理时间。构建小子集加速实验为缩短运行时间可以创建完整数据集的小型子集用于快速验证流程 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))固定seed42保证每次实验数据划分一致、结果可复现。使用 PyTorch Trainer 微调 Transformers 的Trainer类专门针对 Transformers 模型训练做了优化免去手动编写训练循环的繁琐同时支持日志记录、梯度累积、混合精度等一系列训练选项与特性对应实现见 src/transformers/trainer.py。加载模型并指定标签数 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)关于部分权重未使用警告加载时你可能会看到某些预训练权重未被使用、某些权重被随机初始化的警告这完全正常。BERT 预训练的分类头会被丢弃替换为随机初始化的新分类头微调的过程正是让这个新分类头在序列分类任务上学习同时把预训练模型学到的知识迁移过来。配置训练超参数TrainingArgumentsTrainingArguments类承载所有训练选项与可调超参数。其字段定义可在 src/transformers/training_args.py 中查看这里仅指定输出目录即可开始 from transformers import TrainingArguments training_args TrainingArguments(output_dirtest_trainer)常用超参数及其源码默认值一览均为TrainingArguments的默认配置参数默认值说明output_dirNone必填模型预测与 checkpoint 的输出目录per_device_train_batch_size8每张设备GPU/TPU core/CPU上的训练 batch 大小num_train_epochs3.0总训练轮数max_steps-1若为正数则覆盖num_train_epochs适用于流式数据集learning_rate5e-5优化器初始学习率lr_scheduler_typelinear学习率调度器类型见SchedulerType枚举warmup_steps0从 0 线性预热到learning_rate的步数optimadamw_torchPyTorch 2.8 为adamw_torch_fused优化器类型weight_decay0.0权重衰减系数自动排除 bias 与 LayerNorm 参数gradient_accumulation_steps1梯度累积步数有效 batch per_device_train_batch_size × 设备数 × 累积步数max_grad_norm1.0梯度裁剪范数设 0 关闭bf16/fp16False混合精度开关硬件支持时优先bf16eval_strategyno何时评估no/steps/epocheval_stepsNoneeval_strategysteps时的评估间隔默认回退到logging_stepssave_strategysteps何时保存 checkpointload_best_model_at_endFalse训练结束时加载最优 checkpoint需设置eval_strategylogging_steps500日志输出间隔接入评估指标EvaluateTrainer在训练过程中不会自动评估模型性能需要你把计算指标的函数传给它。evaluate库提供了简洁的accuracy指标加载方式 import numpy as np import evaluate metric evaluate.load(accuracy)由于所有 Transformers 模型返回的是logits在调用metric.compute前必须先用argmax把 logits 转换为预测类别 def compute_metrics(eval_pred): ... logits, labels eval_pred ... predictions np.argmax(logits, axis-1) ... return metric.compute(predictionspredictions, referenceslabels)若希望在微调过程中监控指标可在训练参数中通过eval_strategy指定评估时机——例如每个 epoch 结束时报告一次 from transformers import TrainingArguments, Trainer training_args TrainingArguments(output_dirtest_trainer, eval_strategyepoch)组装 Trainer 并开始训练把模型、训练参数、训练/测试数据集与评估函数组装为Trainer对象随后调用train() trainer Trainer( ... modelmodel, ... argstraining_args, ... train_datasetsmall_train_dataset, ... eval_datasetsmall_eval_dataset, ... compute_metricscompute_metrics, ... ) trainer.train()Trainer内部会自动完成optimizer 与 scheduler 的创建见 src/transformers/trainer.py 的create_optimizer/create_scheduler、梯度累积、梯度裁剪、混合精度、日志记录与 checkpoint 保存。训练结束后还可调用trainer.save_model()保存微调后的模型与分词器。使用原生 PyTorch 微调Trainer一行代码即可完成微调但如果你想完全掌控训练过程也可以使用原生 PyTorch 手写训练循环。此部分对应文档中的 Train in native Pytorch 章节。环境清理与数据格式调整若此前已运行过Trainer流程建议释放显存 del model del trainer torch.cuda.empty_cache()随后调整数据集格式使其适配模型输入# 1. 模型不接受原始文本输入删除 text 列 tokenized_datasets tokenized_datasets.remove_columns([text]) # 2. 将 label 列重命名为 labels模型期望的参数名 tokenized_datasets tokenized_datasets.rename_column(label, labels) # 3. 设置数据集格式为 PyTorch 张量 tokenized_datasets.set_format(torch)同样构建小子集加速验证 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))创建 DataLoader用 PyTorch 的DataLoader包装数据集以迭代 batch from torch.utils.data import DataLoader train_dataloader DataLoader(small_train_dataset, shuffleTrue, batch_size8) eval_dataloader DataLoader(small_eval_dataset, batch_size8)加载序列分类模型同样指定 5 个标签 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)优化器与学习率调度器使用 PyTorch 的AdamW优化器 from torch.optim import AdamW optimizer AdamW(model.parameters(), lr5e-5)学习率调度器可以使用transformers的get_scheduler统一创建其实现位于 src/transformers/optimization.py。该函数通过TYPE_TO_SCHEDULER_FUNCTION映射表见同文件 L944-L957把调度器名称解析为具体实现 from transformers import get_scheduler num_epochs 3 num_training_steps num_epochs * len(train_dataloader) lr_scheduler get_scheduler( ... namelinear, optimizeroptimizer, num_warmup_steps0, num_training_stepsnum_training_steps ... )get_scheduler支持的name取值即SchedulerType枚举包括linear、cosine、cosine_with_restarts、polynomial、constant、constant_with_warmup、inverse_sqrt、reduce_on_plateau、cosine_with_min_lr、cosine_warmup_with_min_lr、warmup_stable_decay、greedy。注意除constant等少数类型外大多数调度器要求提供num_warmup_steps否则会抛出ValueError。指定运行设备尽可能使用 GPU否则 CPU 上训练可能耗时数小时 import torch device torch.device(cuda) if torch.cuda.is_available() else torch.device(cpu) model.to(device)如果没有云 GPU可以使用 Colaboratory 或 SageMaker StudioLab 等托管笔记本免费获得 GPU 资源。手写训练循环使用tqdm显示训练进度标准的三轮循环如下 from tqdm.auto import tqdm progress_bar tqdm(range(num_training_steps)) model.train() for epoch in range(num_epochs): ... for batch in train_dataloader: ... batch {k: v.to(device) for k, v in batch.items()} ... outputs model(**batch) ... loss outputs.loss ... loss.backward() ... optimizer.step() ... lr_scheduler.step() ... optimizer.zero_grad() ... progress_bar.update(1)训练循环的关键步骤将每个 batch 的张量搬运到device前向传播得到loss调用loss.backward()计算梯度optimizer.step()更新权重lr_scheduler.step()推进学习率调度optimizer.zero_grad()清零梯度避免累积。手写评估循环与Trainer的compute_metrics不同原生循环中我们用evaluate.add_batch累积所有 batch 的预测最后统一计算指标 import evaluate metric evaluate.load(accuracy) model.eval() for batch in eval_dataloader: ... batch {k: v.to(device) for k, v in batch.items()} ... with torch.no_grad(): ... outputs model(**batch) ... logits outputs.logits ... predictions torch.argmax(logits, dim-1) ... metric.add_batch(predictionspredictions, referencesbatch[labels]) metric.compute()评估时务必调用model.eval()切换为推理模式关闭 dropout 等使用torch.no_grad()禁用梯度计算节省显存与时间对 logits 取argmax得到类别预测后送入metric.add_batch累积。从源码看 Trainer 的底层实现为进一步理解Trainer做了什么可以对照源码确认关键环节优化器与调度器Trainer.create_optimizer()src/transformers/trainer.py#L1227根据TrainingArguments.optim创建优化器create_scheduler()src/transformers/trainer.py#L1303内部同样调用get_scheduler按lr_scheduler_type生成调度器——与原生 PyTorch 路径完全一致训练主循环Trainer.train()src/transformers/trainer.py#L1406封装了数据迭代、梯度累积、梯度裁剪、混合精度、日志与 checkpoint 逻辑评估Trainer.evaluate()src/transformers/trainer.py#L2635负责在eval_strategy指定的时机执行评估并调用compute_metrics。TrainingArguments的字段校验逻辑src/transformers/training_args.py#L1526-L1550还做了若干约束例如设置eval_strategysteps时必须提供eval_steps或logging_stepsload_best_model_at_endTrue时save_strategy与eval_strategy必须匹配除非save_strategybest。了解这些约束可避免运行时参数报错。进阶参考与示例脚本仓库的 examples/pytorch/text-classification 目录提供了可直接运行的文本分类微调脚本run_glue.py基于Trainer的 GLUE 基准微调、run_glue_no_trainer.py基于Accelerate与原生训练循环、run_classification.py与run_xnli.py可作为实战模板仓库 notebooks 目录收录了针对不同任务微调模型的各类 notebook更多Trainer特性自定义损失函数、内存高效评估、checkpoint 等与回调机制可参阅 docs/source/en/trainer_recipes.md、docs/source/en/trainer_callbacks.md 等英文文档。总结本文完整复现了官方日语教程的核心脉络从 Yelp Reviews 数据集的加载与分词预处理到Trainer高层 API 的微调含TrainingArguments超参数、compute_metrics评估接入、eval_strategy评估时机再到原生 PyTorch 手写训练循环含DataLoader、AdamW、get_scheduler调度器、完整训练与评估代码并结合仓库源码说明了Trainer内部与原生路径的一致性。无论你偏好开箱即用的Trainer还是希望完全掌控每一步的原生 PyTorch本文给出的代码均可直接复制运行帮助你快速上手预训练模型的微调实践。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价