【vLLM】使用PagedAttention 进行大型语言模型的高效内存管理

news/2025/1/8 5:40:16/

重磅推荐专栏:
《大模型AIGC》
《课程大纲》
《知识星球》

本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展

1. 简介与背景

大型语言模型(LLM, Large Language Models)是人工智能领域的一种深度学习模型,它们通过处理大量的文本数据来学习语言的模式,并能完成诸如文本生成、翻译、问答等多种任务。这些模型通常包含数十亿个参数,需要相当大的计算资源来进行训练和服务(即推理或预测)。在服务阶段,模型的参数、中间计算结果(激活值)、以及键值缓存(KV cache)都需要占用显存空间。

在这里插入图片描述
如上图所示,当在一个 NVIDIA A100 GPU 上部署一个拥有130亿参数的大型语言模型时的显存布局情况。这里有几个关键点:

  • 灰色部分 表示的是模型参数,这些参数在整个服务期间一直驻留在GPU显存中。
  • 红色部分 是指KV缓存,它用于加速推理过程中的重复计算,这部分显存会随着每个请求被分配和释放。
  • 黄色部分 表示短暂使用的激活显存,这是在计算过程中临时使用的显存。
  • 右侧的图展示了vLLM如何平滑了现有系统中KV缓存显存的增长曲线,从而显著提高了服务吞吐量。这意味着vLLM能够更有效地管理显存,减少由于显存快速膨胀而导致的服务性能下降。
    在这里插入图片描述
    上图显示了不同LLM服务系统在实验中浪费的平均显存百分比。这表明不同的系统在处理同样的任务时效率可能有很大差异,而某些系统可能会因为设计上的原因导致更多的显存浪费。

当我们在GPU上部署和运行大型语言模型时,需要处理大量的请求。每个请求在处理过程中都会生成一系列的输出词元(tokens),而这些词元的相关信息会被存储在一个称为KV缓存的地方。KV缓存对于加速模型推理过程非常重要,因为它保存了之前所有生成词元的上下文信息,使得模型可以根据这些历史信息更有效地生成新的词元。

然而,现有系统在管理KV缓存方面存在三个主要问题:

预留显存:为了保证每个请求都能有足够空间来存储其可能的最大长度序列,系统会预先分配一大块连续的显存。这意味着即使一个请求实际上只用了很小一部分显存,其他请求也不能使用这块预留的显存,从而造成了浪费。
内部碎片化:由于每个请求的实际序列长度往往比预估的最大长度要短得多,因此预分配的显存中有很大一部分从未被使用过。这种现象被称为内部碎片化,它限制了可以同时处理的请求数量。
外部碎片化:不同请求之间的预分配显存大小不一样,这会导致所谓的外部碎片化。即使总的可用显存足够多,但由于这些不规则的空闲块无法组合成足够的连续空间供新请求使用,结果还是会有许多显存得不到有效利用。
这些问题共同作用,导致了宝贵的GPU显存资源没有得到充分利用,并且限制了系统的吞吐量——即单位时间内能够处理的请求数量。如图3所示,展示了两个不同的请求A和B,它们分别具有不同的最大可能序列长度。通过这种方式,可以看到当前系统中存在的显存浪费情况。

为了解决上述挑战,研究者们提出了像PagedAttention这样的新技术,旨在模仿经典虚拟显存和操作系统中的分页技术来优化KV缓存管理。这种方法可以几乎消除KV缓存显存浪费,并允许在同一时间点灵活地共享KV缓存,进一步减少显存使用,最终提高了服务效率。

2. 大模型服务的显存挑战

当我们在GPU上部署和运行大型语言模型时,需要处理大量的请求。每个请求在处理过程中都会生成一系列的输出词元(tokens),而这些词元的相关信息会被存储在一个称为KV缓存的地方。KV缓存对于加速模型推理过程非常重要,因为它保存了之前所有生成词元的上下文信息,使得模型可以根据这些历史信息更有效地生成新的词元。

