本文基于 Hugging Face + PyTorch 的 GPT-2 微调任务,详细讲解训练过程中的 tokenizer 设置、batch 管理、loss 构建与性能调优,并展示完整可运行训练代码,适合模型调试初学者或 AI 工程师参考。
1️⃣ 环境准备与依赖框架
训练环境建议配置 GPU(如 RTX 3050 及以上),使用的核心库如下:
transformers
:Hugging Face 提供的模型训练库datasets
:快速加载公开数据集(如 wikitext)Trainer
:封装好的训练器,免去自写循环
可用 pip 安装:
pip install transformers datasets
2️⃣ 加载模型与分词器(Tokenizer)
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model_name = "gpt2"
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token # ✅ 添加 pad_token 适配 batch
model = GPT2LMHeadModel.from_pretrained(model_name).to("cuda")
GPT-2 默认没有 pad_token,因为其主要用于单句生成。训练时建议手动添加。
3️⃣ 数据预处理流程:Token → Padding → Batch
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
def tokenize_function(examples):
tokens = tokenizer(
examples["text"],
truncation=True,
padding="max_length",
max_length=64 # ✅ 控制单条最大长度
)
tokens["labels"] = tokens["input_ids"].copy()
return tokens
tokenized_datasets = dataset.map(tokenize_function, batched=True)
train_dataset = tokenized_datasets["train"]
eval_dataset = tokenized_datasets["validation"]
max_length=64
:提升速度但牺牲上下文labels=input_ids.copy()
:用于构建训练 loss- 使用 batch 能加速 GPU 计算(batch_size=4 推荐)
4️⃣ 模型优化技巧:节省显存 + 提速训练
✅ 启用 gradient checkpointing:
model.gradient_checkpointing_enable()
该策略将 forward 中间状态不存内存,而是 backward 时重新计算,极大节省显存(适合小显存训练)。
✅ 开启混合精度训练:
fp16 = True # 在 TrainingArguments 中设置
可加速训练 + 减少 GPU 显存使用,推荐开启。
5️⃣ 配置训练参数(TrainingArguments)
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="gpt2_finetune",
evaluation_strategy="epoch",
save_strategy="epoch",
per_device_train_batch_size=4,
per_device_eval_batch_size=2,
fp16=True,
num_train_epochs=1,
remove_unused_columns=False,
deepspeed=None
)
重点说明:
fp16=True
:半精度训练remove_unused_columns=False
:避免字段误删num_train_epochs=1
:可视情况改为 3~5 收敛更稳
6️⃣ 开始训练:Trainer 自动管理
from transformers import Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
trainer.train()
训练过程将每 epoch 自动评估并保存权重文件(包括 model.safetensors
、config.json
、tokenizer_config.json
等)。
7️⃣ 效果评估与调优建议
配置 | 训练速度 | 训练损失 | 评估损失 | 总时长 |
---|---|---|---|---|
默认配置 | 最慢 | 最优 | 最优 | 44:40 |
开启 fp16 | +14% 快 | 几乎不变 | 几乎不变 | |
加大 batch + 降 max_length | +50% 快 | 略升 | 略升 | 21:55 |
- 损失略增可接受,建议结合
learning_rate
与epoch
进一步调节 loss
趋于稳定表示模型已收敛
📦 模型保存与复用
model.save_pretrained("./gpt2_finetune")
tokenizer.save_pretrained("./gpt2_finetune")
保存后的模型可直接用于推理(见第二篇)。
📌 总结
- 本文完整展示 GPT-2 微调流程
- 涉及 tokenizer 设置、batch/padding、优化技巧、完整代码结构
- 提供调参建议 + 训练损失对比,适合入门微调任务
- 对应项目 gpt2-train-deploy-demo 的 transformers1_training_3.py
🧭 本系列 GPT-2 实战三部曲
- 🧩 第一篇:从零开始训练你的 GPT-2:数据、分词、优化与评估全流程
- 🚀 第二篇:构建高效 GPT-2 推理引擎:生成参数调优与模型调用技巧
- 🌐 第三篇:GPT-2 模型部署实战:Flask API 构建与公网服务发布指南
📌 YoanAILab 技术导航页
💡 项目源码 × 实战部署 × 转型经验,一页总览
👉 点击查看完整导航页
📚 包含内容:
- 🧠 GPT-2 项目源码(GitHub)
- ✍️ CSDN 技术专栏合集
- 💼 知乎转型日志
- 📖 公众号 YoanAILab 全文合集