首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SLM模型微调LoRA+DeepSeek-R1 1.5B

SLM模型微调LoRA+DeepSeek-R1 1.5B

作者头像
jeffery_jcm
发布2026-07-10 21:51:42
发布2026-07-10 21:51:42
1500
举报

环境准备:

采用AutoDL或者ModelScope进行环境配置。

1.下载模型:

代码语言:javascript
复制
#Model Download
from modelscope import snapshot_download
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B')

2.加载模型

代码语言:javascript
复制
# 加载模型并测试
from transformers import AutoTokenizer, AutoModelForCausalLM
# 指定模型路径,这里是一个本地已经下戴好的 DeepSeek-RI 模型的路径
model_name="/mnt/workspace/.cache/modelscope/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")
print("模型加载成功!")

3.制作数据集

代码语言:javascript
复制
# 准备数据集
import json
# 假设这是你的 100 条样本数据
samples = [
    {
        "prompt": "Question 1: xxxxx?",
        "completion": "Answer 1: xxxxxx"
    },
    {......}
 ]

#每个 sample 应为 dict 类型,例如('text”:'xxx) 或 (input: Output......2
#写入jsonl文件
with open ("dataset.jsonl", "w", encoding="utf-8") as f:
    for sample in samples:
        f.write(json.dumps(sample, ensure_ascii=False) + "\n")
print("数据集制作完成!")

4.拆分训练集和测试集

代码语言:javascript
复制
# 拆分数据集
from datasets import load_dataset
 # 加载本地数据
dataset = load_dataset ("json", data_files={"train": "dataset.jsonl"}, split="train")
print("数据总数量:!",len(dataset))
# 划分训练集和测试集(90%训练,10%测试)
train_test_split = dataset.train_test_split(test_size=0.1)
# 提取训练集和验证柴
train_dataset = train_test_split["train"]
eval_dataset = train_test_split["test"]
print(f"train dataset len: {len(train_dataset)}")
print(f"test dataset len : {len (eval_dataset)}")
print("训练数据的准备工作完成")

5.编写Tokenizer处理数据工具

代码语言:javascript
复制
def tokenizer_function (many_samples) :
# 将 prompt 和 completion 拼接后进行分词处理
    # 将每条样本的 prompt 和 compLetion 拼接成一个文本
    texts = [f"{prompt} \n {completion}" for prompt, completion in zip (many_samples["prompt"], many_samples["completion"])]
    # 使用 tokenizer 进行分词,截断长廈为 512,填充至最大长度
    tokens = tokenizer(
        texts,
        truncation=True,
        max_length=512,
        padding="max_length"
    )
    # 设置 Labels 为 input_ids 的副本(用于因果语言建模任务)
    tokens["labels"] = tokens["input_ids"].copy()
    return tokens
# 对训练集和验证集应用 tokenizer处理
tokenized_train_dataset = train_dataset.map(tokenizer_function, batched=True)
tokenized_eval_dataset = eval_dataset.map(tokenizer_function, batched=True)
print(tokenized_train_dataset[0])
print("分词完成")

6.量化设置

代码语言:javascript
复制
# 量化设置
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
# 配置 8bit 量化
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
# 重新加载量化后的模型
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=quantization_config,
    device_map="auto"
)
print("量化模型加载完成!")

7.LoRA参数配置

代码语言:javascript
复制
# 配置 LORA 参数
from peft import get_peft_model, LoraConfig, TaskType
lora_config = LoraConfig(
    r=8,
    # LORA 秩(rank),控制适配器大小,通常设为8~32
    lora_alpha=16,
    # 控制 LORA 更新的缩放因子,一般为r的倍数
    lora_dropout=0.05,
    # Dropout 概率,防止过拟合
    task_type=TaskType.CAUSAL_LM # 任务类型:因果语言模型
)
# 获取 PEFT 模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
print("LoRA 设置完成") 

8.开始训练模型

显示训练结果:

标红的两个文件加载到原来的DeepSeek-R1上即可。

9.加载原来的大模型+挂载LoRA微调的文件

代码语言:javascript
复制
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
# 原始DeepSeek-R1本地路径(你之前的模型路径)
base_model_path = "/mnt/workspace/.cache/modelscope/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
# LoRA微调保存文件夹路径
lora_path = "/xxx/your_lora_save_dir"
# 加载底座模型
tokenizer = AutoTokenizer.from_pretrained(
    base_model_path,
    local_files_only=True,
    trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
    base_model_path,
    torch_dtype=torch.float16,
    device_map="auto",
    local_files_only=True,
    trust_remote_code=True
)
# 挂载微调后的LoRA权重
model = PeftModel.from_pretrained(model, lora_path)
model.eval()
# 测试推理(适配你声乐问答数据集)
prompt = "Question 1: What is the best way to warm up before a performance?"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=80, temperature=0.7)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档