云上玩转DeepSeek系列之四:DeepSeek R1 蒸馏和微调训练最佳实践

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 本文将为您带来“DeepSeek R1+Qwen 大模型蒸馏和微调训练”最佳实践。阿里云 PAI 平台提供了围绕 DeepSeek 模型的最佳实践,涵盖快速部署、应用搭建、蒸馏和微调等环节,帮助开发者高效利用计算资源,使用 Model Gallery 功能,轻松完成部署与微调任务。

DeepSeek 系列模型以卓越性能在全球范围内备受瞩目,在各类评测中表现优异,推理性能接近甚至超越国际顶尖闭源模型。2025年2月以来,阿里云人工智能平台 PAI 持续推出围绕 DeepSeek 系列模型的最佳实践,包含快速部署、应用搭建、蒸馏、微调等各个环节,让企业和个人开发者可以在云上高效、灵活地部署和探索 DeepSeek-R1、DeepSeek-V3 等模型。

本文将为您带来“DeepSeek R1+Qwen 大模型蒸馏和微调训练”最佳实践。


一、开发流程概述

DeepSeek R1 模型的推出展现了大语言模型(LLMs)在深度推理领域的巨大潜力,也引发了对知识蒸馏技术的关注。蒸馏的核心思路是将大尺寸模型的推理模式迁移至小尺寸模型中,让小尺寸模型也能具备高质量思维能力。在此基础上,结合模型微调技术,又能让小尺寸模型进一步学习和胜任特定场景的任务。这样,就能最大限度地利用计算资源,高效迭代模型。

整个开发流程将分为以下三步:

  1. 准备指令数据集。
  2. 部署教师大语言模型(DeepSeek-R1),并生成对应回复。
  3. 蒸馏训练学生模型(Qwen2.5-7B-Instruct),并完成服务部署。

本方案使用到的阿里云产品有:人工智能平台PAI、对象存储OSS。在正式开始前需确认已完成 PAI 工作空间的开通与授权,以及 OSS 存储空间(Bucket)的创建。


二、操作步骤


1、准备指令数据集

1.1 训练数据准备策略:

  • 数据量:至少准备数百条数据,准备的数据越多越有助于提升模型的效果。
  • 数据范围:与深度推理任务密切相关,应涵盖广泛的应用场景,如科学研究、数学难题、逻辑推理以及日常生活中的复杂决策问题。
  • 数据来源:准确可靠,如专业出版物、在线百科全书、问答平台、以及特定领域的科研论文等。
  • 数据处理:对收集的数据进行预处理和筛选,剔除冗余、错误和重复的数据。

1.2 训练数据集格式要求:

JSON格式的文件,包含instruction一个字段,为输入的指令。相应的指令数据示例如下:

[
    {
        "instruction": "Return your final response within \\boxed{}. The equation $2^{2x}-8\\cdot 2^x+12=0$ is satisfied by:\n$\\text{(A) } log(3)\\quad \\text{(B) } \\tfrac{1}{2}log(6)\\quad \\text{(C) } 1+log(\\tfrac{3}{2})\\quad \\text{(D) } 1+\\frac{log(3)}{log(2)}\\quad \\text{(E) none of these}$"
    },
    {
        "instruction": "Return your final response within \\boxed{}. In $\\triangle ABC$ with right angle at $C$, altitude $CH$ and median $CM$ trisect the right angle. If the area of $\\triangle CHM$ is $K$, then the area of $\\triangle ABC$ is \n $\\textbf{(A)}\\ 6K\\qquad\\textbf{(B)}\\ 4\\sqrt3\\ K\\qquad\\textbf{(C)}\\ 3\\sqrt3\\ K\\qquad\\textbf{(D)}\\ 3K\\qquad\\textbf{(E)}\\ 4K$"
    }
]

1.3 使用 PAI 提供的数据集作为种子指令数据集(可选)

如有需要也可以使用以下命令完成下载:

wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/Distil_R1/Bespoke-Stratos-17k_thought.json

