社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

还不会本地网页上微调Llama3?用Docker一键部署咱国产的LLAMAFACTORY试试

AI修猫Prompt • 1 年前 • 348 次点击  

点击上方蓝字关注我

人工智能领域,大型语言模型(LLM)微调(Fine-Tuning)是当下最热门的话题之一。这些模型拥有惊人的语言理解和生成能力但要微调和部署它们以适应特定任务往往需要大量计算资源和专业知识,代码调试还得有深厚的技术功底。

图片来自DALL.E

幸运的是北航的五位和北大的一位技术专家发布了一篇论文,一个名为LLAMAFACTORY的新框架走入大家视野它极大地简化了LLM微调的过程让任何人都能一键式地调整这些强大模型的性能。作者发文时还是13,000star,不到一个月已经17,000了,这足以说明大家对大语言模型的可视化微调的需求正在飞速增长。

题目:LlamaFactory:100多种语言模型的统一高效微调

网址:https://arxiv.org/pdf/2403.13372.pdf

Llama 3 部署到本地之后很多读者问我微调的方法,今天带大家在Docker一键部署这个默默支持了国内很多模型背后的框架。

这样理解微调,把原来没有数据集放进大模型,你把它整合进去,部署一下环境,改改参数,机器自己跑就是了,就和把大象放进冰箱一样简单

打开冰箱门,

把大象放进去,

关门。

什么是LLAMAFACTORY

WHAT

PART 01

LLAMAFACTORY是一个统一的高效微调框架,集成了许多尖端的效率优化技术。它允许用户无需编码,就可以灵活定制100多种LLM的微调过程,包括热门模型如LLaMA、GPT等。该框架提供了一个名为LLAMABOARD的基于网络的用户界面,使整个微调流程变得前所未有的简单。Docker内部署完成后在本地运行就是下面的这个样子,支持本地加载模型和数据集。


LLM微调过程中精度和GPU显存之间的矛盾是一个长期困扰开发者的痛点。

大型语言模型通常由数十亿甚至上百亿参数组成,每个参数占据32位(4字节)的浮点数内存。当需要在GPU上微调这些模型时,庞大的参数量轻而易举就会超出现有GPU显存的上限,从而限制了模型性能的发挥。

为了在有限显存下实现高精度微调,开发者不得不在参数精度和模型性能之间作出权衡。一种常见做法是使用16位浮点数(FP16)或更低比特位的定点数(INT8)来存储参数和激活,从而牺牲一定精度以换取更大的显存空间。然而,这种简单的低精度量化方案也存在其局限性,很容易导致模型性能的严重下降。

此外,除了参数本身的存储外,微调算法也需要存储用于反向传播的中间激活值。当输入序列较长时,激活缓存往往占用了大量宝贵显存,成为另一个瓶颈。

正是由于上述困难,近年来出现了诸如LoRA、LoRA+、DoRA、GaLore等一系列高效优化技术,它们在不降低精度或只微小牺牲精度的情况下,极大缓解了显存占用压力,为LLM微调开辟了新的可能性。

LLAMAFACTORY框架很好地将这些技术统一集成使得开发者无需深入了解算法细节,便可以自如调用和配置不同的优化策略。同时该框架还支持多种训练加速手段如分布式数据并行、张量并行等,进一步扩大了LLM微调的计算能力边界。

高效微调

Efficiant Fine-Tuning

PART 02

微调大型语言模型需要付出巨大的计算代价,因此高效微调技术应运而生。这些技术可分为两大类:优化型和计算型。

优化型技术:

冻结微调(Freeze-tuning)是一种常见的高效微调方法,它将大部分参数固定不变,只微调解码器的少数几层。这种方式可以大幅降低训练成本,但也可能导致模型性能下降。

梯度低秩投影(GaLore)的做法是将梯度投影到一个低维空间,从而达到全参数学习的效果,但内存使用量大幅降低。这种方法在大模型上表现较好,因为大模型往往存在较多冗余,投影后损失不大。

低秩适配(LoRA)是一种非常高效的微调方法,它不会改变预训练模型的原始权重参数。相反,LoRA在需要微调的层上引入了一对小的可训练矩阵,称为低秩矩阵。在前向过程中,模型会对原始权重张量和LoRA低秩矩阵进行相乘运算,得到改变后的权重用于计算。而在反向传播时,只需要计算和更新这对小矩阵的梯度。

这种做法的优势是,可以在不存储新权重的情况下实现模型的微调,从而极大节省内存。对于大型语言模型,权重参数往往占用大部分显存,LoRA能让训练过程只需少量额外显存即可进行。

