Unsloth

7G显存,训练你自己的DeepSeek-R1

Key Takeaway

  • Unsloth框架显著降低了微调大模型的门槛,仅需7G显存即可微调1.5B模型,消费级PC也能实现。
  • DeepSeek的GRPO强化学习算法能提升模型推理能力和可解释性。
  • 微调技术可用于打造个人AI分身和私域模型,实现本地化、无需联网的AI交互。
  • 高质量数据集和超参数调整是微调成功的关键,但需要大量实践。
  • 文章强调了本地部署小尺寸模型在移动端的潜力和价值。

Full Content

用DeepSeek的方法做微调,可以显著提升传统模型的思考能力。

这是我训练好的模型文件,已经传到Hugging Face上了,大家自取。它是基于Qwen2.5 3B,通过微调加强了数学能力,最后生成了Q4、Q5和Q8三个版本。咱们来对比一下Q4精度的效果。我问一个经典问题:

9.9和9.11这两个数字,哪个更大?

先来看原版的回答。不仅答案错了,而且给的理由也是完全混乱的——什么叫“小数部分相同,唯一的区别在于十分位”,简直胡说八道嘛。

再来看微调版本。这就正常了。整数部分一样,那就比较小数部分。很自然就得出9.9比9.11更大。

这套东西不是我搞出来的,而是Unsloth的成果。他们前些天发了一篇博客,介绍了方法,还给出了代码。简单来说,Unsloth这套东西实现了两点:

第一,微调门槛下降。像1.5B之类的小尺寸模型,只需要7G显存就可以微调。而7B、14B这种,15G显存就OK。也就是说,用消费级的PC就能微调。如果是用云端的算力,像我用Google Colab的T4 GPU,花了一个小时就顺利完成。

第二,模型能力提升。GRPO是一种强化学习算法,是DeepSeek发明并开源出来的。用这套算法和数据集,能够训练出具备更强推理能力和更好可解释性的模型。现在Unsloth把它应用到微调里边,想象空间一下就出来了。举个例子:

私域模型。

一个商业博主,有自己的方法论,也有很多交付案例。他把过往积累下来的东西整理成数据集,包含问题、答案以及解题步骤。然后用Unsloth这套东西去微调,生成3B的模型。最后,把模型文件给到他的用户,不管是免费还是收费都可以。

用户拿到之后,用我上上期介绍的方法在手机上使用。这意味着,用户可以随时随地、不需要联网地跟这位博主的AI分身交流。

对自媒体来说,以前只有在你发视频、发文章的时候,或者你在群里说话的时候,你的粉丝、用户才能接收到你的信息。现在,有了这个方法,他们可以无限制地被你这个IP影响。

之前我分享手机上跑模型的方法,一堆人喷我说没意义、没价值。说句扎心的话:眼界太浅,活该挣不着钱。

哈喽大家好,欢迎来到我的频道。谦虚地说啊,我是国内少数几个能把关于AI的Why和How讲明白的博主。我提供的东西比教程更值钱。记得点一波关注。如果想链接我,就来newtype社群。已经有800多位小伙伴付费加入啦!

回到今天的主题:用强化学习算法,微调模型。

在介绍Unsloth的工具之前,我还是得先把基本概念用一种通俗易懂的方式讲给你们听。可能不是很严谨,但是包懂。

以前搞强化学习,需要准备大量包含解题步骤的高质量数据,以及非常精确、绝对的奖励函数。然后大力出奇迹,硬生生把模型给培训出来。

后来DeepSeek发现,其实不需要那么高的成本,搞得那么费劲——可以把奖励函数弄得更灵活一些嘛。针对每一个问题,它让模型生成一组答案。然后看这一组答案里边,哪个答案相对好一些,从而给出奖励。

传统方法,比较像我们以前在学校里接受的填鸭式教学,靠着记忆力去刷题,想要蒙混过关。但是,这种搞法,知其然而不知其所以然,所以最后还是个渣渣。而DeepSeek的方法则是反复思考解题步骤,最后不仅知其然而且还知其所以然。于是,模型“顿悟”了,学霸诞生了。

如果还是不太明白,那我再打个比方。传统方法训狗,需要明确定义每个动作,并且给每个动作都设计奖励。只有当狗完全按照指令完成动作时,才能获得奖励。

而DeepSeek的方法是,一个动作让狗做三次。在三次当中,相对较好的那一次获得奖励。然后不断重复这个过程。

