使用Hugging Face Transformers微调DeepSeek-R1对话模型

在自然语言处理(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大模型

<think>好的,用户想要使用unsloth来微调deepseek-r1-8B模型,并希望得到完整的代码。首先,我需要确认unsloth是否支持这个模型。unsloth主要用于优化微调过程,比如减少内存占用和加快训练速度,通常与Hugging Facetransformers库结合使用deepseek-r1-8B可能是一个基于类似LLaMA架构的模型,所以可能需要检查是否支持。 接下来,用户可能需要代码示例,包括数据准备、模型加载、训练配置、训练过程和保存模型。需要确保步骤完整,例如安装必要的库,加载数据集,使用正确的模型名称,设置训练参数如batch size、learning rate等,以及处理可能的内存问题,比如使用4位量化。 另外,用户可能对数据格式有疑问,所以需要提供一个示例数据集的结构,比如alpaca格式。还要注意可能出现的错误,比如OOM(内存不足),这时候可能需要调整batch size或者使用梯度累积。 需要提醒用户替换数据集路径,并根据硬件调整参数,比如device_map和dtype设置。最后,保存模型并演示如何加载使用,确保代码的可运行性。 可能还需要验证代码的准确性,比如检查unsloth的最新文档,确认支持的模型类型,以及是否有额外的参数需要注意。同时,确保训练器的设置正确,比如使用Seq2SeqTrainer,因为可能是生成任务。 总结:步骤包括安装库、准备数据、加载模型和分词器、配置训练参数、训练、保存模型。需要注意模型兼容性、硬件限制和参数调整,确保用户能顺利运行代码。</think>以下是一个使用Unsloth微调DeepSeek-R1-8B模型的完整代码示例。请注意根据您的硬件调整参数(如batch_size、gradient_accumulation_steps等): ```python # 首先安装必要库(建议使用Python 3.10+) # pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git" # pip install --no-deps "xformers<0.26.0" trl peft accelerate datasets bitsandbytes import torch from unsloth import FastLanguageModel from datasets import load_dataset from trl import SFTTrainer from transformers import TrainingArguments # 参数配置 max_seq_length = 2048 # 根据GPU内存调整 dtype = None # None自动检测,或指定为torch.float16/torch.bfloat16 load_in_4bit = True # 使用4位量化节省内存 # 加载DeepSeek-R1-8B模型 model, tokenizer = FastLanguageModel.from_pretrained( model_name = "deepseek-ai/deepseek-llm-7b-r1", # 确认HuggingFace模型名称 max_seq_length = max_seq_length, dtype = dtype, load_in_4bit = load_in_4bit, ) # 添加LoRA适配器(可选) model = FastLanguageModel.get_peft_model( model, r=16, # LoRA秩 target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj"], # 常见目标模块 lora_alpha=16, lora_dropout=0, bias="none", use_gradient_checkpointing=True, ) # 准备数据集(示例使用Alpaca格式) dataset = load_dataset("yahma/alpaca-cleaned", split="train") dataset = dataset.map(lambda sample: { "text": f"""Below is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {sample['instruction']} ### Input: {sample['input']} ### Response: {sample['output']}""" }) # 训练参数配置 trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = max_seq_length, dataset_num_proc = 2, packing = True, # 序列打包提高效率 args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, num_train_epochs = 3, learning_rate = 2e-5, fp16 = not torch.cuda.is_bf16_supported(), bf16 = torch.cuda.is_bf16_supported(), logging_steps = 1, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", seed = 3407, output_dir = "outputs", save_strategy="steps", save_steps=500, ), ) # 执行训练 trainer.train() # 保存微调后的模型 model.save_pretrained("lora_adapter") # 保存LoRA适配器 # model.push_to_hub("your_username/model_name") # 可选:上传到HuggingFace Hub # 使用微调后的模型生成文本 inputs = tokenizer( ["### Instruction:\nExplain deep learning in 3 sentences\n\n### Response:"], return_tensors="pt" ).to("cuda") outputs = model.generate(**inputs, max_new_tokens=128) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` 注意事项: 1. 硬件要求:至少需要24GB显存(建议A100/A6000等) 2. 数据集:示例使用Alpaca格式,请替换为您的实际数据集 3. 模型名称:请确认HuggingFace上的准确模型名称 4. 内存优化:如遇OOM错误,可以尝试: - 降低`per_device_train_batch_size` - 增加`gradient_accumulation_steps` - 使用`load_in_4bit=True` - 减小`max_seq_length` 建议在微调前: 1. 检查CUDA可用性:`print(torch.cuda.is_available())` 2. 验证模型加载:`print(model)` 3. 测试基本推理:先运行生成代码确保基础模型正常工作 如需完整生产级实现,建议参考: - Unsloth官方文档:https://github.com/unslothai/unsloth - DeepSeek官方微调指南:https://huggingface.co/deepseek-ai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值