微调训练

官方训练入口是 Trainer。本章先用 DistilBERT + rotten_tomatoes 做完整分类微调(CPU 也能跑完一小截);再给 PEFT LoRA 草图。全参硬训 7B 不是入门作业。

显存警告: DistilBERT 分类在 4GB 级 GPU 或 CPU 上可行(CPU 会慢)。对因果 LM 做全参微调很容易 OOM——请用 LoRA,或先在本站 PyTorch 里搞清 batch 与梯度。没有 GPU 时,把 max_steps 设很小做「能跑通」即可。


Trainer:影评情感分类

import numpy as np
import evaluate
from datasets import load_dataset
from transformers import (
    AutoTokenizer,
    AutoModelForSequenceClassification,
    DataCollatorWithPadding,
    TrainingArguments,
    Trainer,
)

model_id = "distilbert/distilbert-base-uncased"
raw = load_dataset("rotten_tomatoes")
tokenizer = AutoTokenizer.from_pretrained(model_id)

def tokenize(batch):
    return tokenizer(batch["text"], truncation=True)

tokenized = raw.map(tokenize, batched=True)
model = AutoModelForSequenceClassification.from_pretrained(model_id, num_labels=2)
accuracy = evaluate.load("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    preds = np.argmax(logits, axis=-1)
    return accuracy.compute(predictions=preds, references=labels)

args = TrainingArguments(
    output_dir="./rt-distilbert",
    eval_strategy="epoch",
    save_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=2,
    weight_decay=0.01,
    report_to="none",
    fp16=False,  # 有 NVIDIA GPU 可改 True
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized["train"],
    eval_dataset=tokenized["validation"],
    processing_class=tokenizer,
    data_collator=DataCollatorWithPadding(tokenizer),
    compute_metrics=compute_metrics,
)
# trainer.train()
# trainer.save_model("./rt-distilbert-final")

CPU 试跑可改 per_device_train_batch_size=4,并用 raw["train"].select(range(512))。学完循环细节仍建议对照本站 PyTorch 教程


推理刚训好的模型

from transformers import pipeline

pipe = pipeline("text-classification", model="./rt-distilbert-final")
print(pipe("A warm, clever, and generous film."))

标签可能是 LABEL_0 / LABEL_1。可在 from_pretrained(..., num_labels=2) 时传入 id2label={0: "NEGATIVE", 1: "POSITIVE"}


PEFT LoRA 最小草图

只训练低秩适配器,底座冻结。适合 Qwen/Qwen2.5-0.5B-Instruct 这类小因果 LM(仍建议有 GPU):

from peft import LoraConfig, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

base = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-0.5B-Instruct",
    device_map="auto",
    dtype="auto",
)
peft_cfg = LoraConfig(
    r=8,
    lora_alpha=16,
    lora_dropout=0.05,
    task_type=TaskType.CAUSAL_LM,
    target_modules=["q_proj", "v_proj"],
)
model = get_peft_model(base, peft_cfg)
model.print_trainable_parameters()
# 随后把 model 交给 Trainer;数据需做成 input_ids + labels

pip install peft。训完 model.save_pretrained("./qwen-lora") 只保存适配器(数 MB 到几十 MB),再 PeftModel.from_pretrained(base, "./qwen-lora")。完整数据整理见 实战案例


何时不要上 Trainer

情况替代
只要对话Ollama
自己写循环、DeepSpeedAccelerate + 纯 PyTorch
7B+ 全参、单卡 8GB必 LoRA / QLoRA,或放弃全参

Agent 代写训练脚本可用 Hugging Face Skills 里的 trainer skill,仍需你看懂显存与许可。


下一步

评论