vLLM+LoRA=开挂!!!从零基础到实战精通,一篇搞定大模型适配!

部署运行你感兴趣的模型镜像

本文详细介绍了LoRA(低秩适应)微调技术的原理及在vLLM框架中的实现。文章解释了LoRA如何通过低秩矩阵分解实现高效模型微调,减少计算资源需求,并阐述了vLLM中LoRA的加载、权重管理和推理过程,包括动态注入LoRA adapter的技术实现。这种技术让开发者无需修改原始模型,就能用少量额外参数让模型适应新任务。


这个季度做了一些关于 LoRA 的工作,写一篇文档记录一下,不足与错误的地方请大佬们多指点。

LoRA(Low Rank Adaptation),一种基于低秩的微调优化方法。

01

LoRA 原理

首先我们需要理解,什么是模型的微调?

本质上是当我们发现一个模型在某一方面的能力不够时通过微调的方法把这个模型更新,模型的参数都是由矩阵构成的,一般的 llm 都是由上亿的参数构成,本例中以 3×3 矩阵代替。

如上图所示,很明显,微调就是把矩阵 A 的形态,变成矩阵 B 的形态。

延伸到 a+b=c 这个公式中,其中 b 这个改动的量,也就是微调的这个矩阵。对 b 这个矩阵的学习更新,则是全量微调。

目前针对 LLM 数十亿起步的参数,许多工作已经表明,深度学习的矩阵往往过参数化(overparametrized),特征的内在维度(intrinsic dimension)指的是在深度学习中的真实或潜在的低维结构或信息的维度。

这个内在维度指的是我们解决这个问题实际上需要的参数空间的维度,我们对模型的微调通常调整的也是这些低秩的内在维度。

也就是说我们对模型进行微调时候,是可以通过提出秩,来压缩参数空间的。

那么这时候,就需要用到最常见的一种技术 LoRA,下面以图例方式看一下 LoRA 的核心思想:

02

vLLM 框架 LoRA 逻辑

(1)LoRA Layer 替换处理

上文已经基本理清了 LoRA 的原理,那么接下来我们学习下在 vLLM 中,LoRA 是如何加载并且做推理的?

首先在加载 model 阶段,把原始的 Linear/ColumnParallelLinear/RowParallelLinear 换成对应的带 LoRA 功能的类,并且为每一层 LoRA 做初始化,分配显存 buffer。

让模型结构具备支持 LoRA 的能力,并开好存储空间。

先从 load_model 为入口,以下是一个主要调用流程:

self.model_runner.load_model()

可以看到在加载模型阶段,会调用 **create_lora_manager()**方法,创建一个 LoRA adapter,并将其作用于模型,返回挂载 LoRA 后的模型。

而如何更改的这个模型结构,则是通过 LoRAModelManager 这个类实现的,这个类主要管理了 activate_adapter()、_create_lora_modules() 等方法。

具体如何将 base linear 更改成了带 LoRA 的 linear 呢,主要通过 _create_lora_modules() 方法实现的。