当结合量化(Quantization)技术时,LoRA的内存优势就更加明显了。量化是将原本占用较多字节的float32/float16类型权重压缩为int8/int4等低比特类型表示,从而降低存储需求。量化后的QLoRA(Quantized LoRA)能将参数内存占用从每个参数18字节降至仅0.6字节,是一种极高效的微调方案。

实验表明,LoRA和QLoRA在较小模型上的效果最为出众,能以最小的内存overhead获得与全量精调相当的性能。其中当结合量化技术时(QLoRA),内存占用会进一步降低。

另一种被称为分解权重低秩适配(DoRA)的方法,在LoRA的基础上进行了改进。DoRA将预训练权重矩阵分解为量级分量和方向分量两部分。它只对方向分量部分应用LoRA,而量级分量保持不变。

这样做的可能性是,预训练权重中的方向分量可能包含了更多任务相关的知识,而量级分量则更多地控制输出的数值范围。因此,只对方向部分进行低秩微调,可能会获得更好的效果。

DoRA相比LoRA的优势在于,使用相同内存开销时,往往能取得更高的性能。但它也增加了计算量,需要预先对权重进行分解。因此在不同场景下,LoRA和DoRA都有可能是更优选择。

LoRA、QLoRA和DoRA等优化型方法极大降低了LLM微调的内存需求,是高效微调中不可或缺的重要技术。LLAMAFACTORY框架对这些技术进行了很好的统一实现,大大简化了用户的使用流程。

LLAMAFACTORY采用了模块化设计,可以灵活插入和切换上述各种优化技术。用户无需coding,只需在LLAMABOARD界面上勾选所需方法即可。

计算型技术: 

混合精度训练和激活重计算是最常见的两种节省计算量的方法。前者使用低精度(如FP16)来存储激活值和权重;后者则通过重新计算激活值来节省存储,从而降低内存占用。

闪电注意力(Flash Attention)是一种对注意力层进行优化的新算法,它以硬件友好的方式重新安排计算过程,大幅提高性能。S2注意力(S2 Attention)则致力于解决长文本注意力计算时的内存开销问题。

此外,各种量化技术如LLM.int8和QLoRA,能将权重和激活值压缩至低精度表示,从而节省大量内存。不过量化模型只能使用基于适配器的微调方法(如LoRA)。

Unsloth则是针对LoRA层的反向传播进行了优化,降低了梯度计算所需的浮点运算数,加速了LoRA训练过程。

LLAMAFACTORY将上述技术进行了整合,自动识别模型结构来决定启用哪些优化手段。用户无需关心技术细节,只需选择期望的内存占用和性能要求即可。同时,LLAMAFACTORY还支持分布式训练加速等功能。但分布式训练要在CLI上进行。国内很多大模型都是用这个技术微调的,这些数据来自作者的Github的README文档:

  • StarWhisper:天文大模型 StarWhisper,基于 ChatGLM2-6B 和 Qwen-14B 在天文数据上微调而得。

  • DISC-LawLLM:中文法律领域大模型 DISC-LawLLM,基于 Baichuan-13B 微调而得,具有法律推理和知识检索能力。

  • Sunsimiao:孙思邈中文医疗大模型 Sumsimiao,基于 Baichuan-7B 和 ChatGLM-6B 在中文医疗数据上微调而得。

  • CareGPT:医疗大模型项目 CareGPT,基于 LLaMA2-7B 和 Baichuan-13B 在中文医疗数据上微调而得。

  • MachineMindset:MBTI性格大模型项目,根据数据集与训练方式让任意LLM 拥有 16 个不同的性格类型。

  • CBT-LLM:一个基于认知行为治疗的心理健康问题分类的中文大语言模型。

如果你也想尽快推出自己的大模型,这个框架肯定是你学习成本最小的方式。

LLAMAFACTORY架构

Technology

PART 03

LLAMAFACTORY由三大核心模块组成:模型装载器(Model Loader)、数据处理器(Data Worker)和训练器(Trainer)。

模型装载器支持100多种LLM架构,可自动识别层类型并附加适配器(如LoRA和DoRA)。数据处理器则统一了50多种数据集格式,支持远程读取、本地读取、流式读取等灵活方式。作者把所有大家的痛点都想到了,大模型微调完之后,马上测试,不折腾,太方便了。它还内置了众多聊天模板,有助于指令跟随能力的培养。

