Transformers documentation

微调

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

微调

微调是在针对特定任务或领域的小型数据集上继续训练一个大型预训练模型。例如,在包含编程示例的数据集上进行微调,有助于提升模型的编程能力。微调与预训练的过程相同,区别在于你无需从随机权重开始。此外,微调所需的计算资源、数据量和时间也少得多。

下面的教程将介绍如何使用 Trainer 对大型语言模型进行微调。

Agent prompt

帮助用户为其任务规划微调运行。在提出配置之前,请确定任务、预训练模型及其修订版本、数据集字段、评估数据、Transformers 版本、硬件以及可用内存。使用本教程来检查适用于其情况的数据准备、模型加载以及 Trainer 设置。不要假设示例数据集或模型适用于其他任务。

  1. 询问可能影响模型、预处理或训练配置的缺失细节。明确说明任何假设。
  2. 将评估示例与训练数据分开。为任务选择模型和分词器,准备模型所需的输入和标签,并选择与这些输入匹配的数据整理器。
  3. 将 TrainingArguments 配置为匹配用户的硬件和目标。在用户需要时,配置评估和检查点保存。在运行完整训练任务之前,先执行一次小规模测试,并确认模型接收了预期的输入、损失值为有限值,且评估能够正常完成。
  4. 除非用户要求,否则不要启动完整的训练运行或上传工件。请报告拟议的配置、来自任何测试的证据、预期的资源权衡,以及任何你无法验证的内容。

使用您的用户令牌登录 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 设置优化器的初始学习率。
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 部分,获取更多针对不同文本、音频、视觉和多模态任务的训练示例。
Update on GitHub