Type something to search...
揭开 Deepseek-r1 的神秘面纱:与 Lora 一起学习蒸馏的革命性指南!

揭开 Deepseek-r1 的神秘面纱:与 Lora 一起学习蒸馏的革命性指南!

Image courtesy: https://fusionchat.ai/news/enhancing-llm-reasoning-with-system-2-distillation-technique

深度学习模型已经彻底改变了人工智能领域,但它们的庞大规模和计算需求可能成为现实应用的瓶颈。模型蒸馏是一种强大的技术,通过将知识从一个大型复杂模型(教师)转移到一个更小、更高效的模型(学生)来解决这个挑战。

在这篇博客中,我们将探讨如何将DeepSeek-R1的推理能力蒸馏到像微软的Phi-3-Mini这样的小型模型中,使用像LoRA(低秩适应)这样的专门技术。

什么是蒸馏?

蒸馏是一种机器学习技术,其中一个较小的模型(“学生”)被训练以模仿一个较大、预训练模型(“老师”)的行为。其目标是在显著降低计算成本和内存占用的同时,保留老师的大部分性能。

这个想法最早是在Geoffrey Hinton关于知识蒸馏的开创性论文中提出的。学生模型不是直接在原始数据上训练,而是从老师模型的输出或中间表示中学习。这实际上是受到人类教育的启发。

为什么这很重要

  • 成本效率:较小的模型需要更少的计算资源。
  • 速度:非常适合对延迟敏感的应用(例如,API、边缘设备)。
  • 专业化:在不重新训练大型模型的情况下,针对特定领域定制模型。

蒸馏的类型

有几种模型蒸馏的方法,每种方法都有其优点:

1. 数据蒸馏

  • 在数据蒸馏中,教师模型生成合成数据或伪标签,然后用于训练学生模型。
  • 这种方法可以应用于广泛的任务,即使是在logits信息较少的任务中(例如,开放式推理任务)。

2. logits蒸馏

  • logits是神经网络在应用softmax函数之前的原始输出分数。
  • 在logits蒸馏中,学生模型的训练目标是匹配教师的logits,而不仅仅是最终的预测。
  • 这种方法保留了更多关于教师的信心水平和决策过程的信息。

3. 特征蒸馏

  • 特征蒸馏涉及将知识从教师模型的中间层转移到学生模型。
  • 通过对齐两个模型的隐藏表示,学生可以学习到更丰富和更抽象的特征。

Deepseek的蒸馏模型

为了实现普及访问,DeepSeek AI 发布了六个基于流行架构的蒸馏变体,如 Qwen(Qwen, 2024b)和 Llama(AI@Meta, 2024)。它们直接使用与 DeepSeek-R1 一起策划的 800k 样本对开源模型进行了微调。

尽管比 DeepSeek-R1 小得多,蒸馏模型在各种基准测试中表现出色,通常与更大模型的能力相匹配甚至超越。如您在下面的图表中所见:

Image 10

Deepseek 蒸馏模型基准测试 (https://arxiv.org/html/2501.12948v1)

为什么要蒸馏自己的模型?

1. 任务特定优化

预蒸馏模型是在广泛的数据集上训练的,以便在各种任务中表现良好。然而,现实世界的应用往往需要专业化

示例场景:

您正在构建一个金融预测聊天机器人。在这种情况下,使用 DeepSeek-R1 生成金融数据集(例如,股票价格预测、风险分析)的推理轨迹,并将这些知识蒸馏成一个已经了解金融细微差别的较小模型(例如,finance-LLM)。

2. 大规模成本效率

虽然预蒸馏模型是高效的,但对于您的特定工作负载,它们可能仍然是过度的。蒸馏自己的模型可以让您针对您的确切资源限制进行优化

3. 基准性能 ≠ 现实世界性能

预蒸馏模型在基准测试中表现出色,但基准测试往往不能代表现实世界的任务。因此,您通常需要一个在现实世界场景中表现优于任何预蒸馏模型的模型。

4. 迭代改进

预蒸馏模型是静态的——它们不会随时间而改善。通过蒸馏自己的模型,您可以随着新数据的出现不断进行改进

代码教程:将 DeepSeek-R1 知识蒸馏到自定义更小模型

步骤 1:安装库

pip install -q torch transformers datasets accelerate bitsandbytes flash-attn --no-build-isolation

第2步:生成和格式化数据集

您可以通过在您的环境中使用Ollama或任何其他部署框架部署DeepSeek-R1来生成自定义领域相关的数据集。在本教程中,我们将使用Magpie-Reasoning-V2数据集,该数据集包含250K思维链(CoT)推理样本,由DeepSeek-R1生成。这些样本涵盖了数学推理、编码和一般问题解决等多种任务。

数据集结构

每个样本包括:

  • 指令:任务描述(例如,“解决这个数学问题”)。
  • 响应:DeepSeek-R1的逐步推理(CoT)。

示例:

{
  "instruction": "Solve for x: 2x + 5 = 15",
  "response": "<think>First, subtract 5 from both sides: 2x = 10. Then, divide by 2: x = 5.</think>"
}
from datasets import load_dataset

dataset = load_dataset("Magpie-Align/Magpie-Reasoning-V2-250K-CoT-Deepseek-R1-Llama-70B", token="YOUR_HF_TOKEN")
dataset = dataset["train"]

def format_instruction(example):
    return {
        "text": (
            "<|user|>\\n"
            f"{example['instruction']}\\n"
            "<|end|>\\n"
            "<|assistant|>\\n"
            f"{example['response']}\\n"
            "<|end|>"
        )
    }

formatted_dataset = dataset.map(format_instruction, batched=False, remove_columns=subset_dataset.column_names)
formatted_dataset = formatted_dataset.train_test_split(test_size=0.1)

将数据集结构化为Phi-3的聊天模板格式:

  • <|user|>:标记用户查询的开始。
  • <|assistant|>:标记模型响应的开始。
  • <|end|>:标记一个回合的结束。

每个LLM使用特定格式进行指令跟随任务。将数据集与此结构对齐可以确保模型学习正确的对话模式。因此,请确保根据您想要蒸馏的模型格式化数据。

第三步:加载模型和分词器

向分词器添加特殊标记 <think></think>

为了增强模型的推理能力,我们引入了这些标记。

  • <think>:标记推理的开始。
  • </think>:标记推理的结束。

这些标记帮助模型学习生成结构化的逐步解决方案。

from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = "microsoft/phi-3-mini-4k-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)

CUSTOM_TOKENS = ["<think>", "</think>"]
tokenizer.add_special_tokens({"additional_special_tokens": CUSTOM_TOKENS})
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    device_map="auto",
    torch_dtype=torch.float16,
    attn_implementation="flash_attention_2"
)
model.resize_token_embeddings(len(tokenizer))

