You need to enable JavaScript to run this app.
导航
蒸馏 DeepSeek-R1 最佳实践
最近更新时间:2025.04.02 21:40:09首次发布时间:2025.04.02 21:40:09
我的收藏
有用
有用
无用
无用

背景

DeepSeek-R1 通过强化学习极大提升了模型的推理能力。通过引导模型在推理过程中自发反思与验证,使其在数学、代码和推理任务上达到了与 OpenAI-o1 相媲美的性能。同时 DeepSeek 研究发现,DeepSeek-R1 的推理能力可以蒸馏到如 Qwen-7B/Llama-8B 等较小尺寸模型上。在小规模模型上复刻「深度思考」推理模式的同时,实现更高效、更低成本的推理方案。
本文介绍如何使用 DeepSeek-R1 的推理数据训练 Doubao-1.5-lite-32k 模型,使其获得类似 DeepSeek-R1 的思考能力,同时提升模型解决特定领域问题的能力。
值得注意的是,方舟将提供具有「深度思考」能力的 doubao-1.5-thinking-pro 模型,在通用场景上具有强大的 COT 推理能力。如果需要通用「深度思考」推理能力,可直接使用该模型。

什么是模型蒸馏

模型蒸馏(Model Distillation)是一种将复杂强大的 “教师模型”(Teacher Model)的知识迁移到轻量级 “学生模型”(Student Model)的技术。其核心目标是让学生模型在保持较小规模的同时,尽可能复现教师模型的性能,从而解决大模型在部署成本较高,推理效率较低的问题。同时学生模型的参数量决定了蒸馏后的能力上限。参数量越大的模型,在蒸馏后能更接近教师模型的水平。
模型蒸馏的过程一般是先准备特定领域的一批数据,使用教师模型进行推理。然后使用教师模型的推理结果构造有监督学习数据集,对学生模型进行 SFT(Supervised Finetune)训练。在训练过程中学生模型可以根据教师模型的推理结果更新自己的参数权重,以此来模仿教师模型的推理过程。

实践概述

本次实践使用数学竞赛场景来描述 DeepSeek-R1 向 Doubao-1.5-lite-32k 模型蒸馏的效果。选用数学竞赛场景是因为数学问题往往存在唯一的标准答案,能方便地判断出模型返回是否正确;且数学竞赛问题具有一定难度,往往需要相对严谨的逻辑推导才能得到正确答案,非常适合体现出模型的思考和推理能力。
如以下这道问题,Doubao-1.5-lite-32k 返回了错误答案。而 DeepSeek-R1 通过深度思考,经历了多轮思考和反复验证,最终输出了正确答案。

Let a be a positive real number such that all the roots of [x^3 + ax^2 + ax + 1 = 0] are real. Find the smallest possible value of a.

操作步骤

1.准备训练数据

本文使用的数据提炼自 OpenR1-Math-220k。这个数据集是社区使用 NuminaMath 1.5 中的 400k 数学问题对 DeepSeek-R1 进行推理,从而获取 DeepSeek-R1 的推理过程与答案。为提高数据质量和精简数据规模,我们仅保留 DeepSeek-R1 推理出正确答案的那一部分样本,并转换成适配方舟 SFT 精调的数据格式。最终数据集规模为 64k 条样本。数据文件点此链接获得。
构造蒸馏数据集目前可以使用平台的「批量推理」进行。进入「批量推理」模块创建「批量推理任务」。填写任务名称,选择 DeepSeek-R1 模型,并选择推理数据集和输出数据路径后。点击创建任务并等待任务完成,即可在选择的输出路径获取 DeepSeek-R1 的推理结果文件。然后参考 SFT 数据格式 转换为精调所需数据文件。

说明

蒸馏数据集的质量和数据决定了蒸馏的效果。在训练前可对教师模型返回的正确性进行校验来保证学生模型学习到正确内容。
实验证明蒸馏数据越多学生模型提升的效果越好,尽可能保证蒸馏数据集数量大于 5k。

2.训练模型

方舟「模型精调」模块提供了模型 SFT 精调能力,通过 SFT 精调能够使 Doubao-1.5-lite-32k 学习到 DeepSeek-R1 的深度思考能力。
在创建精调任务时,选择 Doubao-1.5-lite-32k/250115 作为底座模型,并选择训练类型为「SFT 精调」。为了让模型学习得更加充分,训练方式我们选择 「全量训练」。
超参使用默认超参即可,您也可增加 epoch (迭代)到 3 来提高训练效果。

