写点什么

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

  • 2025-02-24
    浙江
  • 本文字数:6727 字

    阅读完需:约 22 分钟

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.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 数据格式要求。)

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

2.1. 部署模型服务


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


2.1.2 左侧导航栏进入快速开始 > Model Gallery(链接:https://pai.console.aliyun.com/#/quick-start/models);


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



说明:目前 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].idprint(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;



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


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


import json from tqdm import tqdmimport requestsfrom typing import Listfrom 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].idprint(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 数据格式要求。使用上述数据时无需部署教师大模型。

蒸馏训练较小的学生模型

当获得教师模型的回复后,可以在 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 开始进行训练,用户可以查看训练任务状态和训练日志。



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


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

三、效果对比

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



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



四、相关文档

●更多关于 EAS 产品的内容介绍,请参见模型在线服务(EAS)


●使用 Model Gallery 功能,您可以轻松完成更多场景的部署与微调任务,包括 Llama-3、Qwen2.5、Stable Diffusion V1.5 等系列模型。详情请参见场景实践


用户头像

还未添加个人签名 2020-10-15 加入

分享阿里云计算平台的大数据和AI方向的技术创新和趋势、实战案例、经验总结。

评论

发布
暂无评论
云上玩转DeepSeek系列之四:DeepSeek R1 蒸馏和微调训练最佳实践_人工智能_阿里云大数据AI技术_InfoQ写作社区