vLLM: Easy, Fast, and Memory-Efficient LLM Serving with PagedAttention

论文:https://arxiv.org/abs/2309.06180
代码:GitHub - vllm-project/vllm: A high-throughput and memory-efficient inference and serving engine for LLMs

核心要点


  • 为什么切换简单?Easy

    • 本质是优化了底层推理过程的内存调用逻辑,CUDA Op的改变,与模型架构关联小,可以无痛切换

  • 为什么节省了内存?Memory-Efficient

    • 序列存储的空间是按需分块存储,降低了物理空间的浪费,原生支持内存共享

  • 为什么增加了推理的吞吐量?Fast

    • 通过内存共享、分块存储的方式,降低了单request的内存占用,增加BatchSize,优化调度策略,提升GPU利用率

  • 文章贡献:

    • 受操作系统虚拟内存和分页机制的启发,提出了一种基于非连续分页内存KV cache的注意力算法PagedAttention

    • 设计并实现了vLLM框架,一个基于PagedAttention建立的分布式LLM服务

    • 在各种场景下评估了vLLM,并证明它明显优于之前的SOTA,如FasterTransformer

不同框架性能对比

多模态大模型性能自测

框架介绍


vLLM框架整体结构

LLM模型推理流程

  • Prompt阶段:通过用户输入的prompt计算第一个生成token的条件概率,即生成第一个 token。生成过程中得到 prompt token 的 KVCache,用于后续 token 的生成。

  • Decode阶段:逐步迭代生成每个 token,在生成第t+1个token时,需要将prompt token、已生成的 token 及当前第t个token 的 KVCache拼接起来,与第t个token的query vector 完成SelfAttention等计算,由于数据依赖性,无法并行,是LLM推理性能的主要瓶颈位置

LLM模型batch推理

batch推理能提升模型服务的吞吐,常规模型服务的batch推理策略:

  • 设置一个 batch推理延时以及最大 batch size;

  • 收到新请求时将请求入队,判断请求队列中的请求数是否达到最大batch size或者最早请求与最迟请求的到达时间差是否达到batch推理延时

  • 对合并后的模型输入进行batch推理,结果返回客户端

常规的模型服务的batch推理策略的问题

  • 请求端到端延时提升:batch推理延时和队列等待延时。生成单个 token 耗时在毫秒级别,那么生成千级别 token 数 Decode 耗时基本在秒级别,所以等待延时可达秒级别

  • GPU计算、存储资源有效利用率低:模型输入输出的长度不一致。

    • 对于不同的输入长度,模型在构造输入的时候会进行padding,浪费GPU计算资源。

    • 对于不同的输出长度,整个batch推理结束服务才会返回结果,已经完成推理的请求会一直空转,导致GPU资源的浪费

vLLM框架针对此问题提出的优化

  • 解决办法:

    • 提出Iteration-Level请求调度方式,与Request-Level方式相比,请求调度的粒度减小了

    • 当完成一轮Decode迭代时,如果Batch内有请求完成推理(即生成EOS token),则将该请求剔除出Batch;如果有新的请求进入,则将新请求加入到当前 Batch 进行推理。

  • Iteration-Level请求调度方式的优点:

    • 延时方面:大幅度降低请求端到端延时,队列等待时间从原来的秒级别下降到毫秒级别。

    • 资源利用率方面:避免数据空转和输入数据padding,提升GPU资源有效利用率

LLM服务的内存挑战

  • 单次推理合并越多请求,吞吐越高,但是能同时推理的请求数是会受限于显存的,LLM服务显存占用主要由三部分组成:模型权重、KVCache 以及其他激活值

  • Large KV cache的限制:

    • KV cache Memory大小 = 2 x batch_size x num_layers x max_seq_len x hidden_size x sizeof(dtype)

    • 假设13B的OPT模型,单个token的KV cache需要800KB(2x5120x40x2),如果生成2048个token,则需要1.6GB的显存存储

  • Memory Management in Existing Systems:现有系统存在以下三种资源浪费

    • 外部碎片:深度学习框架一般都会将tensor存储在连续的内存中(pytorch .contiguous()),KV cache存储亦如此

    • 内部碎片、预存显存:LLM输出是不可预测的,现有系统会默认给每个请求分配最大可能长度的内存块,其他请求不可用

  • vLLM框架提出的内存管理优化方法:核心为PageAttention模块-自定义了CUDA内核进行处理

    • PageAttention允许将一个序列的KV Cache存储在非连续的物理块上,每个块上存放固定数量token的KV数据

      • os虚拟内存的内存管理方法

        • os会将平台内存划分为多个固定大小的物理内存page,映射用户程序的逻辑page到物理page,连续的逻辑page可以对应到非连续的物理内存page,不提前分配物理内存,统一由os动态按需分配。

      • 解决的方法:

        • 连续的逻辑page对应到LLM的解码token序列,只预留最后一个block作为当前请求未来generate token的预留填充。

        • 构建block表,记录每个逻辑block对应的物理block位置以及每个物理block已经填充的token数量,通过将逻辑、物理KV block进行分离,实现动态增加KV cache的能力。

        • 举例:客户端传来一个请求,输入首先使用self-attn对prompt进行处理,将KV存到物理块中,并解码得到第一个token,第二次解码则是获取物理块中的KV数据使用pageAttention进行计算,当物理块存在空位则直接填充,若不存在空位则重新分配一个新的物理块,只有当前面的block已经被全部填充才会分配新的block,将内存浪费缩小到一个block,从而可以容纳更多的请求提升吞吐量

