微调GPT-2教程2026:带真实代码的完整新手入门
GPT-2又小又免费,是学微调最合适的模型。但多数教程默认你懂transformers内部,这里给一条从零能跑通的路径。
📜 目录
微调GPT-2教程2026:带真实代码的完整新手入门
学微调最贵的成本不是算力,是搞不清流程。GPT-2 只有一亿多参数,笔记本 GPU 几分钟能训完,transformers 完整支持,是理解微调整条链路最合适的模型。跑通一遍之后,把这套流程换成 7B 模型加 QLoRA,就是 2026 年主流做法。
一、为什么拿GPT-2练手
- 显存需求低,消费级显卡甚至 CPU 都能跑。
- 权重和分词器公开,不用申请权限。
- 训练时间短,改一次参数十几分钟就能看到结果,适合反复实验。
- 它暴露的问题(padding、特殊 token、过拟合、保存重载)在所有模型上都一样。
缺点也明确: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")
几个容易踩的点:
mlm=False表示走因果语言模型,不是 BERT 那种掩码语言模型。写错了 loss 会完全不对。pad_token必须设,否则 batch 拼不起来。remove_columns=["text"]很重要,原始字符串列不删,collator 会报类型错误。max_length决定单条样本截断长度,和显存直接相关。
四、训练参数怎么设
| 参数 | 含义 | 新手建议 |
|---|---|---|
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"])
do_sample=False得到确定输出,适合对比两次训练的差异。temperature低更保守,高更发散。repetition_penalty大于 1 能压住复读。
对比时固定提示词和采样参数,只看模型变化。
八、下一步:把GPT-2换成7B
这套流程能直接迁移,只有三处要改:
- 模型换成 Llama、Qwen 这类 7B 级,加载时用 4 位量化(bitsandbytes)。
- 训练方式换成 QLoRA:冻结原权重,只训低秩适配器,显存需求能压到单卡可承受范围。
- 保存时只需存适配器权重,几十 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),运行前请对照当前版本的官方文档。
相关文章
本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。