怎么在GPU资源不够情况下微调Deepseek R1

做模型一定会做微调,简单的改了名称也要微调。

这里借花献佛,参考文章

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 模型,使其在医疗推理任务上的表现得到了显著提升。开源大语言模型的快速发展为各领域带来了新的机遇,微调技术能够使其更好地适应特定任务的需求。未来,我们可以进一步探索模型在其他领域的应用,并优化微调策略以提升模型性能。

希望本文能够为读者提供一个清晰的微调实践指南,激发更多关于开源大语言模型的应用探索。

### 微调DeepSeek R1模型的方法 #### 环境配置 为了成功微调DeepSeek R1模型,首先需确保开发环境已正确设置。这通常涉及到安装必要的依赖库以及配置硬件资源,比如GPU的支持[^1]。 #### 数据准备 收集并整理用于微调的数据集至关重要。这些数据应该紧密围绕目标应用场景,并尽可能覆盖各种可能的情况以提高泛化能力。对于文本类任务而言,可以考虑使用领域内高质量语料作为训练素材;而对于图像识别,则应选取具有代表性的图片样本集合。 #### 模型加载与预处理 利用官方提供的API接口来加载未经修改的基础版DeepSeek R1模型权重文件。之后根据具体需求对输入特征做适当变换——例如裁剪、缩放操作(针对视觉任务),或是分词编码转换(面向自然语言处理)。此过程旨在使原始数据更好地适配网络结构的要求。 #### 参数调整 在实际应用过程中,可以通过调节超参数的方式提升性能表现: - **学习率**:控制梯度下降的速度,在初期可设较大值加速收敛,后期再逐步减小防止过拟合; - **批量大小(batch size)**:影响内存占用量及每轮迭代所需时间,合理设定有助于加快计算效率而不损失精度; - **正则项系数(Regularization term coefficient)**:用来抑制复杂度过高带来的风险,保持模型简洁有效; - **优化器选择(Optimizer selection)**:Adam, SGD等不同算法各有优劣,可根据实际情况灵活选用。 ```python from transformers import Trainer, TrainingArguments training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=8, learning_rate=5e-5, ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, ) ``` #### 针对特定任务的优化方法 除了上述常规手段外,还可以探索更多针对性强的技术路径: - 对于对话系统来说,引入外部知识图谱增强理解力; - 图像分类方面尝试迁移自监督预训练成果; - 文本生成环节采用强化学习机制指导输出更加流畅自然的内容[^3]。 通过以上措施综合施策,能够显著改善DeepSeek R1模型应对专门问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值