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

### 微调 DeepSeek 1.5B 模型 为了成功微调 DeepSeek 1.5B 模型,可以遵循以下方法参数配置。此过程基于 PyTorch Hugging Face 的 Transformers 库完成。 #### 数据准备 在开始之前,需要准备好用于微调的数据集。这些数据应经过清洗标注以便于模型学习特定的任务(如分类、生成等)。以下是数据加载预处理的关键步骤: ```python from datasets import load_dataset dataset = load_dataset("your_dataset_name") # 替换为实际使用的数据集名称[^1] ``` 接着对数据进行必要的编码操作,使其适配模型输入格式: ```python from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("deepseek/lm-r1-distilled-qwen-1.5b") def preprocess_function(examples): return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512) tokenized_datasets = dataset.map(preprocess_function, batched=True) ``` #### 加载模型与优化器 使用 `AutoModelForCausalLM` 或其他适合任务类型的类来加载基础模型,并定义相应的优化策略。 ```python from transformers import AutoModelForCausalLM, TrainingArguments, Trainer import torch model = AutoModelForCausalLM.from_pretrained("deepseek/lm-r1-distilled-qwen-1.5b") optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5) # 学习率可根据具体需求调整 ``` #### 设置训练参数 通过 `TrainingArguments` 类指定详细的训练超参,例如批量大小、轮数以及保存路径等信息。 ```python training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=8, save_steps=10_000, save_total_limit=2, logging_dir='./logs', learning_rate=5e-5, weight_decay=0.01, evaluation_strategy="epoch" ) ``` #### 开始训练 最后利用 `Trainer` API 将上述组件组合起来执行完整的训练流程。 ```python trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_datasets['train'], eval_dataset=tokenized_datasets['validation'] if 'validation' in tokenized_datasets else None, optimizers=(optimizer, None), ) trainer.train() ``` 当训练完成后,可以通过 `.save_model()` 方法存储已更新的权重文件供后续部署或测试阶段使用--- #### 注意事项 - **硬件资源**:由于该模型规模较大,在本地运行可能需要高性能 GPU 支持;如果计算能力有限,则考虑降低批次尺寸或者采用混合精度技术加速收敛速度。 - **自定义损失函数**:针对某些特殊场景下可尝试设计专属目标函数提升效果表现。 ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值