(备注:这一数据集来源为Bespoke-Stratos-17k,数据格式经过转换使得它满足PAI-Model Gallery数据格式要求。数据集链接:https://modelscope.cn/datasets/bespokelabs/Bespoke-Stratos-17k


2、部署教师大语言模型(DeepSeek-R1)并生成回复

2.1 部署模型服务

2.1.1 登录 PAI 控制台,选择地域并进入工作空间(如未开通和授权,请参考前序准备部分);

2.1.2 左侧导航栏进入快速开始 > Model Gallery

2.1.3 在 PAI-Model Gallery 中选择「DeepSeek-R1 」模型卡片,按系统默认配置提交模型部署任务。当部署任务为运行中后,表示模型部署成功;

image.png

说明:目前DeepSeek-R1支持采用 SGLang和vLLM 加速部署;DeepSeek-R1蒸馏小模型(例如DeepSeek-R1-Distill-Qwen-7B)支持采用BladeLLM(阿里云 PAI 自研高性能推理框架)和 vLLM 加速部署。

2.2 调用模型服务

2.2.1 服务部署成功后,可以使用API进行模型推理。在模型部署任务中,查看并保存预训练模型的调用方式介绍、服务访问地址和 Token等信息。具体请参考:一键部署DeepSeek-R1模型后通过API调用

2.2.2 在终端中,执行如下代码调用服务(以SGLang部署为例);

from openai import OpenAI

##### API 配置 #####
openai_api_key = "<EAS API KEY>"
openai_api_base = "<EAS API Endpoint>/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

models = client.models.list()
model = models.data[0].id
print(model)


def main():

    stream = True

    chat_completion = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "你好,介绍一下你自己,越详细越好。",
                    }
                ],
            }
        ],
        model=model,
        max_completion_tokens=1024,
        stream=stream,
    )

    if stream:
        for chunk in chat_completion:
            print(chunk.choices[0].delta.content, end="")
    else:
        result = chat_completion.choices[0].message.content
        print(result)


if __name__ == "__main__":
    main()

2.3 批量实现教师模型的指令标注

2.3.1 在 PAI-Model Gallery 模型部署服务页,点击调用信息-查看调用信息,获取服务的访问地址和 Token;

image.png

2.3.2 使用需要让模型推理生成的数据,批量调用接口生成训练数据;

以下代码示范如何读取自己的json格式数据集,批量调用模型接口进行教师模型标注。post_http_request和get_response函数定义与前述脚本相同。

import json 
from tqdm import tqdm
import requests
from typing import List
from openai import OpenAI

##### API 配置 #####
openai_api_key = "<EAS API KEY>"
openai_api_base = "<EAS API Endpoint>/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

models = client.models.list()
model = models.data[0].id
print(model)

def generate_response(ins):
    stream = True

    chat_completion = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": ins,
                    }
                ],
            }
        ],
        model=model,
        max_completion_tokens=4096,
        stream=stream,
    )
    res=''
    if stream:
        for chunk in chat_completion:
            res+=chunk.choices[0].delta.content
    else:
        res = chat_completion.choices[0].message.content
    return res

input_file_path = "input.json" # 输入文件名

with open(input_file_path) as fp:
    data = json.load(fp)

pbar = tqdm(total=len(data))
new_data = []

for d in data:
    prompt = d["instruction"]
    output = generate_response(prompt)
    temp = {
        "instruction": prompt,
        "output": output
    }
    new_data.append(temp)
    pbar.update(1)
pbar.close()

output_file_path = "output.json" # 输出文件名
with open(output_file_path, 'w') as f:
    json.dump(new_data, f, ensure_ascii=False, indent=4)

2.3.3 最终生成的json格式数据如下,可以直接使用生成的数据在PAI-Model Gallery上进行模型训练;

