利用多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开发的主流模式。然而,在微前端架构下…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...
