一文读懂「LoRA」:大型语言模型的低秩适应

前言

LoRA(Low-Rank Adaptation of Large Language Models)作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA微调后的效果不行,就可以转而修改优化器或模块了。而调整参数一步是工作量最大的,而且大模型的参数都是以亿为计数单位的,所以人工硬调参数变得不太可能,而LoRA就为这个提供了解决方法!

LoRA通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调。这种方法不仅减少了计算需求,而且使得训练资源比直接训练原始模型要小得多,因此非常适合在资源有限的环境中使用。

主流的微调方式

目前主流的低成本微调大模型方法包括2019年 Houlsby N 等人提出的 Adapter Tuning,2021年微软提出的 LORA,斯坦福提出的 Prefix-Tuning,谷歌提出的 Prompt Tuning,2022年清华提出的 P-tuning v2。

LORA 的效果会好于其它几种方法。其它方法都有各自的一些问题:

  • Adapter Tuning 增加了模型层数,引入了额外的推理延迟

  • Prefix-Tuning 难于训练,且预留给 Prompt 的序列挤占了下游任务的输入序列空间,影响模型性能

  • P-tuning v2 很容易导致旧知识遗忘,微调之后的模型,在之前的问题上表现明显变差

下面给大家分享一份2025最新版的大模型学习路线,帮助新人小白更系统、更快速的学习大模型! 有需要完整版学习路线,可以微信扫描下方二维码,立即免费领取!

在这里插入图片描述

LoRA的出发点

微调大规模语言模型到特殊领域和任务是自然语言处理的重要课题之一。但随着模型规模的不断扩大,微调模型的所有参数(full fine-tuning)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一个新模型,代价和成本很高。

LoRA的特点

  • 优点:训练和计算成本低、可并行、不引入推理延迟

  • 在每层 transfomer block 旁边引入一个并行低秩的支路,支路的输入是transfomer block 的输入。然后将输出和 transfomer block 的输出相加,在固定主pretrian model参数的情况下,用支路去学习特定任务知识,来完成特定任务。

动机

  • Lora在不改变模型推理结构的条件下,直接调整少量参数。

  • 参数的变化量△W 通常是参数冗余的,使用低秩近似可以很好地表达。

  • 普适性强,可以微调任意模型中的线性层。

图片

算法流程

图片

图片

实验结论

LORA论文实验表明

相比其它微调方法

**
**

  • LORA 相比其它微调方法,增加参数量不会导致性能的下降。

  • 性能上与全参数微调持平甚至超过。

秩的选择

**
**

实验结果显示,对于一般的任务, r=1,2,4,8r=1,2,4,8 就足够了。而一些领域差距比较大的任务可能需要更大的 r

同时,增加 r 值变大并不能提升微调的效果,这可能是因为参数量增加需要更多的语料。

动手实践

目前 LORA 已经被 HuggingFace 集成在了 PEFT(Parameter-Efficient Fine-Tuning) 代码库里。lora 微调需要设置两个参数一个是r,即矩阵秩。 alpha是一个scale参数。

pip install peft

通过使用 get_peft_model 包装基础模型和 PEFT 配置,准备使用 PEFT 方法(例如 LoRA)进行训练的模型。对于 bigscience-mt0-large 模型,仅需要训练 0.19% 的参数!

from transformers import AutoModelForSeq2SeqLMfrom peft import get_peft_config, get_peft_model, LoraConfig, TaskTypemodel_name_or_path = "bigscience/mt0-large"tokenizer_name_or_path = "bigscience/mt0-large"
peft_config = LoraConfig(    task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)model = get_peft_model(model, peft_config)model.print_trainable_parameters()

结果如下:

"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"

可以看到仅仅需要训练0.19%的参数

加载一个PEFT模型用于推理:

from peft import AutoPeftModelForCausalLMfrom transformers import AutoTokenizerimport torch
model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora").to("cuda")tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model.eval()inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])

结果:

"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."

拓展:QLoRA和LoRA的区别

QLoRA和LoRA的性能对比通常取决于多个因素,包括任务类型、数据集、模型架构、硬件环境等。以下是一些可能的性能对比方面:

参数数量和训练效率

**
**

**LoRA:**由于使用了低秩矩阵,LoRA显著减少了需要微调的参数数量,这通常意味着更快的训练速度和更低的内存需求。

**QLoRA:**进一步通过量化减少了参数的大小,因此在相同的硬件上,QLoRA可能会提供更高的训练效率,尤其是在资源受限的环境中。

