Transformers documentation
微调
微调
微调是在针对特定任务或领域的小型数据集上继续训练一个大型预训练模型。例如,在包含编程示例的数据集上进行微调,有助于提升模型的编程能力。微调与预训练的过程相同,区别在于你无需从随机权重开始。此外,微调所需的计算资源、数据量和时间也少得多。
下面的教程将介绍如何使用 Trainer 对大型语言模型进行微调。
帮助用户为其任务规划微调运行。在提出配置之前,请确定任务、预训练模型及其修订版本、数据集字段、评估数据、Transformers 版本、硬件以及可用内存。使用本教程来检查适用于其情况的数据准备、模型加载以及 Trainer 设置。不要假设示例数据集或模型适用于其他任务。
- 询问可能影响模型、预处理或训练配置的缺失细节。明确说明任何假设。
- 将评估示例与训练数据分开。为任务选择模型和分词器,准备模型所需的输入和标签,并选择与这些输入匹配的数据整理器。
- 将
TrainingArguments配置为匹配用户的硬件和目标。在用户需要时,配置评估和检查点保存。在运行完整训练任务之前,先执行一次小规模测试,并确认模型接收了预期的输入、损失值为有限值,且评估能够正常完成。 - 除非用户要求,否则不要启动完整的训练运行或上传工件。请报告拟议的配置、来自任何测试的证据、预期的资源权衡,以及任何你无法验证的内容。
使用您的用户令牌登录 Hugging Face 账户,以将微调后的模型推送到 Hub。
from huggingface_hub import login
login()分词
加载数据集,并对模型训练所用的文本列(即下方数据集中的 horoscope)进行 分词。
分词器会创建模型输入 input_ids 和 attention_mask。由于模型的前向方法仅接受 input_ids 和 attention_mask,因此请设置 remove_columns 以在分词后删除 horoscope 等列。
- 设置
truncation=True和max_length,以将较长的序列截断为指定的最大长度。 - 使用
train_test_split方法创建测试集,以评估模型。
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", split="train")
def tokenize(batch):
return tokenizer(
batch["horoscope"],
truncation=True,
max_length=512,
)
dataset = dataset.map(tokenize, batched=True, remove_columns=dataset.column_names)
dataset = dataset.train_test_split(test_size=0.1)数据整理器(data collator)负责将数据集样本组装成批次,供模型处理。DataCollatorForLanguageModeling 会动态地将每个批次填充至该批次中最长序列的长度,而不是将数据集中的所有序列都填充到相同长度。通过避免计算不必要的填充标记,这种方式可以节省计算资源和内存。
- 设置
mlm=False以避免随机屏蔽 token。
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)加载模型
加载预训练检查点以进行微调(有关加载模型的更多详细信息,请参阅 加载模型 指南)。
- 将
dtype="auto"设置为加载权重时保留其保存时的数据类型。如果不设置,PyTorch 会以torch.float32加载权重,如果权重原本是torch.bfloat16,内存占用会翻倍。
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
model_name = "Qwen/Qwen3-0.6B"
model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto")训练配置
TrainingArguments 提供了用于自定义训练过程的所有选项。此处仅介绍最常用的参数。其他参数均具有合理的默认值,或仅与特定场景(如分布式训练)相关。完整的参数列表请参阅 TrainingArguments API 文档。
num_train_epochs和per_device_train_batch_size控制训练时长和批大小。learning_rate设置优化器的初始学习率。
- 如果硬件支持(Ampere 及更高版本的 GPU),请设置
bf16=True以进行快速混合精度训练。否则,在较旧的硬件上回退到fp16=True。 gradient_accumulation_steps通过在多次前向传播中累积梯度,然后再更新权重,从而模拟更大的有效批量大小。gradient_checkpointing通过在反向传播过程中重新计算中间激活值,而不是将其存储,从而以计算换取内存。若要在内存和速度之间取得折中,请参阅 partial checkpointing。- 当
gradient_checkpointing=True时,请设置gradient_checkpointing_kwargs={"offload": True},以将保存的激活值保留在固定的主机内存中,从而降低长序列的 GPU 内存占用。有关权衡,请参阅 卸载保存的激活值。 - 设置
train_sampling_strategy="group_by_length"可将长度相近的样本进行批处理,从而减少填充。有关基于处理器的多模态数据集和预计算长度,请参阅 按长度对样本进行分组。
eval_strategy和save_strategy决定了在训练过程中何时评估模型以及何时保存检查点。load_best_model_at_end会在训练结束时加载最佳检查点。它要求设置eval_strategy。
logging_steps控制训练期间更新并返回 loss 的频率。
training_args = TrainingArguments(
output_dir="qwen3-finetuned",
num_train_epochs=3,
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
gradient_checkpointing=True,
gradient_checkpointing_kwargs={"every_n_layers": 4},
bf16=True,
learning_rate=2e-5,
logging_steps=10,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)训练
创建一个包含所有必要组件的 Trainer 实例,然后调用 train() 开始训练。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
processing_class=tokenizer,
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
trainer.train()
trainer.push_to_hub()push_to_hub() 会将微调后的权重、生成配置、分词器和模型配置上传到 Hub。
后续步骤
- 阅读 Trainer 功能 指南,了解常见 Trainer 功能(如自定义损失函数、内存高效评估、检查点等)的最小可运行示例。
- 阅读子类化 Trainer 方法指南,了解如何对Trainer方法进行子类化,以支持新的和自定义的功能。
- 阅读 Callbacks 指南,了解如何挂钩训练事件以实现日志记录、早停及其他自定义行为。
- 阅读数据整理器指南,了解如何自定义将样本组装为批次的过程。
- 在通过 Hugging Face Jobs 租用的 GPU 上运行训练脚本。
- 浏览 notebooks 或 Resources > Task Recipes 部分,获取更多针对不同文本、音频、视觉和多模态任务的训练示例。