大模型微调(Fine-Tuning)实战指南:基于 Hugging Face 与 GPT2
以 Hugging Face 的 rotten_tomatoes 数据集和 gpt2 模型为例,演示了从零开始进行大模型微调的完整流程。内容涵盖环境搭建、数据加载与预处理、Tokenizer 配置、训练超参数设置、Trainer 定义及训练执行。此外,补充了模型保存后的推理方法及常见问题优化建议,帮助开发者掌握微调核心步骤,实现特定场景下的模型性能优化。

以 Hugging Face 的 rotten_tomatoes 数据集和 gpt2 模型为例,演示了从零开始进行大模型微调的完整流程。内容涵盖环境搭建、数据加载与预处理、Tokenizer 配置、训练超参数设置、Trainer 定义及训练执行。此外,补充了模型保存后的推理方法及常见问题优化建议,帮助开发者掌握微调核心步骤,实现特定场景下的模型性能优化。

Fine-Tuning,即微调。在原有预训练模型的基础上,通过补充特定领域的数据,对原有模型的部分参数进行调整,从而使模型能在某些特定的场景下表现更优。
微调可以提高模型在特定任务上的表现,但需要注意,过度微调可能会降低模型在通用场景下的能力(灾难性遗忘)。因此,选择合适的学习率和数据量至关重要。
本文将带你从零开始跑通一个完整的微调流程,无需深厚的深度学习背景,只需具备基础的 Python 编程能力即可。
使用 Hugging Face 生态进行模型训练和微调。执行以下代码安装依赖:
# pip 安装
pip install transformers datasets torch accelerate
# conda 安装
conda install -c huggingface transformers
Hugging Face 简介
- 相当于面向 NLP 模型的 GitHub,拥有最丰富的开源模型库
- 封装了模型、数据集、训练器等,极大简化了下载、使用和训练流程
使用 datasets 库中的 load_dataset 函数在线加载数据。本文以 rotten_tomatoes 情感分类数据集为例。
import os
from datasets import load_dataset
DATASET_NAME = "rotten_tomatoes"
# 加载数据集
raw_datasets = load_dataset(DATASET_NAME)
# 保存到本地以便后续复用
save_path = os.path.join("data", DATASET_NAME)
os.makedirs(save_path, exist_ok=True)
raw_datasets.save_to_disk(save_path)
# 划分训练集和验证集
raw_train_dataset = raw_datasets["train"]
raw_valid_dataset = raw_datasets["validation"]
使用 transformers 库中的 AutoModelForCausalLM 自动加载预训练模型。本文选用轻量级的 gpt2 模型,适合在普通笔记本上运行。
from transformers import AutoModelForCausalLM
MODEL_NAME = "gpt2"
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
trust_remote_code=True
)
Tokenizer 负责将文本转换为模型可理解的数字序列。直接使用 AutoTokenizer 加载对应模型的分词器。
from transformers import AutoTokenizer
# 加载 tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
# 设置 pad_token,防止 padding 时出错
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
tokenizer.pad_token_id = 0
使用 map 函数对数据进行预处理,包括分词、截断/填充、标签转换等。
# 标签映射
named_labels = ['neg', 'pos']
label_ids = [
tokenizer(named_labels[i], add_special_tokens=False)["input_ids"][0]
for i in range(len(named_labels))
]
MAX_LEN = 32 # 最大序列长度
DATA_BODY_KEY = "text"
DATA_LABEL_KEY = "label"
def process_fn(examples):
model_inputs = {
"input_ids": [],
"attention_mask": [],
"labels": [],
}
for i in range(len(examples[DATA_BODY_KEY])):
inputs = tokenizer(examples[DATA_BODY_KEY][i], add_special_tokens=False)
label = label_ids[examples[DATA_LABEL_KEY][i]]
# 拼接输入和标签
input_ids = inputs["input_ids"] + [tokenizer.eos_token_id, label]
raw_len = len(input_ids)
input_len = len(inputs["input_ids"]) + 1
if raw_len >= MAX_LEN:
# 截断
input_ids = input_ids[-MAX_LEN:]
attention_mask = [1] * MAX_LEN
labels = [-100] * (MAX_LEN - 1) + [label]
else:
# 填充
input_ids = input_ids + [0] * (MAX_LEN - raw_len)
attention_mask = [1] * raw_len + [tokenizer.pad_token_id] * (MAX_LEN - raw_len)
labels = [-100] * input_len + [label] + [-100] * (MAX_LEN - raw_len)
model_inputs["input_ids"].append(input_ids)
model_inputs["attention_mask"].append(attention_mask)
model_inputs["labels"].append(labels)
return model_inputs
# 应用处理函数
tokenized_train_dataset = raw_train_dataset.map(
process_fn,
batched=True,
remove_columns=raw_train_dataset.column_names,
desc="Running tokenizer on train dataset",
)
tokenized_valid_dataset = raw_valid_dataset.map(
process_fn,
batched=True,
remove_columns=raw_valid_dataset.column_names,
desc="Running tokenizer on validation dataset",
)
训练时,数据规整器(Collator)负责将样本动态拼成 Batch,并处理 Padding。
from transformers import DataCollatorWithPadding
collater = DataCollatorWithPadding(
tokenizer=tokenizer,
return_tensors="pt",
)
合理的超参数是训练成功的关键。
LR = 2e-5 # 学习率
BATCH_SIZE = 8 # Batch 大小
INTERVAL = 100 # 日志与评估步数
training_args = TrainingArguments(
output_dir="./output", # 检查点保存路径
evaluation_strategy="steps", # 每 N 步做一次 eval
overwrite_output_dir=True,
num_train_epochs=1, # 训练轮数
per_device_train_batch_size=BATCH_SIZE,
gradient_accumulation_steps=1, # 梯度累积步数
per_device_eval_batch_size=BATCH_SIZE,
logging_steps=INTERVAL, # 日志频率
save_steps=INTERVAL, # 保存频率
learning_rate=LR,
fp16=True, # 启用混合精度加速(需显卡支持)
)
Hugging Face 的 Trainer API 封装了训练循环,简化了代码结构。
from transformers import Trainer
# 开启梯度检查点以节省显存
model.gradient_checkpointing_enable()
trainer = Trainer(
model=model,
args=training_args,
data_collator=collater,
train_dataset=tokenized_train_dataset,
eval_dataset=tokenized_valid_dataset,
)
调用 train() 方法启动训练过程。
trainer.train()
训练完成后,控制台会显示 Loss 下降曲线及预计耗时。模型权重会自动保存在 output 目录下。
训练完成后,通常需要加载微调后的模型进行推理。
from transformers import TextGenerationPipeline
# 加载微调后的模型
fine_tuned_model = AutoModelForCausalLM.from_pretrained("./output")
pipeline = TextGenerationPipeline(model=fine_tuned_model, tokenizer=tokenizer)
# 生成文本
result = pipeline("The movie was", max_length=50)
print(result)
BATCH_SIZE,或开启 fp16 混合精度训练。num_train_epochs 或增加正则化。通过以上步骤,你可以完成从环境搭建到模型部署的完整微调流程。掌握这一技能,能够让你针对垂直领域快速构建专用 AI 模型。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online