大家如果有养狗经历就知道,用DeepSeek的这种训练方法,主人轻松,狗子开心,效果也好。

DeepSeek很大方地分享出来之后,Unsloth就拿来用了。不过在使用之前,有一些限制需要跟大家说清楚:

你拿来微调的模型不能太小了,至少也得有1.5B,不然没法正确生成思考标记。这是我选择用3B尺寸的原因,既符合训练的要求,也能在手机上运行。另外,步数至少要300步,奖励才会真正增加。为了达到良好的效果,建议至少训练12个小时。

在官方给的示例当中,用的数据集是GSM8K。它包含了8500个高质量的小学数学文字题。每个问题需要2到8个步骤才能解决。而且,这个数据集里的解题方法是用自然语言编写,而非纯粹的数学表达式。所以,用它来训练,能够提升模型的多步骤数学推理。

类似GSM8K的数据集还有好几个,比如MATH Dataset、MathQA等等。我建议大家先别着急就导入自己的数据集,可以拿这些练练手。因为,换了数据集之后,由于格式不同、特点不同,奖励函数可能需要做相应的调整。

另外,超参数的调整也需要大量实践。比如:

学习率,用来控制模型学习的速度。设得太高,模型可能学得太快,错过最优解;设得太低,模型可能学得太慢,浪费时间。

Batch size,指的是每次喂给模型的数据量。设得太大,可能会导致内存不足;设得太小,可能导致模型学习不稳定。

微调和RAG一样,都是看起来简单,但真要获得好的效果,需要大量调试。而且这东西没法教,只能“干中学”。但是,有门槛是好事。只要跨过去了,就能甩开一大堆人。

所以,我在Google Colab上买了一些计算单元,这段时间会做各种测试。至于数据集,我突然想到,过去一年我在星球里回答了好多好多问题。这些问题都可以做转换,比如让模型帮我批量处理,然后放进数据集里。

通过微调打造AI分身、训练私域模型的想法,在我去年做Llamafile那期视频的时候就出现了。现在可能性越来越大了。等有进展了,我会在社群里说。

OK,以上就是本期内容。想了解AI,来我们newtype社群。那咱们下期见!

微调Llama 3.1,用神器Unsloth

Key Takeaway

  • Meta开源Llama 3.1具有里程碑意义,其性能达到GPT-4o水平,可通过知识蒸馏和微调适应特定任务和领域。
  • 微调(Fine-tuning)是将通用大模型(如大学毕业生)训练成掌握特定技能(如公司培训)的过程。
  • LoRa和QLoRa是微调技术,它们通过在模型上添加“便签纸”而非重写整个模型来高效地进行修改。
  • 数据集是微调的“培训教材”,Alpaca数据集有助于训练高质量的指令跟随型AI助手。
  • SFTTrainer是简化微调过程的训练工具,相当于培训老师。
  • 过度拟合是指模型“死读书”,失去举一反三的能力,需要通过lora dropout等参数设置来避免。
  • 大模型微调的关键在于“教材的质量”(数据集)和“教学的质量”(参数设置)。
  • Unsloth框架是微调加速神器,能显著减少显存占用和训练时间,方便新手使用。
  • 微调后的模型可以导出为adapter(技能模块)或GGUF文件,并上传到Hugging Face等平台。

Full Content

Meta开源Llama 3.1是一件功德无量的事。

因为最好的闭源模型代表着天花板,那是人类可以达到的能力上限。而最好的开源代表着全民福利,那是所有人都可以接触到的基准,是科技平权价值观的展现。

这一次,开源的Llama 3.1在性能上达到GPT-4o水平。我们可以通过知识蒸馏,用最大最强的405B模型去打造小模型;也可以通过微调,让8B的模型去适应特定的任务和领域。

之前国内有些人说,开源模型是智商税,开源模型会越来越落后。这种人,不是蠢就是坏,跳梁小丑罢了。

OK不跑题,咱们今天来聊一下微调。之前一直没碰这个领域是因为,我感觉条件还没到。现在模型够强了,工具也成熟了。我试了一下,比预想中的容易多了——你看,上周我在newtype社群里发了消息,说要用Unsloth微调Llama 3.1,结果下午就成功了。

整个过程我都是在Google Colab上跑的,用的是免费的T4 GPU。数据集不大,训练花了11分半。生成q4、q5和q8三个GGUF文件比较慢,我等了应该有半个多小时。最后,这些GGUF文件都自动上传到我的Hugging Face账号上。