对于不同的采样策略,进行不同的内存优化

并行解码:单个prompt输入,输出多个采样输出,用户从中挑选一个最优结果。
    • 内存优化方法:

      • 共享输入prompt token的内存。父节点迭代一次后,子节点会共享父节点之前的物理block,导致父节点的ref+=1

      • 学习os虚拟内存的写时复制机制,本文实现了一个块粒度的写时机制,一个物理块能被多个逻辑块映射,通过ref count参数表示引用次数,当一个物理block需要被多个seq修改的时候才会调用

Beam search解码:集束搜索,单个prompt,推理期间多条路径解码,输出一个结果(不复制n份推理,topn会产生n个不同结果继续推理;如果复制n份推理,咋会得到相同的token的?
  • 内存优化方法:

    • 先前的服务需要频繁复制beam分支之间所有的内存

    • vLLM的block共享机制可以大大减少复制开销,写时复制机制一般只需要复制一个block

    • 按照output序列的困惑度进行排序,保留topN个序列。当物理block的ref count为0时,会执行内存释放操作

Shared prefix解码:
  • 内存优化方法:

    • 对于包含任务描述+示例类型+问题的用户prompt,服务可按照规律保存前置任务描述+示例类型的prompt KV物理块,只处理用户的问题、写时复制机制提高模型推理速度

    • Mixed decoding methods解码:由于逻辑block和物理block的优化,PageAttention模块的执行单元缩小到了单个物理block,使得vLLM框架能够实现不同解码请求的batch推理。

LLM服务的调度与抢占:

面临的问题:LLM输入的prompt长度不一,输出的长度是预先不知道的,随着请求和输出token的增多,可能会耗尽GPU所有的资源,需要面对两个问题1.应该驱逐哪些block?2.如果需要,如何恢复被驱逐的block?

解决的方法:

  • 前提,一般情况会采用启发式方法驱逐最久访问的block,但是LLM解码有个特点,一个序列的所有block是一起访问的,是一个整体。同时,在beam search搜索的情况下,一个序列组内的多个序列存在内存共享的情况

  • 方法:采用两种技术,两者性能优劣取决于带宽和GPU计算能力

    • 交换:

      • 类似os虚拟内存中使用的经典方法,将要被驱逐的page复制到磁盘上的交换空间。

      • 在vLLM检测新生成的token没有空间存放时,会选择一组序列驱逐,复制KV cache到CPU中,同时停止接受新的请求。

      • 当现有序列完成时会释放空间,再接回被驱逐的序列,直到被抢占的序列都完成才重新接受请求。

    • 重计算:直接丢弃KV cache,保留解码生成的token,需要重新调度的时候,拼接输入的prompt和解码生成的token,可以显著低于原始的延迟,因为能并行获取KV特征

模型实验


不同采样策略和不同LLM服务时延的对比

不同block大小对于时延的影响

左图:attention内核模块的修改的时延对比

右图:block过小会降低GPU并行性利用率,block过大会导致内存共享率降低、内存浪费比例增大

不同抢占处理策略对于时延的影响

当block较小时,交换策略受限于带宽,重计算优于交换策略;当block较大时,交换策略优于重计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2815351.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2月28日代码随想录二叉搜索树中的众数

摸了一个寒假了,得赶一赶了 251.二叉搜索树中的众数 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数&am…

并查集例题(食物链)C++(Acwing)

代码&#xff1a; #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N];int find(int x) {if(p[x] ! x){int t find(p[x]);d[x] d[p[x]];p[x] t;}return p[x]; }int main() {scanf("%d%d", &n, &m);for(int i 1…

微服务Springcloud智慧工地APP源码 AI人工智能识别 支持多工地使用

目录 一、现状描述 二、行业难点 APP端功能 一、项目人员 二、视频监控 三、危大工程 四、绿色施工 五、安全隐患 AI智能识别 环境监测 实名制管理 智慧监测 智慧工地全套解决方案 一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建…

Docker(运维工具)—— 学习笔记

快速构建、运行、管理应用的工具 一、安装docker 参考Install Docker Engine on Ubuntu | Docker Docs 二、快速入门 1、镜像和容器 docker镜像可以做到忽略操作系统的差异&#xff0c;跨平台运行&#xff0c;忽略安装的差异 当我们利用Docker安装应用时&#xff0c;Dock…

智能风控体系之滚动率矩阵

汇总收集网上相关数据风控应用&#xff0c;多多交流。 在信贷风控的建模场景中&#xff0c;围绕样本数据的目标变量Y定义&#xff0c;是非常重要且特别有意思的处理过程&#xff0c;原因是根据差异化的业务场景与数据形态&#xff0c;标签Y的定义逻辑没有固定方法&#xff0c;只…

Java8 Stream操作流10条常用方法

1.基础数据 Data AllArgsConstructor NoArgsConstructor public class User {private String name;private Integer age;private String sex;private String city; //城市private Integer money; //业绩金额 } //准备数据List<User> users new ArrayList<>();use…

nginx介绍及编译安装

nginx介绍 是一个流行的开源的高性能的HTTP和反向代理服务器&#xff0c;也可以用作邮件代理服务器。它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名 nginx特点 高性能&#xff1a; Nginx以其高效的事件驱动架构而闻名&#xff0c;能够处理大量并发连接而不会消耗过多…

阿里云服务器购买_价格_费用_云服务器ECS——阿里云

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

基于springboot实现线上阅读系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现线上阅读系统演示 摘要 随着社会发展速度的愈来愈快&#xff0c;以及社会压力变化的越来越快速&#xff0c;致使很多人采取各种不同的方法进行解压。大多数人的稀释压力的方法&#xff0c;是捧一本书籍&#xff0c;心情地让自己沉浸在情节里面&#xff0c;以…

变分自编码器VAE

文章目录 一、机器学习分类二、AE与VAE 一、机器学习分类 机器学习分为&#xff1a;有监督学习、无监督学习、半监督学习、自监督学习、强化学习、迁移学习。 1.有监督学习&#xff1a; ①解释&#xff1a;算法从标注的训练数据中学习&#xff0c;其中每个样本都有相应的输出…

git之多人协作

一.多⼈协作⼀ 目标&#xff1a;在同一个分支上完成多人协作 任务&#xff1a;在linux和windows两个用户下分别在远程仓库&#xff08;非master分支&#xff09;中添加“linux submit”和“windows submit” 现在我们在远程仓库dev分支下filetxt文件情况&#xff1a; 我们先…

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

JavaScript的书写方式

JavaScript的书写方式 目前较为流行的是第二种和第三种&#xff0c;第一种很少见。在第二种和第三种推荐使用第三种&#xff0c;因为在日常开发/工作中&#xff0c;第三种是最为常见的 1.行内式 把JS代码嵌入到html元素内部 示例代码 运行效果 由于JS中字符串常量可以使用单引…

C++:模版初阶 | STL简介

创作不易&#xff0c;感谢支持&#xff01;&#xff01; 一、泛型编程思想 如何实现一个通用的交换函数呢&#xff1f; 注&#xff1a;其实swap函数在C的标准库提供了&#xff0c;不需要自己写&#xff0c;这边只是举个例子 void Swap(int& left, int& right) { in…

RunnerGo UI自动化测试脚本如何配置

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…

刷题第2天(中等题):LeetCode59--螺旋矩阵--考察模拟能力(边界条件处理)

LeetCode59: 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a…

网格划分中将部分网格投影到其它部件上的方法

1、将网格投影到目标面上&#xff1a; 2、将一个部件边界上单元的点映射到另一个部件上

力扣5. 最长回文子串(双指针、动态规划)

Problem: 5. 最长回文子串 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;双指针 1.我们利用双指针从中间向两边扩散来判断是否为回文串&#xff0c;则关键是找到以s[i]为中心的回文串&#xff1b; 2.我们编写一个函数string palindrome(string &s, in…

Python中的os库

一.OS库简介 OS是Operating System的简写&#xff0c;即操作系统。 OS库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1&#xff1a;os.getcwd() 作用&#xff1a;返回当前工作目录&#xff0c;结果是…

前端常用6种数据加密方式的使用(最详解)

目录 前言 一、6种常用加密方案 1.Base64加密 2.MD5加密&#xff08;不可逆&#xff09; 3.sha256加密 4.sha1加密&#xff08;相比于MD5 安全性高&#xff0c;但是 速度慢&#xff09; 5.AES加密 6.字符串的编码和解码 二、结语 往期回顾 前言 相信大家在工作或面试…