[
    {
        "instruction": "请你写一段代码,实现大数据量下的快速排序功能。",
        "output": "<think>\n嗯,用户让我写一段代码,实现大数据量下的快速排序功能。首先,我得理解用户的需求。大数据量通常意味着数据量非常大,可能会影响传统快速排序的效率,或者用户希望代码在大数据情况下运行得更快、更稳定。\n\n快速排序本身是一种高效的排序算法,平均时间复杂度是O(n log n),但最坏情况下是O(n²)。不过,快速排序在大数据量下通常表现还是不错的,因为它在内存中操作,不需要额外的空间。所以,我应该考虑如何优化快速排序,特别是在大数据量的情况下。\n\n首先,我应该回顾一下快速排序的基本实现。快速排序通过选择一个基准元素,将数组分成两部分,小于基准的在左边,大于基准的在右边,然后递归排序这两部分。这个过程通常使用递归实现,但递归在大数据量下可能会导致栈溢出,所以可能需要改用迭代或者递归加尾部优化的方法。\n\n然后,考虑到大数据量,可能需要使用更高效的语言,比如C++,因为它比Python更快。不过,用户可能更倾向于使用Python,所以可能需要在Python中实现高效的快速排序。\n\n在Python中,快速排序的实现可能会遇到性能问题,因为Python本身的解释性解释器会影响速度。所以,可能需要使用一些优化技巧,比如选择一个好的基准元素,或者使用内置的函数来优化排序过程。\n\n另外,快速排序的性能优化通常包括减少递归调用的开销,使用迭代实现,或者选择一个更好的划分策略。比如,三划分或者使用中位数作为基准,可以减少递归的深度,从而减少栈溢出的风险,同时提高效率。\n\n我还应该考虑内存的使用。快速排序是原地排序,所以不需要额外的内存空间,但处理大数据量时,可能需要优化内存访问模式,避免频繁的数据交换,从而提高缓存效率。\n\n另外,可能需要使用一些高级的Python特性,比如使用生成器或者列表操作来优化排序过程。或者,可以考虑使用外部排序的方法,当数据量超过内存容量时,但用户的问题是关于大数据量下的快速排序,可能是指内存中的大数据,所以外部排序可能不是主要考虑。\n\n再者,快速排序的性能还与数据的初始状态有关。如果数据已经有序,快速排序的效率会降低,因为每次划分都会产生一个空的部分和一个长度为n-1的部分。这时候,可能需要使用三划分的方法,或者选择一个随机的基准,或者使用其他排序算法来处理这些情况。\n\n总结一下,我需要写一个高效的快速排序函数,可能需要考虑以下几点:\n\n1. 选择一个合适的基准元素,以减少递归深度和提高效率。\n2. 使用迭代实现,避免过多的递归调用,减少栈溢出的风险。\n3. 优化内存访问模式,提高缓存效率。\n4. 使用Python的内置函数和数据结构,尽可能提高性能。\n\n现在,我应该考虑如何实现这些优化。比如,在Python中,可以使用双指针法来实现快速排序,避免递归,改用迭代的方式。或者,可以使用递归,但增加尾部优化,或者使用尾递归的替代方案,虽然Python不支持尾递归优化,但可以通过其他方式模拟。\n\n另外,快速排序的性能还与数据的类型有关。如果数据是列表,可能需要将其转换为数组,或者使用更高效的数据结构,比如NumPy数组,但NumPy可能不在用户的要求范围内,所以可能需要避免使用。\n\n最后,我应该测试代码的性能,确保在大数据量下,排序速度足够快。可能需要使用一些基准测试,或者使用时间函数来测量排序的时间,确保优化后的代码在大数据量下表现良好。\n\n综上所述,我应该编写一个优化过的快速排序函数,使用双指针法,避免递归,或者使用更高效的语言特性,比如C++,但考虑到用户可能更倾向于Python,所以可能需要在Python中实现高效的快速排序,同时考虑优化策略。\n</think>\n\n在大数据量的情况下,快速排序可以通过一些优化措施来提高性能。以下是一个优化过的快速排序实现,使用双指针法和减少递归调用的开销:\n\n```python\ndef quick_sort(arr):\n    if len(arr) <= 1:\n        return arr\n\n    def partition low high:\n        pivot = arr[high]\n        while low <= high:\n            if arr[low] >= pivot:\n                low += 1\n            else:\n                arr[low], arr[high] = arr[high], arr[low]\n                high -= 1\n        return low\n\n    def quick_sort_helper low high:\n        if low >= high:\n            return\n        pivot_index = partition(low, high)\n        quick_sort_helper(low, pivot_index - 1)\n        quick_sort_helper(pivot_index + 1, high)\n\n    quick_sort_helper(0, len(arr) - 1)\n    return arr\n```\n\n### 优化措施:\n1. **减少递归开销**:将递归实现改为迭代实现,避免了递归调用的开销。\n2. **双指针法**:使用双指针法来实现快速排序,减少了内存交换的次数,提高了缓存效率。\n3. **减少递归深度**:通过选择一个合适的基准元素(这里使用最后一个元素作为基准),减少了递归深度,从而减少了栈溢出的风险。\n\n### 使用场景:\n这个实现适用于大数据量的排序任务,因为它减少了递归调用的开销,并且通过双指针法提高了缓存效率。\n\n### 示例使用:\n```python\nimport random\n\n# 生成一个大数据量的数组\ndata = list(range(1000000))\nrandom.shuffle(data)\n\n# 进行快速排序\nsorted_data = quick_sort(data)\n```\n\n这个实现在大数据量下表现良好,但需要注意的是,快速排序在最坏情况下时间复杂度仍然是O(n²),但这种情况在实际应用中非常罕见。"
    }
]