然而,现有系统在管理KV缓存方面存在三个主要问题:

  • 预留显存:为了保证每个请求都能有足够空间来存储其可能的最大长度序列,系统会预先分配一大块连续的显存。这意味着即使一个请求实际上只用了很小一部分显存,其他请求也不能使用这块预留的显存,从而造成了浪费。
  • 内部碎片化:由于每个请求的实际序列长度往往比预估的最大长度要短得多,因此预分配的显存中有很大一部分从未被使用过。这种现象被称为内部碎片化,它限制了可以同时处理的请求数量。
  • 外部碎片化:不同请求之间的预分配显存大小不一样,这会导致所谓的外部碎片化。即使总的可用显存足够多,但由于这些不规则的空闲块无法组合成足够的连续空间供新请求使用,结果还是会有许多显存得不到有效利用。

这些问题共同作用,导致了宝贵的GPU显存资源没有得到充分利用,并且限制了系统的吞吐量——即单位时间内能够处理的请求数量。
在这里插入图片描述

如图所示,展示了两个不同的请求A和B,它们分别具有不同的最大可能序列长度。通过这种方式,可以看到当前系统中存在的显存浪费情况。

为了解决上述挑战,研究者们提出了像PagedAttention这样的新技术,旨在模仿经典虚拟显存和操作系统中的分页技术来优化KV缓存管理。这种方法可以几乎消除KV缓存显存浪费,并允许在同一时间点灵活地共享KV缓存,进一步减少显存使用,最终提高了服务效率。

3. vLLM 的架构与工作原理

在这里插入图片描述

3.1 PagedAttention

为了理解 PagedAttention,我们可以把它想象成一个图书馆的管理系统,只不过这个图书馆存储的是大型语言模型(LLM)推理过程中使用的“书”——即注意力机制中的键(key)和值(value)向量。这些“书”并不是一直放在固定的架子上,而是可以根据需要被动态地分配到不同的“书架”(显存块)中。

3.1.1 传统方法的问题

在传统的 LLM 服务系统中,当处理一个请求时,会预先分配一大块显存来存储该请求可能用到的所有键值对。这就像是为每个读者预留了一整排书架,不管他们实际借阅了多少本书。这种做法不仅浪费了大量的空间,而且由于每个请求都有自己独立的空间,无法实现有效的资源共享,导致显存碎片化问题严重。


http://www.ppmy.cn/news/1561193.html

相关文章

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…

springCloud实战

一、Feign的实战 1、使用 1.1步骤 ①引入feign依赖 ②在启动类上加上EnableFeignClients注解,开启Feign客户端 ③编写FeignClient接口 1.2开启feign调用日志 只需在yml配置文件中开启配置即可 feign:client:default:loggerLevel: FULL #feign接口被调用时的…

数据结构:二叉搜索树详解

二叉搜索树详解 一、二叉搜索树的概念二、 二叉搜索树的性能分析(一)二叉搜索树的效率(二)数组结构和二叉排序树的比较 三、二叉排序树的插入(一)操作规则(二)代码实现 四、二叉排序…

算法电子书合集(pdf)

算法(c、java)电子书 (使用手机保存资料可以获取1T免费网盘空间) 资源链接:https://pan.quark.cn/s/25fd93f4176e

密码学文献引用:CryptoBib + DBLP

网络安全和密码学,推荐文献引用: CryptoBib (ens.fr) DBLP: computer science bibliography 文章目录 如何下载如何使用 如何下载 git init# 下载 crypto.bib git submodule add https://github.com/cryptobib/export cryptobib # 或者 crypto_crossr…

华为 Sensor 省电策略调研

华为EMUI 9.0.0.187(C00E57R1P15) 无该功能 华为EMUI 9.1.0.321(C00E320R1P1) 之后有sensor管控 一、华为 Sensor 省电策略 1. Sensor 类别只配置非唤醒类Sensor 2. 手机静止情况,应用不可见时达到1分钟&#xff0…

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …

简历_熟悉缓存高并发场景处理方法,如缓存穿透、缓存击穿、缓存雪崩

系列博客目录 文章目录 系列博客目录1.缓存穿透总结 2.缓存雪崩3.缓存击穿代码总结 1.缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对…