
环境准备:
采用AutoDL或者ModelScope进行环境配置。
1.下载模型:

#Model Download
from modelscope import snapshot_download
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B')2.加载模型

# 加载模型并测试
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.制作数据集
# 准备数据集
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.拆分训练集和测试集

# 拆分数据集
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处理数据工具
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.量化设置

# 量化设置
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参数配置

# 配置 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微调的文件
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))