LoRA微调deepseek R1(7B)

deepseek今年很火热,既然开源了,那就来试试微调吧。
用一个医学数据集微调推理模型R1系列。
后面会涉及数据集的准备,模型加载,LoRA加载,微调训练和推理过程。

在这里插入图片描述

可以看到它有不同的尺寸,模型的硬件需求取决于它们的大小(参数量)以及加载方式(FP16、INT8、INT4等)。
GPU需求如下:

在这里插入图片描述

我们这里用3090微调一个7B的R1模型。

微调(Fine-Tuning)是对已经训练好的大模型进行特定任务的优化,以提高其在特定数据上的表现。
那么微调有哪些方法呢?

  1. 全参数微调(Full Fine-Tuning)
    最标准的微调方式:对模型的 所有参数 进行训练
    适用于:计算资源充足,任务与原始训练数据差异较大(如医学、法律)
    缺点:
    计算成本高(7B 需要 100GB+ GPU 内存)
    训练数据量需要足够大(否则容易过拟合)
    适用于少量任务,不能灵活切换任务

  2. LoRA(Low-Rank Adaptation)
    只在模型的 部分权重(如 QKV 矩阵) 上 添加可训练参数
    通过 低秩矩阵(A×B) 来优化参数更新
    优点:
    极大降低显存消耗(7B 只需 10GB)
    适用于多任务 LoRA 适配器切换
    训练速度快

  3. QLoRA(Quantized LoRA)
    LoRA + INT4 量化,让 LoRA 微调时占用更少显存
    允许 在 INT4 量化模型上训练 LoRA
    比普通 LoRA 省 50% 显存
    7B 只需 6GB 显存即可微调

另外还有Prefix Tuning(前缀微调),Adapter Tuning(适配器微调),BitFit(偏置微调),Adapter Fusion(适配器融合)。3090的话推荐LoRA或QLoRA。

Lora原理参考这里

数据集格式转换

使用医学数据集:medical-o1-reasoning-SFT
它长这个样子,有英文和中文两个子集,我们这里用中文(zh)的。

在这里插入图片描述

这里可以看到数据集有3列,“Question”,“Complex_CoT”, “Response”,
其中Question是对话时的问题,CoT是思维链,是思考过程的描述,Response是最后的回答。
不过大模型需要的数据格式是这样的,需要把上面的数据转为下面这样的格式:

train_prompt_style = """
以下是一个任务说明,配有提供更多背景信息的输入。
请写出一个恰当的回答来完成该任务。
在回答之前,请仔细思考问题,并按步骤进行推理,确保回答逻辑清晰且准确。

### Instruction:
你是一位具有高级临床推理,诊断和治疗规划知识的医学专家。
请回答以下医学问题。

### Question:
{}

### Response:
<think>
{}
</think>
{}
"""

def formatting_prompts_func(examples):
    inputs = examples["Question"]
    cots = examples["Complex_CoT"]
    outputs = examples["Response"]
    texts = []
    for input, cot, output in zip(inputs, cots, outputs):
        text = train_prompt_style.format(input, cot, output) + EOS_TOKEN
        texts.append(text)
    return {
   
   
        "text" : texts,
    }
    
dataset = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "zh", split="train")
dataset = dataset.map(formatting_prompts_func, batched=True)

我们来说明一下这段代码做了什么,
如果把数据集的3列写成提示词的形式,是这样的

### Question:
什么是心房颤动?

### Complex CoT:
心房颤动是一种常见的心律失常,可导致血栓形成和中风风险增加。

### Response:
心房颤动(Atrial fibrillation,AF)是一种快速、无规律的心跳状态,通常需要抗凝治疗。
<eos>

那现在大模型不需要Complex CoT,而是用Response里的 < think > < /think >代替,所以把Complex CoT的内容移到think里面, think结束后直接接上Response的内容。把Question对应的内容放到#Question下面,这就是train_prompt_style.format(input, cot, output)做的事情。
这是训练过程,< think >里面和“ ### Response”后面是有数据的,推理时只给到开头的< think >, 后面的部分让模型预测输出。
注:不要以为模型回答就是往Response里面填答案,不是填答案的。模型的预训练是根据前文预测下一个token, 那么这里也是一样,根据前文(到Response为止)预测后面的token。

其他数据部分的细节问题:
在每行数据的结尾加上一个EOS,为什么一定要加EOS?
如果 不加 EOS_TOKEN,训练时可能会把多个样本拼接成一个 连续文本,导致模型在推理时无法区分不同对话:
模型可能无法区分 一个问题的结束和下一个问题的开始,导致 输出混乱。

### Question:
什么是心房颤动?
### Response:
心房颤动是一种快速无规律的心跳状态,通常需要
### 微调 DeepSeek R1 7B 模型 对于希望优化特定应用场景下的模型性能而言,微调是一个非常有效的方法。针对 DeepSeek R1 7B 模型微调可以通过LoRA技术实现[^2]。 #### 准备工作 为了能够顺利地对 DeepSeek R1 7B 模型进行微调,首先需要设置好合适的开发环境。这通常涉及到安装必要的依赖库以及配置硬件资源来支持训练过程。确保环境中已经正确设置了 Python 和 PyTorch 环境,并且 GPU 资源可用以便加速计算效率。 #### 数据准备 在开始微调之前,准备好用于调整的数据集至关重要。理想情况下,这些数据应该尽可能贴近实际应用情境,从而使得经过微调后的模型能更好地适应目标场景。这里提到的是函数调用数据集作为例子,在实践中可以根据具体的业务需求收集或构建适合的数据集合。 #### 使用 LoRA 技术实施微调 LoRA (Low-Rank Adaptation) 是一种高效的迁移学习方法,它允许只更新少量参数即可完成新任务的学习而不影响原有能力。具体到 DeepSeek R1 7B 上的应用: - 加载预训练好的 DeepSeek R1 7B 模型; - 应用 LoRA 方法初始化适配层; - 将上述两步得到的结果组合成一个新的可训练模块; - 利用准备好的数据集对该模块执行常规意义上的监督式训练流程; ```python from peft import LoraConfig, get_peft_model import torch from transformers import AutoModelForCausalLM, TrainingArguments, Trainer model_name_or_path = "deepseek-r1:7b" tokenizer_name = model_name_or_path device = "cuda" if torch.cuda.is_available() else "cpu" # Load the pre-trained model and tokenizer. model = AutoModelForCausalLM.from_pretrained(model_name_or_path).to(device) tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) # Define LoRA configuration. lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", ) # Apply LoRA to the loaded model. peft_model = get_peft_model(model, lora_config) # Prepare training arguments. training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=2, learning_rate=2e-5, logging_dir='./logs', ) # Initialize trainer with prepared data set. trainer = Trainer( model=peft_model, args=training_args, train_dataset=train_dataset, eval_dataset=test_dataset, ) # Start fine-tuning process. trainer.train() ``` 这段代码展示了如何加载预先在的 DeepSeek R1 7B 模型并通过 LoRA 配置对其进行修改以适应新的训练任务。之后定义了一些基本的训练参数并将它们传递给 `Trainer` 类实例来进行最终的微调操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值