2.4 使用 PAI 预置的指令标注数据(可选)

您可以使用如下命令下载我们已经准备好的数据集进行模型训练:

wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/Distil_R1/Bespoke-Stratos-17k_thought.json

这一数据集来源为Bespoke-Stratos-17k,数据格式经过转换使得它满足 PAI-Model Gallery 数据格式要求。使用上述数据时无需部署教师大模型。(数据源链接:https://modelscope.cn/datasets/bespokelabs/Bespoke-Stratos-17k)


3、蒸馏训练较小的学生模型

当获得教师模型的回复后,可以在 PAI-Model Gallery 中,实现学生模型的训练,无需编写代码,极大简化了模型的开发过程。以 Qwen2.5-7B-Instruct 模型为例,在 PAI-Model Gallery 中进行模型训练。具体操作步骤如下:


3.1 开始模型微调训练

3.1.1 在 PAI-Model Gallery 中选择「通义千问2.5-7B-Instruct」模型卡片,进入模型详情页面(控制台打开方式与2.1.1,2.1.2一致)

3.1.2 在模型详情页面,单击右上角的微调训练;

3.1.3 在微调训练配置面板中,配置以下关键参数,其他参数取默认配置。建议默认使用全参数微调的方式进行训练,以获得最佳效果。


Your role as an assistant involves thoroughly exploring questions through a systematic long thinking process before providing the final precise and accurate solutions. This requires engaging in a comprehensive cycle of analysis, summarizing, exploration, reassessment, reflection, backtracing, and iteration to develop well-considered thinking process. Please structure your response into two main sections: Thought and Solution. In the Thought section, detail your reasoning process using the specified format: \
<thought> {thought with steps separated with '\n\n'} \
<thought> \
Each step should include detailed considerations such as analyzing questions, summarizing relevant findings, brainstorming new ideas, verifying the accuracy of the current steps, refining any errors, and revisiting previous steps. \
In the Solution section, based on various attempts, explorations, and reflections from the Thought section, systematically present the final solution that you deem correct. The solution should remain a logical, accurate, concise expression style and detail necessary step needed to reach the conclusion, formatted as follows: \
<thought> \
{final formatted, precise, and clear solution} \
<thought> \
Now, try to solve the following question through the above guidelines:

3.1.4 点击“训练”按钮,PAI-Model Gallery 开始进行训练,用户可以查看训练任务状态和训练日志。

image.png

3.2 模型训练完成,一键部署服务

模型训练完成后,可以将模型部署至 PAI-EAS。在同一页面的模型部署卡面选择资源组,并且点击“部署”按钮实现一键部署。


三、效果对比

对比原始Qwen2.5-7B-Instruct和训练完成后的效果如下:

问题

image.png

正确答案

image.png

通义千问2.5-7B-Instruct

image.png

image.png

image.png




蒸馏后的通义千问2.5-7B-Instruct

image.png

image.png

image.png


我们也在各个数学题类推理数据集上进行了评测,结果对比如下:

AIME2024

MATH500

GSM8K

GPQA Diamond

Qwen2.5-7B-Instruct模型

10.0

74.6

89.54

33.84

微调后模型

20.0

80.0

92.95

37.37


四、相关文档

  • 更多关于 EAS 产品的内容介绍,请参见模型在线服务(EAS)
  • 使用 Model Gallery 功能,您可以轻松完成更多场景的部署与微调任务,包括 Llama-3、Qwen2.5、Stable Diffusion V1.5 等系列模型。详情请参见场景实践
相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
打赏
0
9
8
0
3627
分享
相关文章
从零开始的DeepSeek微调训练实战(SFT)
本文重点介绍使用微调框架unsloth,围绕DeepSeek R1 Distill 7B模型进行高效微调,并介绍用于推理大模型高效微调的COT数据集的创建和使用方法,并在一个medical-o1-reasoning-SFT数据集上完成高效微调实战,并最终达到问答风格优化&知识灌注目的。
从零开始的DeepSeek微调训练实战(SFT)
云上玩转DeepSeek系列之五:实测优化16%, 体验FlashMLA加速DeepSeek-V2-Lite推理
DeepSeek-AI 开源的 FlashMLA 是一个优化多层注意力机制的解码内核,显著提升大语言模型的长序列处理和推理效率。本文介绍了如何在 PAI 平台上安装并使用 FlashMLA 部署 DeepSeek-V2-Lite-Chat 模型。通过优化后的 FlashMLA,实现了约 16% 的性能提升。
云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手
本文将为您带来“基于 PAI-RAG 构建 DeepSeek 联网搜索+企业级知识库助手服务”解决方案,PAI-RAG 提供全面的生态能力,支持一键部署至企业微信、微信公众号、钉钉群聊机器人等,助力打造多场景的AI助理,全面提升业务效率与用户体验。
云上玩转DeepSeek系列之二:PAI+DeepSeek,打造智能问答助手
本文将为您带来“PAI+DeepSeek,30分钟打造支持连网搜索+私有知识库的智能应用”最佳实践,大模型能力、联网能力再加持 RAG 方案,实现 DeepSeek 系列模型与现有业务的高效融合。
DeepSeek进阶开发与应用3:DeepSeek中的模型调优技术
本文深入探讨了DeepSeek框架中的模型调优技术,涵盖超参数优化、正则化方法及回调函数的应用。通过学习率调整、网格搜索、L1/L2正则化、Dropout、提前停止和模型检查点等具体示例,帮助读者掌握提升模型性能和防止过拟合的方法。文中还介绍了如何使用回调函数监控和调整训练过程,确保模型在大规模数据集上高效训练。
DeepSeek V3+R1满血微调工具上线!一键启动,硬件要求降10倍
DeepSeek V3+R1满血微调工具上线!一键启动,硬件要求降10倍
164 1
小白避坑指南:国内用Colossal-AI微调DeepSeek 1.5B的完整踩坑记录(附镜像加速方案)
本文详细记录了使用Colossal-Ai对DeepSeek-Qwen模型进行微调的过程,包括模型下载、环境部署、数据集处理及代码实现等环节。重点介绍了LoRA低秩适配方法和Colossal-Ai分布式训练框架的使用技巧,解决了模型封装后函数调用冲突、梯度检查点配置等问题。通过命令行参数灵活调整训练配置,最终在两块A100 GPU上完成训练,单卡显存占用约11GB,利用率达85%。文章总结了常见问题及解决方法,为后续研究提供参考。
457 15
小白避坑指南:国内用Colossal-AI微调DeepSeek 1.5B的完整踩坑记录(附镜像加速方案)
面向教育场景的大模型 RAG 检索增强解决方案
检索增强生成模型结合了信息检索与生成式人工智能的优点,从而在特定场景下提供更为精准和相关的答案。以人工智能平台 PAI 为例,为您介绍在云上使用一站式白盒化大模型应用开发平台 PAI-LangStudio 构建面向教育场景的大模型 RAG 检索增强解决方案,应用构建更简便,开发环境更直观。此外,PAI 平台同样发布了面向医疗、金融和法律领域的 RAG 解决方案。
Hologres × PAI × DeepSeek 搭建 RAG 检索增强对话系统
本文介绍如何使用PAI-EAS部署基于DeepSeek大模型的RAG(检索增强生成)服务,并关联Hologres引擎实例。Hologres与阿里云自研高性能向量计算软件库Proxima深度整合,支持高性能、低延时的向量计算能力。通过PAI-EAS,用户可以一键部署集成了大语言模型和RAG技术的对话系统服务,显著缩短部署时间,并提高问答质量。部署步骤包括准备Hologres向量检索库、部署基于DeepSeek的RAG服务、通过WebUI进行模型推理验证,以及通过API调用进行模型推理验证。Hologres还提供了特色功能支持,如高性能向量计算等。
阿里万相重磅开源,人工智能平台PAI一键部署教程来啦
阿里云视频生成大模型万相2.1(Wan)重磅开源!Wan2.1 在处理复杂运动、还原真实物理规律、提升影视质感以及优化指令遵循方面具有显著的优势,轻松实现高质量的视频生成。同时,万相还支持业内领先的中英文文字特效生成,满足广告、短视频等领域的创意需求。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署阿里万相重磅开源的4个模型,可获得您的专属阿里万相服务。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问