在自然语言处理(NLP)领域,预训练语言模型已经成为构建各种对话系统的基石。本文将介绍如何使用Hugging Face Transformers库对DeepSeek-R1-Distill-Qwen-1.5B模型进行微调,使其适应特定的对话任务。
环境准备
首先确保已安装必要的Python库:
pip install torch transformers datasets
模型训练完整代码:
import json
import torch
from transformers import AutoModelForCausalLM, Trainer, TrainingArguments, AutoTokenizer
from datasets import Dataset as HFDataset # 从 datasets 库导入 Dataset 类
# 定义模型路径(应指向包含所有必要文件的目录)
model_path = r"D:\Chatbot4K80\models\DeepSeek-R1-Distill-Qwen-1.5B"
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 定义自定义数据集类
class ConversationDataset(torch.utils.data.Dataset):
def __init__(self, data, tokenizer, max_length=512):
self.tokenizer = tokenizer
self.examples = []
for item in data:
input_text = f"{item['title']} {item['content']}"
output_text = "" # 如果没有明确的输出文本,则留空
# 将输入和输出拼接在一起
full_text = f"{input_text} {output_text}"
# 对文本进行编码
encoding = tokenizer(full_text, return_tensors="pt", max_length=max_length, truncation=True, padding="max_length")
# 创建模型输入字典
example = {
'input_ids': encoding['input_ids'].squeeze(),
'attention_mask': encoding['attention_mask'].squeeze(),
'labels': encoding['input_ids'].squeeze().clone() # 使用相同的输入作为标签
}
# 将 labels 中的 pad token 替换为 -100,这样在计算损失时会被忽略
example['labels'][example['labels'] == tokenizer.pad_token_id] = -100
self.examples.append(example)
def __len__(self):
return len(self.examples)
def __getitem__(self, idx):
return self.examples[idx]
# 加载 JSON Lines 文件
def load_jsonl(file_path):
with open(file_path, "r", encoding="utf-8") as f:
data = [json.loads(line) for line in f]
return data
# 加载数据
data = load_jsonl("此处为你的数据文件名.jsonl") # 请替换为实际的数据文件路径
# 将数据转换为自定义数据集对象
conversation_dataset = ConversationDataset(data, tokenizer)
# 将转换后的数据转换为 Hugging Face 的 Dataset 对象
hf_dataset = HFDataset.from_list(conversation_dataset.examples)
# 加载预训练模型
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float32, trust_remote_code=True)
# 冻结所有参数(只训练输出层)
for param in model.parameters():
param.requires_grad = False
for param in model.lm_head.parameters():
param.requires_grad = True
# 定义训练参数
training_args = TrainingArguments(
output_dir="./conversation_model",
num_train_epochs=5,
per_device_train_batch_size=4,
save_steps=500,
save_total_limit=2,
logging_dir="./logs",
logging_steps=100,
fp16=False,
)
# 初始化 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=hf_dataset,
)
# 开始训练
trainer.train()
print("训练完成!")
数据集下载:深蓝探索-人工智能LLM大模型