微调
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。这个数据集的内容格式包括三列:
#Flux #Lora #微调 #图像生成 #本地部署 #ComfyUI
Key Takeaway
- Fluxgym是一个简单易用的本地微调Flux LoRA工具,支持12G-24G显存GPU,能以假乱真地生成虚拟模特。
- LoRA(Low-Rank Adaptation)是一种微调技术,通过添加“便签纸”式技能包,让大模型适应特定任务和风格。
- Fluxgym结合了AI-toolkit的前端和Kohya Sripts的后端,提供直观的用户界面和丰富的进阶调整选项。
- 文章详细介绍了Fluxgym的手动安装步骤,并强调了训练素材质量和模型选择对LoRA效果的影响。
- 尽管云端微调速度快,但本地微调在拥有闲置算力或需大量训练时更具优势,且成本低廉。
Full Content
只需要12G显存,你就可以在自己的电脑上微调Flux LoRA,打造完全可以以假乱真的虚拟模特。
Fluxgym这个项目支持从12G显存到24G显存的GPU,对配置的要求挺宽容的。操作起来非常简单,就三步:
根据你的需求填写参数、设定触发关键词,然后上传训练用的素材图片,最后点击开始,等着就可以了。
LoRA训练好之后,把它放到ComfyUI对应的文件夹里边,在工作流里加一个LoRA节点就可以使用了。是不是超级简单?
Fluxgym前端fork了AI- toolkit这个项目,所以才会这么直观、好用。而它后端用的是Kohya Sripts这个项目,可以做非常多进阶的调整。如果你懂的话,点开Advanced Tab就会看到一大堆选项。
这就是我为什么说Fluxgym是微调LoRA最简单也是最好的方法。
哈喽大家好,欢迎来到我的频道。谦虚地说,我是国内少数几个能把关于AI的Why和How讲明白的博主。记得点一波关注,只要有一个视频你看进去了,就赚大了。如果想链接我,就来newtype社群。已经有500多位小伙伴付费加入啦!
回到今天的主题:Fluxgym。
我在上上上期视频介绍过微调Flux LoRA的基本概念和方法。在视频中,当时我用的是部署在云端的项目。在H100的帮助下,只花20分钟就把LoRA训练出来。成本大概是两三美元。
说真的,我觉得这个价格其实很OK了。不过,如果你有闲置的本地算力的话,不用白不用,以及要训练的数量比较大的话,可以使用我今天要介绍的方法。
Fluxgym的安装有三种方式。你可以一键安装,可以通过Docker安装,也可以完全手动安装。我这边演示一下手动安装。其实超级简单,就无脑按照官方流程操作就好。
第一步,把项目下载到本地。记得要用cd命令进入Fluxgym文件夹,把sd-scripts也下载下来。
第二步,在根目录下,创建环境,并且启动。
第三步,下载、安装需要的各种依赖。大家注意,这里其实有两个部分:一是进入sd-scripts文件夹,通过pip install、按照requirements这个txt安装;二是返回上一级目录,同样通过pip install安装。
第四步也是最后一步,安装Pytorch。
我在家里和公司的PC上都安装了Fluxgym,没遇到任何问题。大家如果安装过程中遇到什么报错,记住:别问我,问ChatGPT——这一定是最有效的方法。你问我,我要么问GPT,要么Google一下,看看别人是怎么解决的。你有问我的功夫,还不如直接上手呢,对吧?
要启动Fluxgym,记得是在环境启动的状态下,在根目录下边执行这行命令。这时我们打开这个本地链接,就能看到UI了。
作为演示,在参数配置这边,我不做任何调整,就用默认参数。
在模型选择上,Fluxgym提供了三个模型:dev、schnell,以及一个他们微调后的dev模型。我这边就用官方的dev模型。
在训练素材方面,我还是用上次的图片,这样咱们一会儿可以对比不同项目训练出来的LoRA的效果。
都配置完毕后,咱们点击开始。
第一次使用,Fluxgym会下载模型文件,包括unet、clip、vae,一共有四个文件,加起来得有30G。如果你之前已经下载过了,那就把文件拷过来,放到对应的文件夹里。
整个训练过程咱们等着就好。我演示用的是公司的PC,4090显卡,64G内存,i9的CPU。即使是这种消费级的顶配,我都能明显感觉到,放在脚边的机箱发热多了非常多。
等训练完成,可以看到,这次一共花了70分钟。具体需要花多久,除了看配置,也取决于你前边的配置,比如你的步数需求。
把这个LoRA文件拷到ComfyUI的LoRA文件夹里,就可以在工作流里使用了。咱们来做个测试,提示词很简单。从生成结果来看,这个微调挺成功的,跟素材图片基本一致。
作为对比,咱们再来看看之前我在云端用AI-Toolkit训练的LoRA。还是同样的提示词。这次生成结果和刚才的基本一样。
前边我提到,Fluxgym默认支持三个模型,其中一个是微调后的。他们建议,最好是用这个微调后的模型来训练。原因在于:
dev模型是从pro模型蒸馏过来的。在蒸馏的过程中,某些能力或输入条件被削弱或去掉了。比如,可能会有一些美学嵌入条件在简化过程中被限制,或者模型在训练过程中只使用了更小的数据集。这就导致用dev模型训练LoRA,效果有可能不太好。
为了把丢失的能力补回来,开发者使用大规模、高质量的数据对dev进行微调。这样一来,用这个定制版的dev模型再去微调,就能避免模型崩溃或输出质量下降的情况。大家使用的时候,我建议还是优先用它。
通过LoRA,咱们可以达到直接生成指定外观的人物或者物品的目的。我知道肯定会有人说,不用LoRA也可以。确实,比如你用PuLID,让模型根据参考图,也可以生成指定长相的人物。
但是,这是有限制的。比如,生成人物的朝向会受到参考图像的限制。还有,你经常会发现,一张图作为参考不够,还得多加几张。然后还需要对图像做个裁切,把脸的位置给单独拎出来。
所以,在我看来,图生图或者换脸都只是权宜之计。如果你要长期、稳定生成虚拟模特或者物品的话,还是搞个LoRA吧。训练成本和使用成本都很低,挺划算的。
OK,以上就是本期内容。想进一步交流AI就来newtype社群。那咱们下期见!