之所以会这么快速和顺利,主要是因为我用的是Unsloth框架。这个框架真的是微调加速神器。用了它之后,显存占用更少,训练时间也显著缩短。我强烈建议大家试试。

为了方便像我这样的新手使用,Unsloth提供了模型和代码。我就是在他们给的基础上做了一点修改。

虽然整个过程需要自己动手的地方不多,但微调相关的知识还是得理解的,因为里边的门道很深。我先用大白话分享一些我认为比较关键的点,然后再带大家过一遍代码,不然看得一头雾水也没用。

第一,什么叫微调?

厂商把大模型训练出来,就好比大学生顺利毕业,具备一定的通用技能。但是要入职、要上岗,还得接受公司的培训。这种公司培训就是微调,让大模型这个新人快速掌握一些特定的技能。

第二,lora和qlora是什么?

如果把大模型比作一本百科全书的话,我们做微调,并不是要把书重新写一遍,而是在一些页面上贴上便签纸,上边写上一些额外的信息就可以了。LoRa就是这样的便签纸。而QLoRa更进一步,它这个便签纸可以在更小的纸片上写更多字。

第三,数据集是什么?

前边说了,大模型要接受“上岗培训”。那么,数据集就是培训教材。你可以用自己的数据做成数据集的格式,也可以用公开的。其中,在公开数据集方面,为了让大模型能更好理解人类指令,并且做出恰当回应,斯坦福大学的研究人员创建了Alpaca数据集。有了它,我们就能用相对较少的资源训练出高质量的指令跟随型AI助手。

第四,SFTTrainer是什么?

对我们使用者来说,SFTTrainer就是训练工具。它简化了微调过程,而且提供很多设置和优化选项,特别好用。对大模型来说,SFTTrainer就好比培训班的老师。它接收大模型这些学生,拿到数据集作为教材,然后开始教大模型如何更好地去执行特定的任务。

第五,过度拟合是什么?

我们都遇到过,那些读书读过头的人,考试很厉害,但是遇到教材里没教的问题就不会了。同样,大模型也存在这种可能性,只会应对见过的情况,而失去了举一反三的能力。这种“死读书”的结果,就叫过度拟合。

所以,根据这五个知识点,我们就能得出,大模型微调有两个关键:

第一,教材的质量。数据集不行,那再怎么训练也不行。

第二,教学的质量。怎么用有限的资源把大模型教得恰到好处,这里边涉及到很多参数的设置,就很有门道了。

接下来,我给大家看看我上周第一次微调用的代码。不要有畏难情绪,这个就是一个熟悉的过程。多经历几次之后,再看这些代码就很亲切了。它其实很简单,待会儿看完你就知道,最核心的设置就是“教学设置”和“教材设置”。

在最开始,肯定是把需要的Package都安装和加载。

接着,加载Unsloth已经预处理好的模型。主流的模型都有,包括Mistral、Gemma等等。我的目标是Llama 3.1,所以在模型名称这边就填Llama 3.1。Unsloth的Hugging Face主页有更多模型,包括qwen之类的,大家可以去看一眼。

这个设置当中,有一个参数叫max seq length。它的意思是,模型一次可以处理的最大token的数量。不同模型有不同的默认值,从512、1024、2048,甚至更多。可以简单理解为,大模型阅读教材的话,一次能看多少个字的内容。

这一步完成之后,紧接着是参数配置。其中,target modules指的是,我们打算具体修改模型的哪个部分。把大模型比做一个机器人的话,这个机器人已经会一些基本运动了。这时候,我们要教它跳舞,那就针对它腿部的动作模块做修改,而不需要改动整个机器人。这个设置好了,就能让整个微调过程更有针对性,也更加高效。

另外,还有两个重要的参数:

lora alpha这个值设得越大,lora的影响越显著。也就是说,咱们可以通过这个设定来对模型原始性能和新技能做平衡。

lora dropout指的是,在训练过程中,会随机关闭一定比例的神经元。这就好比是,你在练习钢琴的过程中,有的时候会闭着眼睛弹。这样就强迫你自由发挥,避免“死读书”或者说过度拟合的结果出现。

模型都配置完了,接下来要配置数据集了。我的目标是强化Llama 3.1的Python能力,所以给它配的教材是python code instructions。这个数据集的内容格式包括三列: