利用多Lora节省大模型部署成本|得物技术
一、背景
近期,我们在大模型集群的部署过程中遇到了一些挑战。公司有多个业务场景,每个场景都基于自身的数据进行微调,训练出相应的大模型并上线。然而,这些场景的调用量并不高,同时大模型的部署成本较为昂贵,这造成了资源的浪费。
本文将介绍我们如何利用多Lora技术,将多个场景合并部署,从而有效解决这一问题。同时,我们也将探讨大模型训练与推理过程中Lora技术的应用。
二、Lora是什么
Lora的概念
如果你去网上搜索"Lora"这个关键字,你一定会搜到下面这篇论文。
这就是Lora这个词出处。这一概念是由著名人工智能研究员Edward J. Hu于2021年提出的。Lora完整名称是低秩自适应(Low-Rank Adaptation)。虽然这个名称比较复杂,但其核心概念却相对容易理解。
以GPT3为例,该模型拥有1750亿个参数。为了使大模型适应特定的业务场景,我们通常需要对其进行微调。如果对大模型进行全参数微调,因其参数数量庞大,成本将非常高。Lora技术的解决方案是,仅对不到2%的参数进行微调,其他参数则保持不变。相较于全参微调GPT-3(175B),Lora最多能够将训练参数的数量减少约10,000倍,GPU内存需求也减少三倍。
那么,Lora是如何冻结参数的呢?接下来,我们将展示Lora的经典原理图。
上图中,W 表示大模型的一个原始参数矩阵。Lora的思路是将矩阵 W 拆分为两个低秩矩阵 A 和 B。在训练过程中,仅对 A 和 B 的参数进行训练,这与训练整个 W 的参数相比,能显著减少所需的训练参数数量,从而降低训练成本。
如何开启大模型的Lora微调
虽然论文中Lora的原理较为复杂,但实际上开启大模型的Lora微调过程相对简单。许多算法框架都支持快速上手微调。以LLaMA-Factory这个微调大模型的框架为例,启用Lora微调只需配置以下参数:
接下来,执行训练命令即可启动Lora微调:llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
通过这个命令,LLaMA-Factory框架将读取配置文件,并开始进行Lora微调。整个过程相对简便,使得用户能够快速适应并利用Lora技术进行大模型微调。
Lora微调完成后,将生成一个只包含部分参数(即Lora参数)的文件,称为Lora Adapter。与整个大模型的所有参数相比,这个参数文件非常小。
三、如何基于Lora部署大模型
Lora参数合并
经过微调后,会生成一个Lora文件,里面仅包含部分参数。如何利用这个Lora文件来部署大模型呢?
我们之前提到,Lora参数实际上是将大模型的其余参数冻结后剩下的部分。Lora参数本身也是大模型参数的一部分,通常占比小于整体的2%。将微调后的Lora参数与大模型的原始参数合并后,就可以生成一个新的微调大模型,之后只需直接部署这个新模型即可。
合并的操作步骤也比较简单,以LLaMA-Factory这个大模型微调训练框架为例。
首先,完成如下配置:
接下来,执行命令
llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml
即可将参数合并成一个新的大模型。
如何部署合并后的大模型
合并后的大模型只有一些参数文件,若要进行部署,还需选择合适的推理引擎。目前推荐使用 VLLM 这个开源推理引擎,它得到了众多大厂模型的广泛支持。无论从性能还是易用性来看,VLLM 都非常出色。
VLLM最初由加州大学伯克利分校的一支三人博士团队发起,创始人开创性地提出了PageAttention这一概念。这一创新显著提高了大模型的吞吐量,提升幅度达到几十倍。PageAttention目前已成为各大推理引擎的必备技能。
如果想用VLLM来部署一个大模型,其步骤非常简单。首先,执行下面的命令安装VLLM:
pip install vllm
然后执行下面命令,即可启动服务。
vllm serve {模型文件地址}
这样的部署流程有什么问题?
首先,让我们回顾一下之前的训练和部署流程。
对于每个业务场景,我们首先通过微调训练生成一个Lora参数文件,然后将Lora参数文件与基础大模型合并,最后进行大模型的部署。这是一个经典的流程。
然而,如果业务场景众多且每个场景的流量较小,就需要部署多套大模型。以常见的7B大模型为例,至少需要一块22G显存的显卡才能运行,而14B模型需要两块22G显存的显卡,70B的大模型则需要更高的成本。这种情况可能导致GPU资源的浪费。
四、多Lora部署大模型又是什么
多Lora的技术原理是什么
在上述部署流程中,微调大模型后会生成一个Lora文件,该文件需要与基础大模型合并成一个新的大模型。然而,实际上,我们可以选择不合并Lora文件,而是直接在显存中加载原有的大模型参数和Lora参数,然后进行推理。这种方法同样是可行的。
参考上面的Lora原理图,W表示大模型的一个原始参数矩阵。Lora的思路是将矩阵W拆分为两个低秩矩阵A和B,并对这两个矩阵进行训练。训练结束后,我们可以选择将A和B矩阵与W矩阵合并,也可以不合并,而是分别使用W和A/B进行计算,然后再将计算结果进行合并,最终效果是一样的。
因此,我们的部署流程可以进行如下调整:业务方在进行Lora微调后生成一个Lora文件。接下来,我们在显存中加载基础大模型,同时也加载业务方的Lora文件,直接进行推理。如果有多个业务方参与,每个业务方都会产生一个Lora文件,于是这一部署流程可以推广至如下图所示。
每个业务场景都基于自己的业务数据训练一个Lora文件。在部署时,我们只需选择一个基础大模型,并在显存中同时加载多个Lora文件。这样,便可以使用一块显卡同时满足多个业务场景的需求。当用户发出请求时,要在请求中指定需要调用的Lora模型是哪个。
多Lora适应于什么场景
多Lora适用于以下场景:
-
业务场景多样化:当你的业务场景较多,并且每个场景都需要根据其特定数据进行微调生成一份自己的大模型。
-
调用量较小:如果每个业务场景的调用量相对较少,那么单独为每个场景部署一份大模型的成本将显得很高。
采用多Lora的方式来部署大模型可以有效解决这些问题。通过只加载一份基础大模型,同时在显存中加载多个较小的Lora文件,我们能够显著减少因重复部署带来的成本。这样,便可以为多个业务场景提供支持,同时保持资源的高效利用。
哪些推理框架支持多Lora
目前,支持多Lora的推理框架中,VLLM是一个推荐的选择。我们对VLLM的多Lora性能进行了压测,结果显示它在性能和易用性方面表现都非常不错。
如果你想使用VLLM来部署多Lora,只需执行以下命令即可:
vllm serve {你的模型地址} --enable-lora --lora-modules {lora1的地址} {lora2的地址}
这样,你就可以轻松地在VLLM中启用多Lora的功能。
多Lora的性能怎么样,有哪些限制
为了验证多Lora的性能,我们特意用Llama3-8b模型,L20GPU显卡进行了压测对比,数据如下:
可见,多Lora对推理的吞吐与速度的影响几乎可以忽略。
那么,多Lora在使用时有哪些限制呢?
-
共享基础大模型:所有希望一起部署的多个业务场景必须使用相同的基础大模型。这是因为在多Lora部署时,基础大模型只需加载一份,以支持多个Lora的推理。
-
Lora秩的限制:如果使用VLLM进行多Lora部署,微调训练时,Lora的秩R的值不要超过64。大多数情况下,这个条件都是可以满足的,但在特定场景中需要注意这一点。
因此,在进行多Lora部署之前,需确保满足上述要求,以保证系统的正常运行。
五、总结
本文从如何节省多业务场景部署大模型的成本入手,逐步介绍了Lora的概念、如何对大模型进行Lora微调,以及微调后如何合并Lora参数以部署大模型。接着,我们提出了一个问题:在多个业务场景的部署中,如何降低大模型的部署成本。为此,我们介绍了利用多Lora的方式,以合并多个业务场景的部署。
文章最后,我们分享了对多Lora部署模式的压测效果,结果显示,多Lora与合并后部署的方式相比,性能几乎可以忽略不计。我们还推荐了支持多Lora的推理引擎,帮助读者更好地应用这一技术。
当然,在使用多Lora时也需注意一些限制条件,比如多个场景必须使用相同的基础大模型。如果你有类似的场景或对大模型技术感兴趣,欢迎与我们交流学习,共同进步。
*文 / linggong
本文属得物技术原创,更多精彩文章请看:得物技术
未经得物技术许可严禁转载,否则依法追究法律责任!
相关文章:

利用多Lora节省大模型部署成本|得物技术
一、背景 近期,我们在大模型集群的部署过程中遇到了一些挑战。公司有多个业务场景,每个场景都基于自身的数据进行微调,训练出相应的大模型并上线。然而,这些场景的调用量并不高,同时大模型的部署成本较为昂贵…...

使用SSMS连接和查询 SQL Server 实例
简介 SQL Server Management Studio 是用于管理SQL Server基础架构的集成环境。Management Studio提供用于配置、监视和管理SQL Server实例的工具。 此外,它还提供了用于部署、监视和升级数据层组件(如应用程序使用的数据库和数据仓库)的工具以生成查询和脚本。 官方…...

HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(十五)
一、不支持for … in 规则:arkts-no-for-in 级别:错误 由于在ArkTS中,对象布局在编译时是确定的、并且不能在运行时被改变,所以不支持使用for … in迭代一个对象的属性。对于数组来说,可以使用常规的for循环。TypeScri…...

两个系统之间跳转免密登录
1、 两个系统之间跳转免密登录_从一个系统跳转到另一个系统,不用再重新登录-CSDN博客 2、 页面跳转统一登录实现_前端从一个系统跳转到其他系统-CSDN博客...

SQL基础——MySQL的触发器、存储引擎、事务
简介:个人学习分享,如有错误,欢迎批评指正。 一、MySQL的触发器 1.概述 介绍 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用&…...

目标检测算法:对比YOLOv3、YOLOv5、YOLOv8
目标检测 YOLOv3 数据处理 可输入任意大小的图片(特征图大小最好是32倍数)Anchor:K-Means聚类IOUNMS 模型结构 Backbone Darknet53 无最大池化,步长2卷积层进行下采样每个Conv后 BN LeakyReLU引入残差结构中间层和某一层上…...

C# 属性(Property)
C# 属性(Property) C# 中的属性(Property)是一种用于访问和设置类或结构体成员的值的特殊成员。属性提供了一种封装字段的方式,使得字段的访问更加安全和灵活。本文将详细介绍 C# 属性的概念、用途、语法以及如何使用…...

3. 数据结构——栈的操作实现
1. 顺序栈 主要操作:初始化、栈判空、入栈、出栈、去栈顶元素 1.1 直接数组存储栈 //顺序栈的实现 #include<stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct{ElemType data[MaxSize];int top; //指向栈顶指针,最开始-1 …...

EmguCV学习笔记 VB.Net 4.5 像素距离和连通区域
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…...

使用spring boot开发与直接开发一个web项目的区别
1. 项目结构的区别 springboot开发没有web.xml,配置更加简洁。 2. 启动 传统的web项目将项目打成war包,然后将war包复制到tomcat的webapp目录下,最后通过启动tomcat部署运行项目。 而springboot将项目打成jar包,jar包中包含内置的…...

Leetcode JAVA刷刷站(48)旋转图像
一、题目概述 二、思路方向 要在原地顺时针旋转一个 n x n 的二维矩阵 90 度,你可以通过一系列交换操作来实现。这里的关键在于理解旋转后的矩阵与原矩阵之间的元素对应关系。 假设原矩阵为 matrix,其中 matrix[i][j] 表示第 i 行第 j 列的元素。旋转 90…...

编译型语言和解释型语言
年代区分 从硬件技术和软件需求,计算机发展初期,没有可能发展真正的解释型语言,运行速度和内存都受限,只有给机器喂二进制代码才能勉强跑起来。但事实上,解释型语言却在计算机发展很早的时期曾经出现过,当…...

TensorRT 和 PyTorch区别
一、TensorRT 和 PyTorch TensorRT 和 PyTorch 是两个不同的深度学习工具,虽然它们可以用于处理相同类型的任务,但它们的用途、特点和设计目标有所不同。 TensorRT 简介 TensorRT 是 NVIDIA 开发的一款高性能深度学习推理引擎,主要用于优化…...

iOS 17.6.1版本重发,修复高级数据保护错误
今日,苹果没有带来iOS 17.6.2的更新,而是重新发布了iOS 17.6.1版本,本次升级版本号为21G101,高于第一版的21G93。距离初版发布相隔一周半时间。 在 iOS / iPadOS 17.6.1 的更新日志,苹果公司写道:“此更新包…...

【排序算法】八大排序(上)(c语言实现)(附源码)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:算法 目录 前言 写一串测试数据 交换两元素的函数 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 程序全部代码 总结 前言 排序算法是计算机科…...

Python版《超级玛丽+源码》-Python制作超级玛丽游戏
小时候最喜欢玩的小游戏就是超级玛丽了,有刺激有又技巧,通关真的很难,救下小公主还被抓走了,唉,心累,最后还是硬着头皮继续闯,终于要通关了,之后再玩还是没有那么容易,哈…...