训练器则统一了高效微调方法的实现,支持生成式预训练、监督微调(SFT)、人类反馈强化学习(RLHF)和直接偏好优化(DPO)等多种训练范式。更有趣的是,LLAMAFACTORY引入了模型共享RLHF,只需一个预训练模型即可完成整个RLHF训练流程,大幅降低了对硬件资源的要求。

LLAMAFACTORY的可扩展性使其能与DeepSpeed等分布式训练库无缝集成,支持模型并行和数据并行等加速策略。

评估结果 

我们在语言建模和文本生成任务上评估了LLAMAFACTORY,结果证明了其高效性和有效性。 

效率测试表明,使用QLoRA技术可将内存占用降至最低,而LoRA则拥有最高的训练吞吐量。在泛化任务中,LoRAQLoRA 往往取得了与全参数微调媲美的ROUGE分数,在某些情况下甚至更胜一筹。部分结果如下所示:

向LLAMAFACTORY的六位科研人员和开发者致敬!他们提供了一个强大而灵活的工具,让大家能以最小的代价微调顶尖的LLM模型。无论您是想训练一个自定义的语言模型,还是将现有模型应用于特定任务,LLAMABOARD界面都使这一过程变得轻而易举。

一键部署LLAMAFACTORY

AI Responsibility

PART 04

有兴趣的读者可以在下面的地址中看到项目,按照Docker一键部署,当然建议你的Docker空间至少超过60G以上,否则是安装不上的。以下是地址https://github.com/hiyouga/LLaMA-Factory

本地加载模型,加载数据集,设置好参数,开始微调




这里是对一些参数的建议:

批次大小(Batch Size): 这个参数需要尽可能地小以减少每次迭代消耗的显存。对于8GB的显存,你可能需要尝试较小的数值,例如4或8,具体取决于你的模型大小和复杂度。

梯度累积步数(Gradient Accumulation Steps): 如果你减小了批次大小,可以通过增加梯度累积步数来保证有效的批次大小。这意味着模型会在多个小批次上累积梯度,然后一起更新。你可以尝试设置为4或更高,以补偿较小的批次大小。

学习率(Learning Rate):这通常是模型训练的超参数之一,需要通过实验来调整。6GB显存对学习率没有直接影响,你可以根据模型和数据集的情况来设定。常见的开始值是1e-3或5e-5。

训练轮数(Epochs): 显存大小不影响训练轮数,但要注意,如果显存不足,模型可能在一个训练轮次中就失败了。确保你的模型在单个训练批次中可以正常运行后,再逐渐增加训练轮数。

半精度训练(Mixed Precision Training): 如果你的模型和训练库支持,使用FP16半精度训练可以显著减少显存使用。在你的截图中,已经设置为fp16,这是正确的。

学习率调度器(Learning Rate Scheduler): 学习率调度器控制学习率如何随着时间变化。cosine 是一种常用的调度器,它会在训练过程中逐渐减小学习率。

请记住,调整这些参数通常需要多次实验。你需要监控训练过程中的显存使用情况,并根据模型的具体情况来调整参数。在实际操作中,可以在Docker的容器内使用诸如nvidia-smi批命令来5秒一次监视显存使用情况。如果训练过程中出现显存溢出错误,你可能需要进一步减小批次大小或梯度累积步数。

本地训练模型最好打开你机器上的性能监视器,监测一下GPU内存,很多模型都会拉满你的GPU。下面的文章是关于所有开源模型本地部署的技术,也介绍了很好的应用,阅读这个指南会节省你很多时间。

本地离线生成式AI文生文全要素提效指南,更安全更经济更高效

您可以按照官方文档一键部署,也可以按照我修改过之后的Dockerfile和docker-compose.yml文件部署,我会告诉你路径设置和你需要的命令,到群里来,我会和你讨论你遇到的问题。另外,如果你有更多关于本地模型的问题也可以到群里来,我会解答你的问题。

References:

https://github.com/hiyouga/LLaMA-Factory

转载请与本喵联系,私自抓取转载将由律师维权

这份指南还包含8500条复杂Prompt,以及管理工具和方法(包含system提示词)


想把方法论转化为复杂提示词?Prompt心法与算法高级指南,帮你从知到行升维实践


关于Prompt,这本手册,是你和我沟通的桥梁

第一性原理下的Prompt,助你跃升为大师的指导手册


🎉让我们一起创造更多美好! 🎉


如果您觉得这篇文章对您有帮助或启发
感谢您为我【点赞】【在看】


👉微信号:xiumaoprompt

加我微信之前,请务必先点赞或在看

这样我才能更快地识别并回应您



点个在看你最好看


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/169310
 
348 次点击