第4步:配置LoRA以实现高效微调

LoRA通过冻结基础模型并仅训练小的适配器层来减少内存使用。

from peft import LoraConfig

peft_config = LoraConfig(
    r=8,  
    lora_alpha=16,  
    lora_dropout=0.2,  
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],  
    bias="none",  
    task_type="CAUSAL_LM"  
)

第5步:设置训练参数

from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./phi-3-deepseek-finetuned",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    per_device_eval_batch_size=2,
    gradient_accumulation_steps=4,
    eval_strategy="epoch",
    save_strategy="epoch",
    logging_strategy="steps",
    logging_steps=50,
    learning_rate=2e-5,
    fp16=True,
    optim="paged_adamw_32bit",
    max_grad_norm=0.3,
    warmup_ratio=0.03,
    lr_scheduler_type="cosine"
)

第6步:训练模型

SFTTrainer 简化了指令跟随模型的监督微调。data_collator 批量处理示例,peft_config 启用基于 LoRA 的训练。

from trl import SFTTrainer
from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=formatted_dataset["train"],
    eval_dataset=formatted_dataset["test"],
    data_collator=data_collator,
    peft_config=peft_config
)

trainer.train()
trainer.save_model("./phi-3-deepseek-finetuned")
tokenizer.save_pretrained("./phi-3-deepseek-finetuned")

第7步:合并并保存最终模型

训练后,LoRA适配器必须与基础模型合并以进行推理。此步骤确保模型可以独立使用,而无需PEFT。

final_model = trainer.model.merge_and_unload()
final_model.save_pretrained("./phi-3-deepseek-finetuned-final")
tokenizer.save_pretrained("./phi-3-deepseek-finetuned-final")

第8步:推理

from transformers import pipeline

model = AutoModelForCausalLM.from_pretrained(
    "./phi-3-deepseek-finetuned-final",
    device_map="auto",
    torch_dtype=torch.float16
)

tokenizer = AutoTokenizer.from_pretrained("./phi-3-deepseek-finetuned-final")
model.resize_token_embeddings(len(tokenizer))

chat_pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    device_map="auto"
)

prompt = """<|user|>
用两个骰子掷出7的概率是多少?
<|end|>
<|assistant|>
"""

output = chat_pipeline(
    prompt,
    max_new_tokens=5000,
    temperature=0.7,
    do_sample=True,
    eos_token_id=tokenizer.eos_token_id
)

print(output[0]['generated_text'])

以下是phi模型在蒸馏前后的响应。

问题:用两个骰子掷出7的概率是多少?

** 蒸馏前的推理:** 响应直接而简洁。它直接提供了计算答案的步骤。

Image 11

Phi 蒸馏前的推理

** 蒸馏后的推理:** 蒸馏后的响应引入了更详细和结构化的方法,包括一个明确的“思考”部分,概述了思维过程和推理,这将对生成复杂问题的准确响应非常有帮助。

Image 12

Phi 蒸馏后的推理

最后,蒸馏后的模型权重被推送到huggingface hub (repo_id: GPD1/DeepSeek-R1-Distill-phi-3-mini-4k-lorar8-alpha16–50000samples)。链接:https://huggingface.co/GPD1/DeepSeek-R1-Distill-phi-3-mini-4k-lorar8-alpha16-50000samples

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...