微调GPT-2教程2026:带真实代码的完整新手入门

📘 教程 2026-08-11 · 更新于 2026-10-19 约 12 分钟阅读

GPT-2又小又免费,是学微调最合适的模型。但多数教程默认你懂transformers内部,这里给一条从零能跑通的路径。

📜 目录

微调GPT-2教程2026:带真实代码的完整新手入门

学微调最贵的成本不是算力,是搞不清流程。GPT-2 只有一亿多参数,笔记本 GPU 几分钟能训完,transformers 完整支持,是理解微调整条链路最合适的模型。跑通一遍之后,把这套流程换成 7B 模型加 QLoRA,就是 2026 年主流做法。

一、为什么拿GPT-2练手

缺点也明确:GPT-2 的中文能力很弱,别指望用它做出能用的中文产品,它的价值是教学。

二、环境与数据

pip install torch transformers datasets accelerate

数据用一个纯文本文件就够,一行一段或者一整篇都行。因果语言模型的训练不需要标签——文本本身既是输入也是目标,模型学的是"给定前文,下一个 token 是什么"。

数据量建议 500 到 2000 条段落。太少学不到模式,太多训练时间变长但教学质量提升有限。内容要和你想要的输出风格一致,想让它写产品文案就喂产品文案,别混一堆小说。

三、完整代码

from datasets import load_dataset
from transformers import (AutoTokenizer, AutoModelForCausalLM,
                          DataCollatorForLanguageModeling,
                          Trainer, TrainingArguments)

MODEL = "openai-community/gpt2"

tok = AutoTokenizer.from_pretrained(MODEL)
# GPT-2没有pad token,必须用eos顶上,否则batch会报错
if tok.pad_token is None:
    tok.pad_token = tok.eos_token

raw = load_dataset("text", data_files={"train": "mydata.txt"})["train"]
raw = raw.train_test_split(test_size=0.05, seed=42)

def tokenize(batch):
    return tok(batch["text"], truncation=True, max_length=256)

ds = raw.map(tokenize, batched=True, remove_columns=["text"])

model = AutoModelForCausalLM.from_pretrained(MODEL)

args = TrainingArguments(
    output_dir="./gpt2-finetuned",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=5e-5,
    warmup_steps=100,
    logging_steps=20,
    save_strategy="epoch",
    eval_strategy="epoch",   # 旧版transformers写作 evaluation_strategy
    fp16=False,              # 有NVIDIA显卡且支持时改True,省显存提速
)

collator = DataCollatorForLanguageModeling(tokenizer=tok, mlm=False)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=ds["train"],
    eval_dataset=ds["test"],
    data_collator=collator,
)

trainer.train()
trainer.save_model("./gpt2-finetuned")
tok.save_pretrained("./gpt2-finetuned")

几个容易踩的点:

四、训练参数怎么设

参数 含义 新手建议
learning_rate 学习率 5e-5 起,太大loss乱跳,太小不收敛
num_train_epochs 训练轮数 3 轮起步,小数据集容易过拟合
per_device_train_batch_size 单卡批大小 显存不够就降到 1-2
gradient_accumulation_steps 梯度累积 用小批凑等效大批,4 或 8
max_length 单样本长度 128-256 够用,越长越吃显存
warmup_steps 预热步数 总步数的 5%-10%
fp16 混合精度 有 NVIDIA 显卡可开

不要一上来就调学习率搜索。先把 loss 曲线跑出来,确认在下降,再谈优化。

五、实际要跑多久

硬件 500 条样本、3 轮 备注
消费级 GPU(8GB) 5-15 分钟 最常见情况
笔记本集成显卡 30-90 分钟 能跑但慢
纯 CPU 30-60 分钟以上 视核心数而定

时间差异主要来自 batch 大小和序列长度,缩短 max_length 往往比换硬件更快见效。

六、怎么判断训练成了还是过拟合

看两条 loss:训练 loss 持续下降、验证 loss 先降后升,就是过拟合的典型形状。这时候加数据、减轮数、或者加 dropout 比继续训有用。

生成侧的现象更直观:输出开始重复同一句话、或者逐字复述训练数据,说明模型记住了而不是学会了。相反,如果输出完全跑题、语法崩坏,通常是学习率太大或者训练不足。

七、验证生成

from transformers import pipeline

gen = pipeline("text-generation", model="./gpt2-finetuned",
               tokenizer="./gpt2-finetuned", device_map="auto")

out = gen("今天的产品更新", max_new_tokens=80, do_sample=True,
          temperature=0.8, top_p=0.95, repetition_penalty=1.1)
print(out[0]["generated_text"])

对比时固定提示词和采样参数,只看模型变化。

八、下一步:把GPT-2换成7B

这套流程能直接迁移,只有三处要改:

  1. 模型换成 Llama、Qwen 这类 7B 级,加载时用 4 位量化(bitsandbytes)。
  2. 训练方式换成 QLoRA:冻结原权重,只训低秩适配器,显存需求能压到单卡可承受范围。
  3. 保存时只需存适配器权重,几十 MB,加载时和基座模型合并。

那时你会发现自己已经懂了 padding、截断、学习率、过拟合这些概念——它们和模型大小无关。

九、三种典型失败与处理

失败一:loss 卡住不动。通常是学习率太大导致发散,或者数据没有正确 tokenize(比如 remove_columns 没写,collator 拿到字符串)。先打印一条 batch 出来看 input_ids 是不是数字。

失败二:输出完全复读训练数据。数据量太少而训练轮数太多,模型把样本背下来了。减轮数、加数据、或者把验证集比例调高,让它更早暴露过拟合。

失败三:训练正常但生成乱码。多半是保存或加载时分词器不一致。保存时一定要 tok.save_pretrained 到同一个目录,加载时从那个目录读,不要重新从基座模型加载分词器。

这三种情况在 7B 模型上会以相同的形式出现,只是显存报错更早。所以先用 GPT-2 把这些坑踩一遍,成本最低。

常见问题

Q:数据要多少才有效? A:风格模仿类任务 500 条左右能看出效果,事实类知识建议不要靠微调,改用检索。

Q:能不能用中文数据训GPT-2? A:可以,但 GPT-2 的中文分词效率很低,一个字常被拆成多个 token,效果有限。中文场景直接用 Qwen 系列更合理。

Q:微调后的模型能商用吗? A:取决于基座模型的许可证。GPT-2 的许可相对宽松,但具体条款请以官方模型卡为准,不要凭印象。

Q:为什么loss降了但回答没变好? A:loss 衡量的是下一个 token 的预测能力,不直接等于你关心的人工评价。要用自己的测试问题评估。

Q:CPU训练慢到无法接受怎么办? A:缩短序列长度、减少样本数、只训 1-2 轮先验证流程是否跑通,再上 GPU 做真正的训练。

注:transformers 的参数名随版本变化(如 eval_strategy 与 evaluation_strategy),运行前请对照当前版本的官方文档。

相关文章

延伸阅读 · 含推广链接

免费额度适合验证想法,不适合跑常驻任务。按量付费按实际用量结算,比包年更不容易浪费。

对比按量与包年 →

相关文章
2026-08-28
联盟营销是怎么赚钱的?优惠券站背后的商业模式
2026-08-14
Ollama 模型体积 2026:每个模型到底需要多少内存
2026-08-06
音频助手:用Home Assistant和Whisper搭建本地语音助手
2026-07-24
2026年Midjourney新手教程
2026-08-14
2026 年该用哪个 AI API?8 家供应商按价格和质量对比
2026-07-27
Kubernetes部署AI

本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。

💬 评论 (0)

暂无评论,来说两句吧~

登录后评论