您也可尝试「LoRA」训练,使用更低的训练成本获得近似的训练效果。更多调参的指导可参考 SFT 最佳实践

在任务结束后,最后一个产物将会自动导出到「模型仓库」,可在「模型产出」页签查看产物信息。我们在这直接基于最后一个自动导出的产物进行效果验证。
Image

3.部署模型服务

在「在线推理」界面创建推理接入点,模型选择「模型仓库」中蒸馏产物对应记录。

说明

推理时配置 DeepSeek 推荐的配置 temperature=0.6,top_p=0.95。请求精调后模型,我们发现此时模型已经能在返回时进行深度思考,并在之前回答错误的问题上返回了正确答案。

4.结果评估

本文使用 MATH-500 数据集进行模型数据能力的评估。该数据集由 OpenAI 提供用于评估模型在数学领域能力。使用该数据集评估模型数据能力的代码可见附录。
最终发现 Doubao-1.5-lite-32k 在使用 DeepSeek-R1 蒸馏数据 SFT 后,不仅在推理过程具备了「深度思考」的能力,数学能力同时显著提升;且蒸馏后模型的推理成本和推理效率与 Doubao-1.5-Lite-32k 持平,远优于 DeepSeek-R1。

模型

数学能力得分

Doubao-1.5-Lite-32k

0.81

DeepSeek-R1-Distill-Doubao-1.5-Lite-32k

0.89

我们根据蒸馏实验过程的经验,总结了如下几点建议供您实践时参考:

  • 如果您有需要 Doubao-1.5-Pro 系列模型或 DeepSeek-R1 的推理效果,但又需要 Doubao-1.5-Lite 模型极致的推理效率和更低的推理成本,可以尝试使用自己业务场景的数据进行模型蒸馏,使 Doubao-1.5-Lite 模型具备 Doubao-1.5-Pro 或 DeepSeek-R1 的能力。
  • 蒸馏训练数据的质量和数量对最终训练效果的影响非常大,我们建议您蒸馏时样本数量尽可能大于 10k,并且对「教师模型」的推理结果进行校验,保证「学生模型」学习到足够的且正确的内容。
  • 平台将提供具有强大「深度思考」Doubao-1.5-thinking-pro。如果您在通用领域需要「深度思考」能力,可先尝试该模型。
  • 如您希望提升模型效果,可以酌情增加训练的epoch (迭代)数量,来保证模型学习更加充分,但需要关注过拟合的风险。实验证明 epoch 数越多训练效果越充分效果越好,您可尝试增加 epoch 并分割 1% 数据为验证集,在验证集 loss 保持降低的前提下尽可能降低训练集 loss(损失)。同时增加「产出数量」,使训练中的产物能保存下来,当发现过拟合的情况可以使用中间产物。

模型

数学能力得分

Doubao-1.5-Lite-32k

0.81

DeepSeek-R1-Distill-Doubao-1.5-Lite-32k, epoch=1

0.87

DeepSeek-R1-Distill-Doubao-1.5-Lite-32k, epoch=3

0.89

DeepSeek-R1-Distill-Doubao-1.5-Lite-32k, epoch=10

0.93

评测代码
# python main.py --ep xxx --api-key xxx 执行

import argparse

from math_verify import parse, verify, LatexExtractionConfig
from datasets import load_dataset
from volcenginesdkarkruntime import Ark

def verify_answer(gold, answer):
    gold = parse(gold, extraction_config=[LatexExtractionConfig()])
    answer = parse(answer, extraction_config=[LatexExtractionConfig()])
    return verify(gold, answer)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--ep", type=str, required=True)
    parser.add_argument("--api-key", type=str, required=True)
    args = parser.parse_args()

    client = Ark(
        # 此为默认路径,您可根据业务所在地域进行配置
        base_url="https://ark.cn-beijing.volces.com/api/v3",
        # 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
        api_key=args.api_key,
    )

    ds = load_dataset("HuggingFaceH4/MATH-500")
    total = 0
    right = 0

    for line in ds['test']:
        total += 1
        problem = line['problem']
        gold = line['solution']
        completion = client.chat.completions.create(
            # 指定您创建的方舟推理接入点 ID,此处已帮您修改为您的推理接入点 ID
            model=args.ep,
            messages=[
                {"role": "system",
                 "content": "Please reason step by step, and put your final answer within \\boxed{}."},
                {"role": "user", "content": problem},
            ],
        )
        answer = completion.choices[0].message.content
        if verify_answer(gold, answer):
            right += 1
        print(f"total: {total}, right: {right}, score: {right / total}")