Python微调DeepSeek-R1-Distill-Qwen-1.5B模型:使用Transformers和PyTorch进行训练

前言

近年来,基于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任务,可以根据需要调整模型、数据和训练参数。

    作者:煤炭里de黑猫

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python微调DeepSeek-R1-Distill-Qwen-1.5B模型:使用Transformers和PyTorch进行训练

    发表回复