用Python微调DeepSeek R1

微调前的准备工作

在正式开始微调大语言模型之前,我们先来了解一下技术前提条件和设置要求。

Python库和框架

微调大语言模型需要用到以下Python库和框架:

  • unsloth:这个库可太厉害了,它能让像Llama - 3、Mistral、Phi - 4和Gemma 2这些大语言模型的微调速度提高2倍,内存使用减少70%,而且不会降低模型的准确性!
  • torch:它是基于PyTorch进行深度学习的基础构建模块。提供了强大的张量库,和NumPy有些类似,但它有个巨大的优势,就是支持GPU加速,这在处理大语言模型时至关重要。
  • transformers:这是一个功能强大且广受欢迎的自然语言处理(NLP)开源库。它提供了易于使用的接口,让我们可以轻松访问各种最先进的预训练模型。毕竟,预训练模型是任何微调任务的基础,这个库可帮了大忙。
  • trl:Python中的trl包是一个专门用于基于Transformer模型进行强化学习(RL)的库。它建立在Hugging Face transformers库之上,充分利用其优势,让基于Transformer的强化学习变得更易上手、更高效。

计算要求

微调模型是一种让大语言模型的回答更结构化、更具领域针对性的技术,而且不需要对所有参数进行全面训练。不过,对于大多数普通计算机硬件来说,微调大型大语言模型仍然不太现实。因为所有可训练参数以及实际的大语言模型都要存储在GPU的虚拟随机存取存储器(vRAM)中,而大语言模型庞大的规模成了实现这一目标的主要障碍。

所以,在本文中,我们将微调一个相对较小的大语言模型——DeepSeek - R1 - Distill,它有47.4亿个参数。这个模型至少需要8 - 12GB的vRAM

数据准备策略

微调大语言模型需要结构化且特定任务的数据。数据准备策略有很多,比如从社交媒体平台、网站、书籍或研究论文中收集数据。在本文中,我们会使用datasets库来加载Hugging Face Hub上的数据。具体来说,我们会使用Hugging Face上的yahma/alpaca - cleaned数据集

Python实现步骤

安装所需包

使用谷歌Colab进行微调任务有个很大的好处,就是大多数包已经预装好了。我们只需要安装一个包,那就是unsloth。安装包的代码如下:

!pip install unsloth

初始化模型和分词器

我们将使用unsloth包来加载预训练模型,因为它提供了许多有用的技术,能帮助我们更快地下载和微调大语言模型。加载模型和分词器的代码如下:

from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit",
    max_seq_length = 2048,
    dtype = None,
    load_in_4bit = True
)

这里解释一下代码:

  • 我们指定了model_nameunsloth/DeepSeek - R1 - Distill - Llama - 8B - unsloth - bnb - 4bit,这是为了访问预训练的DeepSeek - R1 - Distill模型。
  • max_seq_length定义为2048,这设置了模型可以处理的输入序列的最大长度。合理设置这个值,有助于优化内存使用和处理速度。
  • dtype设置为None,这样能让模型根据可用硬件自动适配数据类型,我们就不用手动去检查和指定数据类型啦,unsloth会帮我们处理好一切。
  • load_in_4bit这个参数可以增强推理能力并减少内存使用,简单来说,就是将模型量化为4位精度。

添加LoRA适配器

我们要给预训练的大语言模型添加LoRA矩阵,这有助于微调模型的回答。使用unsloth,整个过程非常简单,只需要几行代码。具体实现如下:

model = FastLanguageModel.get_peft_model(
    model,
    r = 64,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 32,
    lora_dropout = 0.05, # Can be set to any, but = 0 is optimized
    bias = "none",    # Can be set to any, but = "none" is optimized
    use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
    random_state = 3977,
    use_rslora = False,  # unsloth also supports rank stabilized LoRA
    loftq_config = None # And LoftQ
)

代码解释:

  • 我们使用FastLanguageModelget_peft_model方法重新初始化了模型,以便使用PEFT技术。
  • 这里需要传入之前获取的预训练模型。
  • r = 64这个参数定义了LoRA自适应中低秩矩阵的秩。通常这个秩在8 - 128范围内时能得到较好的效果。
  • lora_dropout = 0.05这个参数在训练LoRA适配器模型时,给低秩矩阵引入了随机失活(dropout)。它可以防止模型过拟合。
  • target_modules指定了我们想要应用LoRA自适应的模型中特定类或模块的名称列表。

数据准备

现在,我们已经在预训练的大语言模型上设置好了LoRA适配器,接下来就可以着手构建用于训练模型的数据了。为了构建数据,我们需要以特定的方式指定提示(prompt),使其包含输入、指令和响应。

  • 指令(Instructions):表示向大语言模型提出的主要问题。
  • 输入(Input):意味着除了指令或问题外,我们还传递了一些数据让模型进行分析。
  • 响应(Response):表示大语言模型的输出。它用于说明大语言模型的响应应该如何根据特定指令(问题)进行调整,无论是否传递了输入(数据)。

提示的结构如下:

alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""

我们创建了一个函数,用于将所有数据按照alpaca_prompt的格式进行正确构建,代码如下:

EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
    instructions = examples["instruction"]
    inputs       = examples["input"]
    outputs      = examples["output"]
    texts = []
    for instruction, input, output in zip(instructions, inputs, outputs):
        text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
        texts.append(text)
    return { "text" : texts, }

现在,我们要加载用于微调模型的数据集,在我们的例子中是yahma/alpaca - cleaned。代码如下:

from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)

训练模型

现在我们既有了结构化的数据,又有了带有LoRA适配器或矩阵的模型,接下来就可以开始训练模型啦。为了训练模型,我们需要初始化一些超参数,这些超参数不仅有助于训练过程,还会在一定程度上影响模型的准确性。

我们将使用SFTTrainer和超参数来初始化一个训练器,代码如下:

from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    dataset_num_proc = 2,
    packing = False,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 120,
        learning_rate = 2e-4,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        report_to = "none",
    )
)

现在,使用这个训练器来启动模型的训练,代码如下:

trainer_stats = trainer.train()

运行这段代码后,模型就会开始训练,并在控制台记录所有步骤以及相应的训练损失。

对微调后的模型进行推理

模型训练完成后,接下来要做的就是对微调后的模型进行推理,评估它的回答。进行推理的代码如下:

FastLanguageModel.for_inference(model)
inputs = tokenizer(
    alpaca_prompt.format(
        "Continue the fibonnaci sequence.",
        "1, 1, 2, 3, 5, 8",
        ""
    ), return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)

代码解释:

  • 我们使用unsloth包中的FastLanguageModel来加载微调后的模型进行推理,这种方法能得到更快的结果。
  • 为了对模型进行推理,我们首先要将查询转换为结构化的提示,然后对提示进行分词。
  • 设置return_tensors = "pt"是为了让分词器返回一个PyTorch张量,然后使用.to("cuda")将这个张量加载到GPU上,以提高处理速度。
  • 接着调用model.generate()来生成查询的响应。
  • 在生成响应时,我们设置max_new_tokens = 64,这指定了模型应该生成的最大新令牌数。
  • use_cache = True也能加快生成速度,特别是对于较长的序列。
  • 最后,我们将微调后模型输出的张量解码为文本。

保存微调后的模型

这一步完成了模型微调的整个过程,现在我们可以保存微调后的模型,以便将来进行推理或使用。我们还需要将分词器和模型一起保存。下面是将微调后的模型保存到Hugging Face Hub的方法:

model.push_to_hub_merged("<YOUR_HF_ID>/<MODEL_NAME>", tokenizer, save_method = "merged_4bit", token = "<YOUR_HF_TOKEN>")
model.push_to_hub_merged("<YOUR_HF_ID>/<MODEL_NAME>", tokenizer, save_method = "merged_16bit", token = "<YOUR_HF_TOKEN>")

这里需要注意:

  • 你需要设置模型的名称,这个名称将用于在Hugging Face Hub上设置模型的ID。
  • 可以选择上传4位精度或16位精度的完整合并模型。合并模型意味着将预训练模型和LoRA矩阵一起上传到Hugging Face Hub,当然也有其他选项,比如只上传LoRA矩阵而不上传模型。

总结

本文主要讨论了以下几个要点:

  • 大语言模型从最通俗的角度来说,就是深度学习架构(如Transformer)的精妙应用,通过大量的语言文本数据进行训练。
  • DeepSeek - R1 - Zero模型通过大规模强化学习(RL)训练,且没有经过监督微调(SFT)作为初步步骤,在推理方面表现出色。
  • 微调大语言模型就是为模型提供特定任务的数据,使其回答更符合特定用途,从而提高准确性,让回答更具针对性和领域专业性。
  • 我们使用的主要Python库和框架有unslothtorchtransformerstrl。此外,还讨论了微调大语言模型的计算要求。
  • 我们构建了用于有效微调模型的数据集,然后使用SFTTrainer对模型进行训练。

DeepSeek无疑是2025开年AI圈的一匹黑马,在一众AI大模型中,DeepSeek以低价高性能的优势脱颖而出。DeepSeek的上线实现了AI界的又一大突破,各大科技巨头都火速出手,争先抢占DeepSeek大模型的流量风口。

DeepSeek的爆火,远不止于此。它是一场属于每个人的科技革命,一次打破界限的机会,一次让普通人也能逆袭契机。

DeepSeek的优点

read-normal-img

掌握DeepSeek对于转行大模型领域的人来说是一个很大的优势,目前懂得大模型技术方面的人才很稀缺,而DeepSeek就是一个突破口。现在越来越多的人才都想往大模型方向转行,对于想要转行创业,提升自我的人来说是一个不可多得的机会。

那么应该如何学习大模型

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。

read-normal-img

掌握大模型技术你还能拥有更多可能性:

• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;

• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;

• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;

• 更优质的项目可以为未来创新创业提供基石。

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

read-normal-img

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

read-normal-img

👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

read-normal-img

read-normal-img

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

read-normal-img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费在这里插入图片描述

### 微调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、付费专栏及课程。

余额充值