微信扫码
与创始人交个朋友
我要投稿
在人工智能领域,大型语言模型(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则拥有最高的训练吞吐量。在泛化任务中,LoRA和QLoRA往往取得了与全参数微调媲美的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。下面的文章是关于所有开源模型本地部署的技术,也介绍了很好的应用,阅读这个指南会节省你很多时间。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19