def from_layer(layer: nn.Module,

lora_cls 为具体的 LoRA linear 层的某个类, 遍历 _all_lora_classes 中注册的所有 **LoRA 包装层类,**然后调用 can_replace_layer 方法,返回一个 bool 类型值,确认是否进行符合替换条件。

然后通过调用 create_lora_weights() 方法,进行 LoRA 权重的初始化,给权重开出具体的 buffer, 提前准备好显存空间,方便后续动态加载多个 LoRA adapter。

以下代码则是一个基类,上述提到的一些带 lora 的 linear 类,都是继承并重写了这个基类的方法,完成了一些权重加载等操作:

classBaseLayerWithLoRA(nn.Module):

以上是在 load_model 阶段的时候做的事情,这时候我们可以看到已经把 nn.module 中的一些 linear 层替换成了带 LoRA 的 linear 层。

并且已经将 LoRA adpter 挂载到了 model 上,后续 dummy_run 或者是真正推理的时候,都会跑到对应的带 LoRA 的 linear 类中。

而对 LoRA 权重的处理我们可以看到只是为 LoRA 权重预分配了内存空间(即分配了对应形状的零张量),并没有对 LoRA 权重做任何实际的赋值和加载,也是为了后续动态配置 LoRA 权重准备

真实的 LoRA 权重会在之后的加载步骤(activate_adapter)中被读取、切分(如果有分片)并写入这块预分配的空间。

(2)LoRA 权重加载和切分

在这部分过程中,我们结合 worker_busy_loop()(也就是一个 worker 持续读取输入、进行推理、写入输出)的过程来看在 LoRA 部分如何对权重做的处理。

从 dummy_run 阶段去看,dummy_run 是只走一遍模型 forward 的初始化:

classLoRAModelRunnerMixin:

在 maybe_select_dummy_loras 函数中主要模拟 prompt → LoRA 的映射,模拟 token → LoRA 映射例如:

prompt_lora_mapping = [1, 2]         # 第一个 prompt 用 LoRA ID 1,第二个用 LoRA ID 2

并且构造出一个临时的 LoRA adapter 请求列表,例如:

{

临时数据构造完成后调用 LoRA 管理器,激活这些 dummy adapter。

把传进来的 LoRA 请求prompt、token 映射表注册到 lora_manager,让模型在 forward 时按这些映射使用对应的 LoRA adapter

加载并激活 adapter 权重到模型模块里并且记录每个 prompt 和 token 使用哪个 adapter 的映射表。

最后对适配器的激活,其实也是通过 LoRAModelManager 这个类去管理的,调用 module.set_lora(),把这些权重写入到该 module 内部的 buffer 中

index 则是选用哪个 lora 适配器,lora 的 id 是全局唯一的,所以他的索引全局也只有唯一一个:

classLoRAModelManager(AdapterModelManager):

(3)LoRA 适配器服务中加载

这部分背景是当我们已经启动了在线服务的情况下,还想在请求阶段挂载一个新的 LoRA 适配器:

可以看到是在 model_runner 阶段可以添加 lora 适配器:

classWorker(WorkerBase):

返回的是 lora_manager 实例下的 add_adapter 方法。

defadd_lora(self, lora_request: LoRARequest) -> bool:

这部分代码可以看到将 lora 的适配器做了 load,注册之后。又调用了上面提到的 activate_adapter() 函数,对 lora 适配器进行加载激活,也就是加载他的权重信息。(上文已经提到具体加载的细节)

classLRUCacheWorkerLoRAManager(WorkerLoRAManager):

(4)执行 model

前面已经完成了 nn.module 的替换和 weight 的加载分配,还是从 worker_busy_loop 函数入口,在 def _dummy_run 的时候,加载完权重会执行推理,主要实现如下:

classGPUModelRunner(LoRAModelRunnerMixin):

由于在 nn.mudule 部分已经对网络的结构做了 lora 的替换,所以在走到具体 model forward 中时,则会调到对应的带 lora 的 linear 层中。

classQwen2Attention(nn.Module):

此例中则会调用 RowParallelLinearWithLoRA 类中的 forward:

defapply(self,

深入 add_shrink 这个函数去看可以发现已经调用到了底层算子,也就是前面提到的降维和升维矩阵那部分,底层算子由 triton 生成:

    _lora_shrink_kernel[grid](

至此 vLLM LoRA 推理已经全部完成,可以很明显的看到,vLLM 会通过动态注入方式,将 LoRA adapter 挂载到模型模块上。

通俗解释就是 LoRA 是一种给大模型“加外挂”的方法,让我们在不修改原始模型的情况下,用极少的额外参数就能让模型学会新任务。

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

优快云粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈

(👆👆👆安全链接,放心点击)

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。
在这里插入图片描述

在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型实战项目&项目源码👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战项目来学习。(全套教程文末领取哈)
在这里插入图片描述

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

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
在这里插入图片描述

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

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
在这里插入图片描述

为什么分享这些资料?

只要你是真心想学AI大模型,我这份资料就可以无偿分享给你学习,我国在这方面的相关人才比较紧缺,大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!

这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

优快云粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈

(👆👆👆安全链接,放心点击)

您可能感兴趣的与本文相关的镜像

Vllm-v0.11.0

Vllm-v0.11.0

Vllm

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务,可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「PagedAttention」,有效地管理注意力键和值

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值