互联网私有IP地址列表
最近因为业务需要,要判断用户的IP是否私有IP, 以前知道的私有IP,基本上只有如下几个(注意:这不是正确答案): 10.0.0.0/8(10.0.0.0-10.255.255.255)172.16.0.0/12(172.16.0.0-172.31…...

光伏项目管理软件为什么那么多光伏人在用?
在光伏行业迅速发展的今天,光伏项目管理软件已成为众多光伏从业者不可或缺的得力助手。那么,为何这款软件能够受到如此广泛的青睐和应用呢? 一、提高项目管理效率 光伏项目管理软件通过数字化、智能化的手段,对光伏项目的各个环节…...

《AOP实战》— 自定义注解
承接上文(传送门 —>《面试必考》 — AOP-CSDN博客),在被面试官拷打的时候,会被问到一个致命问题:“你了解aop吗?有具体的使用经验吗?” 你:......... 言尽于此,此篇…...

微前端架构下的单页应用实现策略
随着Web应用的复杂性日益增加,传统的多页应用(MPA)模式已经难以满足现代Web开发的需求。单页应用(SPA)以其流畅的用户体验和高效的页面加载速度,逐渐成为Web开发的主流模式。然而,在微前端架构下…...

JWT(JSON Web Token)工作原理及特点
JWT定义 概念:JWT是一种开放标准(RFC 7519),用于在网络上安全传输信息,常用于身份验证。比喻:类似于电子通行证,包含用户身份信息,用于身份验证和享受服务。 JWT组成部分 头部&am…...

【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等
程序员养生指南之 【体检】程序人生之健康检查,全身体检项目分类,五大传染病普筛,基因检测等 文章目录 一、全身体检与预防疫苗(年检)1、实验室检测:生化全套检查2、医技检查:辅助诊疗科室3、科…...

汇编语言中的指令锁定:解锁高效并发编程
标题:汇编语言中的指令锁定:解锁高效并发编程 在汇编语言的微观世界中,指令锁定(Instruction Locking)是一种确保数据一致性和操作原子性的关键机制。通过使用特定的lock前缀,开发者可以告诉CPU在执行多处…...

《人工智能时代:金融投资决策的潜在系统性风险及防范策略》
在当今数字化飞速发展的时代,人工智能(AI)在金融领域的应用日益广泛,特别是在投资决策方面展现出了巨大的潜力。然而,随着其影响力的不断扩大,我们也必须警惕潜在的系统性风险。 人工智能在金融投资决策中…...

MT7621+MT7915(MT7905)+MT7975 (W7621A6G-SDK)编译固件与升级固件方法
一、搭建开发环境,编译固件。 1、安装在Ubuntu 14.04.5 x86_64系统后,然后安装下面命令行。 $ sudo apt-get install git g make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils vim zlibc zlib1g zlib1g…...

[php:\\filter]
写入 #题目 <?php $filename$_GET[filename]; $content$_POST[content]; file_put_contents($filename,<?php exit();.$content); highlight_file(__FILE__); ?> 源码如上,需要再服务器上写入一句话木马 payload如下: #<?php phpinf…...

Linux-环境变量
文章目录 第6章 Linux 环境变量6.1 环境变量简介?6.2 全局变量6.3 局部环境变量6.4 设置用户自定义变量6.4.1 设置局部用户自定义变量6.4.2 设置全局环境变量6.4.3 删除环境变量 6.5 默认的shell环境变量6.6 设置PATH环境变量6.7 定位系统环境变量6.7.1 登录shell6.…...

DISCUZ论坛中 “阅读权限10“这几个字的修改教程以及后台目录路径修改后的管理路径
第一篇:修改“阅读权限10”这几个字 首先找到目录: source\language\lang_message.php 找到这个文件 查找: thread_nopermission 首发地址:玖毅论坛 第二篇:后台管理路径 看到好多人在网上问discuz管理路径怎么…...

springboot 整合spring-boot-starter-data-elasticsearch
依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency> 配置 spring:elasticsearch:rest:uris: "http://localhost:9200" # Elastics…...

Element UI中el-dialog作为子组件如何由父组件控制显示/隐藏~
1、这里介绍的是将el-dialog作为组件封装便于复用,如何通过父组件控制子组件dialog的显示与隐藏。 2、思路:首先el-dialog是通过dialogVisible的值是否为true或false来控制显示与隐藏的。那么我们可以通过父传子props来将true(即showFlag的值࿰…...