ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Transformers 微调实战指南:使用 Trainer 训练因果语言模型

2026/9/10 12:19:34 拓冰建站 浏览量
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/transformers微调Fine-tuning是指在较小的、面向特定任务或领域的数据集上继续训练一个大型预训练模型。与从头预训练的唯一区别在于微调不从随机权重开始而是以预训练权重为起点因此对算力、数据和训练时间的要求都大幅降低。本文以 Transformers 的 [Trainer] 为核心围绕「数据集分词 → 加载预训练模型 → 配置 TrainingArguments → 启动训练 → 推送到 Hub」的完整链路结合当前仓库 docs/source/en/training.md 指南与src/transformers下的源码实现带你完成一次开箱即用的因果语言模型微调并理解每一步背后的底层机制。微调与预训练的本质区别微调与预训练共享同一套优化流程都是把数据送入模型、计算损失、反向传播更新权重。二者唯一的差别在于初始权重——预训练从随机初始化开始而微调从一个已经学会通用语言知识的预训练检查点checkpoint开始。例如在一个包含大量代码样本的数据集上微调模型会逐渐在编码任务上表现得更好。正因为起点不同微调拥有三个显著优势计算开销小无需复现大规模预训练的计算量、数据需求低几千到几万条任务相关样本即可见效、训练时间短通常只需数个 epoch。这也是开源社区中绝大多数领域模型如代码模型、医疗模型、金融模型的生产路径。前置准备登录 Hugging Face 账号如果你计划在训练结束后把微调后的模型推送到 Hugging Face Hub首先需要用用户令牌user token登录账号。在终端或 Notebook 中执行from huggingface_hub import login login()login()会弹出交互式输入框粘贴你的访问令牌即可完成认证。这一步是可选的——不登录也能在本地完成训练但后续trainer.push_to_hub()将无法上传模型。数据准备与 Tokenization加载数据集微调的第一步是准备训练数据。以占星运势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)这里model_name同时用于加载分词器和模型保证二者词汇表一致。定义 tokenize 函数分词器的作用是把原始文本转换为模型可读的数值张量其产物是input_ids和attention_mask两个键input_ids是 token 在词表中的索引序列attention_mask标记哪些位置是真实 token值为 1、哪些是填充 token值为 0。由于模型的forward方法只接受这两个输入必须在map时通过remove_columns把horoscope等原始列丢弃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)两个关键参数truncationTrue配合max_length512把超过 512 个 token 的序列截断到指定最大长度防止超长序列撑爆显存或拖慢训练train_test_split(test_size0.1)把数据集切分为 90% 训练集 10% 测试集用于训练过程中的模型评估eval_strategyepoch时每个 epoch 结束后在测试集上计算 loss。map(..., batchedTrue)会按批次并行调用tokenize速度远快于逐条处理。DataCollatorForLanguageModeling动态填充与标签构造数据整理器data collator负责把数据集中的单条样本组装成模型可以一次性处理的 batch。这里使用的DataCollatorForLanguageModeling有两个核心职责动态填充把每个 batch 内的序列填充到该 batch 的最长长度而不是把整个数据集的所有序列都填充到全局最大长度。这样可以避免计算大量无意义的 padding token节省计算与显存构造标签当mlmFalse时标签与输入完全相同仅把 padding 位置的标签置为-100PyTorch 的交叉熵损失会自动忽略-100位置实现因果语言建模next-token prediction训练。data_collator DataCollatorForLanguageModeling(tokenizer, mlmFalse)从源码看该类的完整参数还包括见 data_collator.py参数默认值说明mlmTrue是否使用掩码语言建模微调因果 LM 时设为Falsewhole_word_maskFalse是否按整词而非单个 token 掩码仅mlmTrue时有效mlm_probability0.15随机掩码 token 的概率仅mlmTrue时有效mask_replace_prob0.8被掩码 token 替换为[MASK]的概率random_replace_prob0.1被掩码 token 替换为随机词表 token 的概率pad_to_multiple_ofNone将序列填充到该值的整数倍便于某些算子对齐seedNone掩码随机数种子保证可复现源码中还校验了一条重要约束如果mlmTrue而 tokenizer 没有mask_token例如纯因果分词器会直接抛出ValueError提示应改用mlmFalse见 data_collator.py。此外mask_replace_prob与random_replace_prob之和不能超过 1剩余比例对应「掩码后保持不变」的 token。加载预训练模型使用AutoModelForCausalLM加载用于因果语言建模的预训练检查点from transformers import AutoModelForCausalLM, TrainingArguments, Trainer model_name Qwen/Qwen3-0.6B model AutoModelForCausalLM.from_pretrained(model_name, dtypeauto)这里最关键的是dtypeauto参数它让模型权重保持其保存时的数据类型加载。如果省略它PyTorch 会默认把权重加载为torch.float32当权重原本是torch.bfloat16时这会让内存占用直接翻倍。从 modeling_utils.py 的加载逻辑可以看到dtype为auto时会从配置或检查点元数据推断原始精度对 7B 级别的模型而言这往往是能否塞进单卡显存的分水岭。加载模型的更多细节可参考 models.md 加载指南。训练配置TrainingArgumentsTrainingArguments提供了定制训练流程的全部选项。指南只覆盖最常见参数其余均有合理默认值或仅在分布式训练等特定场景下才相关完整列表见其 API 文档。按功能可以归为四组训练时长与批量num_train_epochs训练轮数控制训练总时长per_device_train_batch_size每个设备上的 batch 大小learning_rate优化器的初始学习率因果 LM 微调常用1e-5~3e-5区间。训练优化bf16True开启 BF16 混合精度训练可显著提速并降低显存需要 Ampere 及以上的较新 GPU。旧硬件上可回退使用fp16Truegradient_accumulation_steps梯度累积步数。通过先执行多次前向、累积梯度后再统一更新权重模拟更大的有效 batch 大小有效 batch per_device_train_batch_size × gradient_accumulation_steps在显存受限时尤其有用gradient_checkpointing梯度检查点。正常训练时前向会把全部中间激活缓存下来供反向使用激活量随 batch 与序列长度线性增长开启后只保存部分激活反向时按需重算用少量计算时间换取大量显存。记忆与速度的折中方案partial checkpointing见 grad_checkpointing.mdgradient_checkpointing_kwargs梯度检查点的附加选项。当gradient_checkpointingTrue时设置{offload: True}可把保存的激活放到页锁定pinned的主机内存中进一步降低长序列场景下的 GPU 显存占用代价是每次前向/反向各多一次设备与主机间的拷贝详见 grad_checkpointing.md设置{every_n_layers: 4}则只对每第 n 层做检查点在显存有余量时换取更快速度——从源码看every_n_layers1默认检查每一层every_n_layers2则检查第 1、3、5…层见 grad_checkpointing.mdtrain_sampling_strategygroup_by_length按序列长度对样本分组让同一 batch 内的样本长度相近减少 padding 浪费。该参数在 training_args.py 中默认值为random对于基于 processor 的多模态数据集或已预计算好长度的场景可参考 trainer_recipes.md 中的按长度分组。评估与检查点eval_strategy与save_strategy决定训练过程中何时评估模型、何时保存检查点可选no/steps/epoch默认no见 training_args.pyload_best_model_at_endTrue训练结束时自动加载评估指标最好的检查点。前提是必须设置eval_strategy同时源码强制要求save_strategy与eval_strategy一致除非save_strategybest若使用steps还需保证save_steps是eval_steps的整数倍否则训练直接报错见 training_args.py。日志logging_steps控制训练过程中打印/上报 loss 的频率默认值为 500见 training_args.py 附近。把以上参数组合成一份完整的配置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, )这份配置的实际效果有效 batch 大小为2 × 8 16每个 epoch 结束评估一次并保存检查点训练结束后自动加载最优检查点显存敏感场景下仅每 4 层做一次梯度检查点兼顾显存与速度。启动训练TrainerTrainer是 Transformers 提供的「简单但功能完整」的 PyTorch 训练/评估循环专为该库优化。把前面准备好的所有组件装配进Trainer实例然后调用train()trainer Trainer( modelmodel, argstraining_args, train_datasetdataset[train], eval_datasetdataset[test], processing_classtokenizer, data_collatorDataCollatorForLanguageModeling(tokenizer, mlmFalse), ) trainer.train() trainer.push_to_hub()各参数职责见 trainer.py 的 docstringmodel待训练的模型可以是PreTrainedModel或任意torch.nn.Moduleargs上文配置的TrainingArgumentstrain_dataset/eval_dataset训练与评估数据集传入datasets.Dataset时模型forward()不接受的列会被自动移除processing_class分词器/图像处理器/processor 等处理类会被一并保存方便中断后续训或直接复用微调后的模型data_collator负责组装 batch 的数据整理器此外还支持compute_metrics评估指标函数、callbacks自定义回调、optimizers自定义优化器与调度器等扩展点。trainer.train()执行完整训练循环后trainer.push_to_hub()会把以下内容上传到 Hub见 trainer.py 的实现微调后的权重文件save_model触发模型配置config分词器processing class生成配置generation config若存在。从源码看push_to_hub最终调用hf_api().upload_folder上传output_dir目录并自动忽略_*内部文件和checkpoint-*检查点目录若hub_model_id尚未指定还会自动初始化一个 Hub 仓库。默认提交信息为End of training可通过commit_message参数修改。训练中易踩的坑与检查清单结合源码与实战经验微调前建议逐项确认load_best_model_at_endTrue时eval_strategy必须非no且save_strategy与eval_strategy必须一致steps模式下save_steps需是eval_steps的整数倍否则 training_args.py 的校验会在启动时直接抛错dtypeauto务必保留否则 BF16 预训练权重被加载为 FP32显存翻倍gradient_checkpointing_kwargs的两种用法{offload: True}与{every_n_layers: N}可组合使用分别从「激活存放位置」和「检查点密度」两个维度压显存remove_columnsdataset.column_names会在 tokenize 后丢掉全部原始列若之后还想用原始字段如按长度分组需要先缓存长度再删除数据量较小时num_train_epochs可适当增大3~5 轮并配合learning_rate的小幅衰减避免过拟合。下一步学习路径微调入门之后可以从以下仓库文档继续深入trainer_recipes.mdTrainer 常见功能的极简示例如自定义损失函数、内存高效评估、检查点策略等trainer_customize.md通过子类化Trainer方法支持自定义功能trainer_callbacks.md通过回调钩入训练事件实现日志、早停等自定义行为data_collators.md自定义样本组装方式包括DataCollatorWithPadding子类化与DataCollatorMixin完全自定义两种路线grad_checkpointing.md梯度检查点与部分检查点、激活卸载的完整原理trainer.md 与 training_args.pyTrainer 与 TrainingArguments 的完整 API 参考仓库 examples/pytorch 目录提供了文本、音频、视觉与多模态等多种任务的训练脚本notebooks.md 汇集了各任务的 Notebook 示例可按需选取对应任务的 Recipe 继续实践。【免费下载链接】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),仅供参考