做模型一定会做微调,简单的改了名称也要微调。
这里借花献佛,参考文章
https://www.datacamp.com/tutorial/fine-tuning-deepseek-r1-reasoning-model微调符合国内使用的模型
这里用DeepSeek R1 7B:(qwen) 以及基于 用ModelScope 下载模型与数据集,也有用同样的数据集做微调
一、DeepSeek R1 模型简介
DeepSeek R1 是 DeepSeek AI 开发的第一代推理模型,它通过大规模强化学习(RL)而非传统的监督微调(SFT)进行训练,能够独立探索链式推理(Chain-of-Thought,CoT)
1.安装依赖
我们用`unsloth`做微调,一个开源框架,能够显著提升大语言模型微调的速度和内存效率。我们可以通过以下命令安装`unsloth`:
pip install unsloth
pip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git
加载模型与数据集
1.加载模型
我们将加载 DeepSeek R1 7B 模型,并使用 4 位量化以优化内存使用和性能:
from unsloth import FastLanguageModel
max_seq_length = 2048
load_in_4bit = True
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="./DeepSeek-R1-7B",
max_seq_length=max_seq_length,
load_in_4bit=load_in_4bit
)
2.加载数据集(符合国情)
从 ModelScope 上加载医疗推理数据集,并对其进行预处理:
from modelscope.datasets import load_dataset
dataset = load_dataset("./medical-reasoning-dataset", split="train")
五、微调过程
1.定义提示模板
为了引导模型生成高质量的推理内容,我们需要定义一个提示模板。该模板包括问题、推理过程和答案的占位符:
prompt_template = """以下是一个描述任务的指令,以及提供进一步上下文的输入。
请生成一个合适的回答。
在回答之前,请仔细思考问题,并创建一个逐步的推理过程以确保回答的逻辑性和准确性。
### sys:
你是一位具有高级临床推理、诊断和治疗计划知识的医学专家。
请回答以下医学问题。
### 问题:
{}
### 回答:
<think>
{}
</think>
{}"""
2.数据预处理
将数据集中的问题、推理过程和答案组合成文本格式:
def format_prompts(examples):
inputs = examples["question"]
cots = examples["cot"]
outputs = examples["answer"]
texts = []
for input, cot, output in zip(inputs, cots, outputs):
text = prompt_template.format(input, cot, output) + tokenizer.eos_token
texts.append(text)
return {"text": texts}
dataset = dataset.map(format_prompts, batched=True)
3.模型微调
使用`unsloth`的`SFTTrainer`进行微调:
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=max_seq_length,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
max_steps=60,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
output_dir="outputs",
),
)
trainer.train()
六、微调后模型的推理与评估
微调完成后,我们可以使用相同的测试问题评估模型的推理能力:
question = "一位 61 岁的女性在咳嗽或打喷嚏时出现尿失禁,但夜间无漏尿现象。根据这些症状,膀胱造影术最可能显示什么结果?"
inputs = tokenizer([prompt_template.format(question, "")], return_tensors="pt").to("cuda")
outputs = model.generate(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=1200,
use_cache=True,
)
response = tokenizer.batch_decode(outputs)
print(response[0].split("### 回答:")[1])
微调后的模型推理结果更加简洁、准确,推理过程也更加符合医疗领域的逻辑。
七、模型保存与分享
微调完成后,我们可以将模型保存到本地,并推送到 ModelScope 上,以便后续使用:
model.save_pretrained("DeepSeek-R1-Medical-COT")
tokenizer.save_pretrained("DeepSeek-R1-Medical-COT")
model.push_to_hub("modelscope/DeepSeek-R1-Medical-COT")
tokenizer.push_to_hub("modelscope/DeepSeek-R1-Medical-COT")
八、总结
这是由AI协同生成的帮助,如有问题可以通过DeepSeek 继续咨询
这里我们成功地在 ModelScope 上微调了 DeepSeek R1 7B 模型,使其在医疗推理任务上的表现得到了显著提升。开源大语言模型的快速发展为各领域带来了新的机遇,微调技术能够使其更好地适应特定任务的需求。未来,我们可以进一步探索模型在其他领域的应用,并优化微调策略以提升模型性能。
希望本文能够为读者提供一个清晰的微调实践指南,激发更多关于开源大语言模型的应用探索。