DeepSeek 系列模型以卓越性能在全球范围内备受瞩目,在各类评测中表现优异,推理性能接近甚至超越国际顶尖闭源模型。2025年2月以来,阿里云人工智能平台 PAI 持续推出围绕 DeepSeek 系列模型的最佳实践,包含快速部署、应用搭建、蒸馏、微调等各个环节,让企业和个人开发者可以在云上高效、灵活地部署和探索 DeepSeek-R1、DeepSeek-V3 等模型。
本文将为您带来“DeepSeek R1+Qwen 大模型蒸馏和微调训练”最佳实践。
一、开发流程概述
DeepSeek R1 模型的推出展现了大语言模型(LLMs)在深度推理领域的巨大潜力,也引发了对知识蒸馏技术的关注。蒸馏的核心思路是将大尺寸模型的推理模式迁移至小尺寸模型中,让小尺寸模型也能具备高质量思维能力。在此基础上,结合模型微调技术,又能让小尺寸模型进一步学习和胜任特定场景的任务。这样,就能最大限度地利用计算资源,高效迭代模型。
整个开发流程将分为以下三步:
- 准备指令数据集。
- 部署教师大语言模型(DeepSeek-R1),并生成对应回复。
- 蒸馏训练学生模型(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].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;
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数据格式要求。使用上述数据时无需部署教师大模型。
蒸馏训练较小的学生模型
当获得教师模型的回复后,可以在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和训练完成后的效果如下:
问题 | |
---|---|
正确答案 | |
通义千问2.5-7B-Instruct | |
蒸馏后的通义千问2.5-7B-Instruct |
我们也在各个数学题类推理数据集上进行了评测,结果对比如下:
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等系列模型。详情请参见场景实践。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。