前言

近年来,基于Transformer架构的预训练语言模型如GPT、BERT等已经取得了显著的成果,广泛应用于自然语言处理(NLP)的各个领域。为了让这些模型更加适应特定任务,我们通常会进行微调(Fine-tuning)。本博客将详细介绍如何微调一个名为Qwen-1.5B的模型,使用Hugging Face的Transformers库与PyTorch框架来实现。我们将通过一步步的代码解析,帮助你理解如何加载预训练模型、准备数据集、设置训练参数,并进行微调。

详细解读

1. 加载预训练模型和Tokenizer

from transformers import AutoTokenizer, AutoModelForCausalLM

# 加载tokenizer和模型
tokenizer = AutoTokenizer.from_pretrained("DeepSeek-R1-Distill-Qwen-1.5B") # 模型文件路径
model = AutoModelForCausalLM.from_pretrained("DeepSeek-R1-Distill-Qwen-1.5B") # 模型文件路径

首先,我们从本地路径加载了Qwen-1.5B的预训练模型和对应的Tokenizer。

Tokenizer负责将文本数据转换为模型可以理解的数字形式。

AutoTokenizerAutoModelForCausalLM是Transformers库提供的类,分别用于加载Tokenizers和Causal Language Modeling(自回归语言模型)预训练模型。

2. 加载和处理数据集

from datasets import Dataset

# 从txt文件加载数据
def load_txt_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    return {'text': [line.strip() for line in lines]}

# 加载数据集(.txt)
dataset = load_txt_data("model.txt")  # 替换为你的txt文件路径
dataset = Dataset.from_dict(dataset)

此部分代码从指定路径加载文本数据集。

数据集每行文本被视为一个训练样本,并通过Dataset.from_dict转换为Hugging Face datasets库的格式。

此格式支持高效的数据处理和批量化操作。

3. 数据预处理:Tokenize

# 对数据集进行tokenize
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

encoded_dataset = dataset.map(tokenize_function, batched=True)

在这一步,我们对加载的数据进行tokenize,即将文本转化为模型可以理解的Token格式。

通过map函数将tokenize_function应用到数据集中的每个文本实例,batched=True表示每次处理多个文本实例以提高效率。

设置padding="max_length"保证所有序列填充至最大长度,truncation=True则会截断超过最大长度的序列。

4. 设置训练参数

from transformers import TrainingArguments

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",         # 输出目录
    evaluation_strategy="epoch",    # 每一轮训练后进行评估
    learning_rate=2e-5,             # 学习率
    per_device_train_batch_size=8,  # 每个设备上的批量大小
    per_device_eval_batch_size=8,   # 每个设备上的评估批量大小
    num_train_epochs=30,            # 训练轮数
    weight_decay=0.01,              # 权重衰减
    logging_dir='日志目录输出路径',      # 替换你的日志路径
    logging_steps=10,
)

TrainingArguments中,我们指定了多个重要的训练参数,例如:

  • output_dir:训练结果的输出目录。
  • evaluation_strategy:每个epoch结束后进行评估。
  • learning_rate:学习率。
  • per_device_train_batch_size:每个设备的训练批量大小。
  • logging_dir:保存日志的目录。

这些参数将影响训练过程的效率和模型的最终性能。

5. 创建并训练模型

from transformers import Trainer

# 创建Trainer
trainer = Trainer(
    model=model,                     # 预训练模型
    args=training_args,              # 训练参数
    train_dataset=encoded_dataset,   # 训练数据集
    eval_dataset=encoded_dataset,    # 测试数据集
)

# 微调模型
trainer.train()

Trainer是Hugging Face提供的一个高层API,简化了训练流程。在创建Trainer实例时,我们将模型、训练参数、数据集等传入。然后调用trainer.train()启动微调过程。

6. 保存模型和Tokenizer

# 保存微调后的模型
model.save_pretrained("微调后模型保存路径")  
tokenizer.save_pretrained("保存tokenizer路径")  

微调完成后,我们将模型和Tokenizer保存到指定路径,以便之后加载和使用。

整体代码

from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments
from datasets import Dataset
import torch

# 加载tokenizer和模型
tokenizer = AutoTokenizer.from_pretrained("DeepSeek-R1-Distill-Qwen-1.5B")
model = AutoModelForCausalLM.from_pretrained("DeepSeek-R1-Distill-Qwen-1.5B")

# 从txt文件加载数据
def load_txt_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    return {'text': [line.strip() for line in lines]}

# 加载数据集(.txt)
dataset = load_txt_data("model.txt")  # 替换为你的txt文件路径
dataset = Dataset.from_dict(dataset)

# 对数据集进行tokenize
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

encoded_dataset = dataset.map(tokenize_function, batched=True)

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",         # 输出目录
    evaluation_strategy="epoch",    # 每一轮训练后进行评估
    learning_rate=2e-5,             # 学习率
    per_device_train_batch_size=8,  # 每个设备上的批量大小
    per_device_eval_batch_size=8,   # 每个设备上的评估批量大小
    num_train_epochs=30,             # 训练轮数
    weight_decay=0.01,              # 权重衰减
    logging_dir='logs',           # 日志目录
    logging_steps=10,
)

# 创建Trainer
trainer = Trainer(
    model=model,                     # 预训练模型
    args=training_args,              # 训练参数
    train_dataset=encoded_dataset,   # 训练数据集
    eval_dataset=encoded_dataset,    # 测试数据集
)

# 微调模型
trainer.train()

# 保存微调后的模型
model.save_pretrained("微调后模型保存路径")
tokenizer.save_pretrained("保存tokenizer路径")

总结

本教程通过一步一步的代码讲解,展示了如何使用Transformers和PyTorch对Qwen-1.5B模型进行微调。我们涵盖了从数据加载、预处理、模型训练到保存微调结果的整个流程。希望通过这篇博客,能够帮助你理解并实现类似的微调任务。对于不同的NLP任务,可以根据需要调整模型、数据和训练参数。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