前言
本文重点介绍使用微调框架unsloth,围绕DeepSeek R1 Distill 7B模型进行高效微调,并介绍用于推理大模型高效微调的COT数据集的创建和使用方法,并在一个medical-o1-reasoning-SFT数据集上完成高效微调实战,并最终达到问答风格优化&知识灌注目的。
你能收获什么:
亲手完成DeepSeek R1蒸馏模型的微调实战
对模型微调、推理数据集等知识有一定了解
对大模型运行的机制和原理有一定的了解
有机会制作一个属于自己的定制化大模型
一、基础概念介绍
1.1 微调与强化学习、模型蒸馏
伴随着DeepSeek的兴起,关于强化学习训练、模型蒸馏等概念也逐渐被人熟知,这里简单总结下这三者的异同。微调、强化学习训练和模型蒸馏都是常用的技术方法,尽管这些方法在某些方面存在交集,但它们的核心原理和任务目标却有显著差异。
微调是指在已经训练好的大型预训练模型的基础上,进一步训练该模型以适应特定任务或特定领域的数据。相比从零开始训练一个模型,微调所需的数据和计算资源显著减少;可以在特定任务上取得更好的性能,因为模型在微调过程中会重点学习与任务相关的特性;可以在多种领域(如情感分析、问答系统等)上进行微调,从而快速适应不同应用场景。
举个?:想象一下,你有一只机器人狗,它已经在基本的狗行为上进行了初步训练,比如行走和听从简单的命令。微调就像是对这只机器狗进行进一步的训练以适应特定的任务环境。比如说,你希望这只机器狗能够在公园里捡回特定种类的球。通过微调,你可以在原有的训练基础上,用一组特定的数据集(比如各种颜色和大小的球)来调整其行为,使其在新环境中表现得更好。
目标:通过少量的标注数据对预训练模型进行优化,适应具体任务。
特点:微调的计算量相对较小,能够在有限的数据和计算资源下提升模型在特定任务上的性能。
●应用:常用于下游任务如情感分析、机器翻译、推荐系统等。
2. 强化学习(Reinforcement Learning):
强化学习是一种机器学习方法,它通过让智能体在环境中执行动作,以获得反馈或奖励信号,从而学习最优策略。通过不断地试错和调整策略,智能体逐渐找到能够最大化长期回报的行为路径。这种学习方法常用于需要决策和动态环境交互的任务,如游戏、机器人导航和自动化控制系统。
举个?:强化学习训练则有点像是教这只机器狗通过尝试和错误来学习新技能。在这种情况下,你没有直接告诉它应该怎么做,而是为它设定一个目标,比如尽可能快地找到并捡起一只球。机器狗每完成一次任务都会获得奖励,然后它将通过调整自己的行为来最大化获得的奖励。例如,如果机器狗发现跑直线能更快地找到球,它可能会在未来的尝试中更倾向于这样做。
●目标:通过与环境的交互,学习最优的行为策略,最大化累积奖励。
●特点:强化学习强调动态决策,它通常不依赖于预定义的数据集,而是依赖于与环境的持续交互。
●应用:强化学习在游戏AI(如AlphaGo)、机器人控制、自动驾驶等任务中有广泛应用。
3. 模型蒸馏(Model Distillation):
模型蒸馏是一种模型压缩技术,通过将一个复杂的大型模型(通常称为“教师模型”)中的知识迁移到一个更小的模型(称为“学生模型”)。在这个过程中,教师模型首先对训练数据进行预测,生成软标签即概率分布。这些软标签包含了有关任务的重要信息。学生模型则使用这些软标签进行训练,以接近教师模型的性能。模型蒸馏能够在保持高精度的同时,显著减少模型的大小和计算消耗,适用于在资源受限的环境下部署机器学习模型。
举个?:你有一只非常昂贵和精密的机器人狗,它可以完美执行任务。为了降低成本,你希望制造一个更简单的机器狗,同样能有效完成任务。通过模型蒸馏,你会使用大狗的行为数据来训练小狗,让后者理解和模仿前者的精妙动作,同时保持高效性。
●目标:通过教师模型的“知识转移” ,帮助学生模型提升性能,特别是计算能力有限的设备上。
●特点:蒸馏的核心在于知识的迁移,尤其是在模型压缩和部署方面的优势。学生模型通常在性能上能接近教师模型,但参数量更小,计算更高效。
●应用:常见于模型压缩、边缘计算、低功耗设备的部署中,用于提升部署效率并降低计算需求。
1.2 大模型微调
与RAG(Retrieval-Augmented Generation)或Agent技术依靠构建复杂的工作流以优化模型性能不同,微调通过直接调整模型的参数来提升模型的能力。这种方法让模型通过在特定任务的数据上进行再训练,从而‘永久’掌握该任务所需的技能。微调不仅可以显著提高模型在特定领域或任务上的表现,还能使其适应于各种具体应用场景的需求。这种能力的增强是通过更精细地调整模型内部的权重和偏差,使其在理解和生成信息时更加精准,因此被广泛用于需要高精度和领域适应性的任务中。
从广义上讲,微调可以分为两种主要方式:全量微调和高效微调。全量微调是指利用所有可用数据来重新训练模型,以全面优化其参数。尽管这种方法对计算资源的需求较高,但它能够在最大程度上提升模型对特定任务的适应能力。相反,高效微调则采用更精简的策略,只使用部分数据进行调整,并主要修改模型的部分参数。这种方法以相对较低的计算开销,实现对模型性能的显著提升,类似于“以小博大”,非常适合在资源有限的情况下快速调整和增强模型的性能。
全量微调(Full Fine-Tuning)
举个?:想象一下你在一家公司管理一个团队,这个团队的所有成员已经接受了基础培训,知道如何处理一般的工作任务。现在,公司引入了一个全新的复杂项目,要求团队具备更多的专业技能和知识。
●优点:全面掌握所有相关技能,使模型对新任务有更高的适应性。
●缺点:耗时更长,资源消耗大。
高效微调(Efficient Fine-Tuning)
高效微调的方法更有针对性,它不需要花费大量的时间和资源。举个?:比如,如果机器人狗的任务只是要学会在一种新环境中识别特别的障碍物,你可以在已有的模型基础上,仅仅微调那些与识别相关的参数,而无需重新训练整个模型。
●优点:节省时间和资源,快速提升特定技能。
●缺点:可能不如全面培训那样细致和彻底,但能够在特定任务中高效达标。
现在绝大多数开源模型,在开源的时候都会公布两个版本的模型,其一是Base模型,该模型只经过了预训练,没有经过指令微调;其二则是Chat模型(或者就是不带尾缀的模型),则是在预训练模型基础上进一步进行全量指令微调之后的对话模型:
尽管全量微调可以对模型的能力进行深度改造,但要带入模型全部参数进行训练,需要消耗大量的算力,且有一定的技术门槛。相比之下,在绝大多数场景中,如果我们只想提升模型某个具体领域的能力,那高效微调会更加合适。尽管在2020年前后,深度学习领域诞生了很多高效微调的方法,但现在适用于大模型的最主流的高效微调方法只有一种——LoRA。
LoRA( Low-Rank Adaptation)微调是一种参数高效的微调方法,旨在通过引入低秩矩阵来减少微 调时需要调整的参数数量,从而显著降低显存和计算资源的消耗。具体来说,LoRA 微调并不直接调整原始模型的所有参数,而是通过在某些层中插入低秩的适配器(Adapter)层来进行训练。
LoRA的原理:
●在标准微调中,会修改模型的所有权重,而在 LoRA 中,只有某些低秩矩阵(适配器)被训练和调整。这意味着原始模型的参数保持不变,只是通过少量的新参数来调整模型的输出。
●低秩矩阵的引入可以在显存和计算能力有限的情况下,依然有效地对大型预训练模型进行微调,从而让 LoRA 成为显存较小的设备上的理想选择。
举个?:想象你想教学生们怎样进行快速心算而不去完全打破他们原有的学习方法。你决定只引入一个简化版本的心算技巧,让他们在现有知识的基础上进行少量调整。这就像是把原有的学习方式轻量化处理,只增加所需的少量新知识,而不是重新教授整个数学课程。
LoRA的优势:
1.显存优化: 只需要调整少量的参数(适配器),显著减少了显存需求,适合显存有限的GPU。
2.计算效率: 微调过程中的计算负担也更轻,因为减少了需要调整的参数量。
3.灵活性: 可以与现有的预训练模型轻松结合使用,适用于多种任务,如文本生成、分类、问答等。
而QLoRA(Quantized Low-Rank Adaptation) 则是 LoRA 的一个扩展版本,它结合了 LoRA 的低秩适配器和量化技术。QLoRA 进一步优化了计算效率和存储需求,特别是在极端显存受限的环境下。与 LoRA 不同的是, QLoRA 会将插入的低秩适配器层的部分权重进行量化(通常是量化为INT4或INT8),在保持性能的同时显著降低模型的存储和计算需求。
举个?:针对学生中一些学习资源(如时间或精力)更加有限的情况,你进一步优化教学方法,不仅简化了学习内容(类似LoRA),同时还用了一些有助于记忆的技巧(比如使用图像或口诀),从而更有效地传授知识。这样,每个学生能在有限时间内学会心算法。在技术上,QLoRA涉及量化(quantization)技术,将模型的一部分权重参数存储在较低精度的数值格式中,以此减少内存使用和计算量,同时结合LoRA的低秩调整,让适应过程更加高效。
QLoRA的优势:
在显存非常有限的情况下仍能进行微调。
可以处理更大规模的模型。
3.适合用于边缘设备和需要低延迟推理的场景。
1.3 高效微调的应用场景
在实际大模型应用场景中,高效微调主要用于以下四个方面:
1.对话风格微调:高效微调可以用于根据特定需求调整模型的对话风格。例如,针对客服系统、虚拟助理等场景,模型可以通过微调来适应不同的语气、礼貌程度或回答方式,从而在与用户互动时提供更符合要求的对话体验。通过微调少量的参数(例如对话生成的策略、情感表达等),可以使模型表现出更具针对性和个性化的风格。
2.知识灌注:知识灌注是指将外部知识或领域特定的信息快速集成到已有的预训练模型中。通过高效微调,模型可以更好地学习新领域的专有知识,而无需重新从头开始训练。例如,对于法律、医疗等专业领域,可以使用少量的标注数据对预训练模型进行微调,帮助模型理解特定行业的术语、规则和知识,进而提升专业领域的问答能力。
3.推理能力提升:高效微调还可以用于提升大模型的推理能力,尤其是在处理更复杂推理任务时。通过微调,模型能够更加高效地理解长文本、推理隐含信息,或者从数据中提取逻辑关系,进而在多轮推理任务中提供更准确的答案。这种微调方式可以帮助模型在解答复杂问题时,提高推理准确性并减少错误。
4.Agent能力(Function calling & MCP能力)提升:在多任务协作或功能调用场景中,高效微调能够显著提升模型Agent能力,使得模型能够有效地与其他系统进行交互、调用外部API或执行特定MCP任务。通过针对性微调,模型可以学会更精准的功能调用策略、参数解析和操作指令,从而在自动化服务、智能助手或机器人控制等领域表现得更加高效和智能。
二、 DeepSeek R1 Distill高效微调环境准备
2.1 unsloth安装
unsloth是推理、微调一体式框架,unsloth将Llama 3.3、Mistral、Phi-4、Qwen 2.5和Gemma的微调速度提高2倍,同时节省80%的内存。
官网地址:GitHub – unslothai/unsloth: Finetune Llama 3, Mistral & Gemma LLMs 2-5x faster with 80% less memory
https://github.com/unslothai/unsloth
使用如下命令快速安装:
2.2 wandb安装与注册
2.3 DeepSeek R1模型下载
2.4 微调数据
此时think部分和最终回复,共同构成有监督微调的标签。
这种同时包含思考和结果的数据集,在当下并不少见,例如非常著名的数学问答数据集NuminaMath CoT,就同时包含数学问题、问题的解题思路(也就是think部分)和问题最终的答案。而该数据集也是可以用于推理模型微调的数据集。除了NuminaMath CoT数据集外,还有APPs(编程数据集)、 TACO(编程数据集)、long_form_thought_data_5k (通用问答数据集)等,都是CoT数据集,均可用于推理模型微调。
若实际业务有需要,也可以构造类似结构的数据集。
DeepSeek 教程
三、DeepSeek R1模型微调实操
3.1 unsloth LLama模型推理
现在要自定义微调,可以编辑上面的数字,也可以忽略它,因为已经默认选择了相当合理的数字。目标是改变这些数字以提高准确率,同时也抵消过度拟合。过度拟合是指让语言模型记住数据集,而无法回答新颖的新问题。希望最终模型能够回答从未见过的问题,而不是进行记忆。
,或将其加倍。
选项包括、和。建议使用,因为内存使用量减少了 30%,并支持极长的上下文微调。https://unsloth.ai/blog/long-context了解更多详细信息。
高级功能可自动设置。
在INT4量化情况下,8B模型推理仅需7G左右显存。
3.2 初始模型问答测试
问答测试
问题1测试
3.3 最小可行性实验
这只会对数据集进行更多遍历。
,并将其替换为
。将其设置为 1 表示对数据集进行 1 次完整传递。通常建议传递 1 到 3 次,不要更多,否则微调会过度拟合。
3.4 微调参数解析
SFTTrainer(来自 trl 库):
trl(Transformer Reinforcement Learning)是 Hugging Face 旗下的 trl 库,提供监督微调(SFT) 和强化学习(RLHF)相关的功能。
SFTTrainer 主要用于有监督微调(Supervised Fine-Tuning),适用于 LoRA 等低秩适配微调方式。
TrainingArguments(来自 transformers 库):
○这个类用于定义训练超参数,比如批量大小、学习率、优化器、训练步数等。
○这个函数检查当前 GPU 是否支持 bfloat16(BF16),如果支持,则返回 True,否则返回 False
○bfloat16 是一种更高效的数值格式,在新款 NVIDIA A100/H100 等GPU上表现更优。
3.5 完整高效微调实验
10分钟构建能主动提问的智能导购
为助力商家全天候自动化满足顾客的购物需求,可通过百炼构建一个 Multi-Agent 架构的大模型应用实现智能导购助手。该系统能够主动询问顾客所需商品的具体参数,一旦收集齐备,便会自动从商品数据库中检索匹配的商品,并精准推荐给顾客。
发布者:Ai探索者,转载请注明出处:https://javaforall.net/240851.html原文链接:https://javaforall.net