"参数量化"是指在机器学习和深度学习中,将模型的参数(通常是权重和偏置)从浮点数(如32位浮点数)转换为低精度的表示,比如16位、8位甚至更少的位。这样做的目的主要是为了减少模型的存储需求和计算复杂度,从而提高模型在硬件上的运行效率,尤其是在那些不支持或不擅长处理浮点运算的硬件上。

参数量化可以带来以下好处:

**1、减少模型大小:**量化后的模型占用的存储空间更小,便于在资源受限的设备上部署。

**2、降低计算成本:**量化后的模型在计算时需要的算力更少,可以减少能耗和提高处理速度。

**3、提高硬件兼容性:**在不支持浮点运算的硬件上,量化模型可以更有效地运行。

然而,参数量化也可能带来一些挑战,比如模型精度的下降,因为量化过程可能会导致信息的损失。因此,量化技术需要在模型效率和精度之间找到一个平衡点。

精度和模型性能

**
**

**LoRA:**保持浮点精度,通常能够提供与全模型微调相当或接近的性能,尤其是在参数较少且任务与原始预训练任务相似的情况下。

QLoRA:量化可能会引入一些精度损失,这可能导致模型性能略有下降。然而,这种损失通常很小,特别是在使用4位或更高位量化时。

推理速度和资源消耗

**LoRA:**在推理时,由于参数数量的减少,LoRA可以提高推理速度并减少资源消耗。

**QLoRA:**由于参数量化,QLoRA在推理时可能会更加高效,特别是在不支持浮点运算或浮点运算效率较低的硬件上。

具体性能对比

**在标准硬件上:**LoRA和QLoRA的性能可能非常接近,但QLoRA可能在使用低精度运算的硬件上具有优势。

**在移动或嵌入式设备上:**QLoRA的性能通常优于LoRA,因为它更适合资源受限的环境。

**在特定任务上:**对于某些任务,量化可能对模型性能的影响较小,因此QLoRA可能接近或达到LoRA的性能。

实际应用中的考量

**
**

**训练时间:**QLoRA可能会进一步减少训练时间,尤其是当训练是在CPU或低功耗硬件上进行时。

**模型大小:**QLoRA生成的模型通常更小,这使得它们更适合在存储受限的环境中部署。

**易用性:**LoRA可能更容易实现和部署,因为它不需要处理量化带来的复杂性。 在决定使用QLoRA还是LoRA时,最佳做法是针对特定任务和硬件环境进行实验,以确定哪种方法在保持所需性能的同时提供最佳的资源效率。通常,QLoRA和LoRA都是有效的技术,可以根据具体需求进行选择。

想象一下,你有一个超大的玩具,现在你想改造这个超大的玩具。但是,对整个玩具进行全面的改动会非常昂贵。

①因此,你找到了一种叫 LoRA 的方法:只对玩具中的某些零件进行改动,而不是对整个玩具进行全面改动。

② 而 QLoRA 是 LoRA 的一种改进:如果你手里只有一把生锈的螺丝刀,也能改造你的玩具。

图片

拓展:Flash Attention和 DeepSpeedZeRO

Flash Attention

**
**

Flash Attention将Attention计算并行化,避免了计算过程中Attention Score NxN的显存占用(训练过程中的N都比较大)。

图片

DeepSpeed ZeRO

ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存,除了将训练中间状态切片外,DeepSpeed 训练时使用FP16的权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存。

其并非自动启动需要加 --deepspeed deepspeed zero3

QLoRA后面加上 --deepspeed deepspeed zero2

xtuner train internlm_20b_qlora__oasst1_512_e3  --deepspeed deepspeed zero3

过程中Attention Score NxN的显存占用(训练过程中的N都比较大)。

[外链图片转存中…(img-cTZOrIAL-1749535558596)]

DeepSpeed ZeRO

ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存,除了将训练中间状态切片外,DeepSpeed 训练时使用FP16的权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存。

其并非自动启动需要加 --deepspeed deepspeed zero3

QLoRA后面加上 --deepspeed deepspeed zero2

xtuner train internlm_20b_qlora__oasst1_512_e3  --deepspeed deepspeed zero3

图片

如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》*

1.学习路线图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取
在这里插入图片描述

👉2.大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)

img

👉3.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(篇幅有限,仅展示部分,公众号内领取)

img

👉4.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)

img

大模型面试

**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

**或扫描下方二维码领取 **

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值