vLLM介绍

news2024/11/19 8:26:41

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

vLLM 的特点和优势:

  • 采用了 PagedAttention,可以有效管理 attention 的 keys、values
  • 吞吐量最多可以达到 huggingface 实现的24倍,文本生成推理(TGI)高出3.5倍,并且不需要对模型结构进行任何的改变

1 PagedAttention

1.1 背景
  • LLM 的推理,最大的瓶颈在于显存。
  • 自回归模型的 keys 和 values 通常被称为 KV cache,这些 tensors 会存在 GPU 的显存中,用于生成下一个 token。
  • 这些 KV cache 都很大,并且大小是动态变化的,难以预测。已有的系统中,由于显存碎片和过度预留,浪费了60%-80%的显存。
1.2 实现 受到操作系统中,虚拟内存和分页经典思想的启发
  • PagedAttention 允许在不连续的内存空间中存储连续的 keys 和 values。 具体来说,PagedAttention 会将每个序列的 KV cache 划分为块,每个块包含固定数量 tokens 的 keys 和 values。 在注意力计算过程中,PagedAttention 内核有效地识别并获取这些块。
  • 分块之后,这些 KV cache 不再需要连续的内存,从而可以像在操作系统的虚拟内存中一样,更灵活地对这些 KV cache 进行管理。
  • PagedAttention 对于显存的利用接近理论上的最优值(浪费比例低于4%)。通过对显存进行更好的管理,可以使得单次可以使用更大的 batch size,从而进一步利用 GPU 的并行计算能力。

2 vLLM 离线推理流程

vLLM 整体框架:
在这里插入图片描述
其中的关键技术点包括:

  • KVCache 显存优化
  • PagedAttention
  • Continuous Batching
2.1 LLM 和 LLM Engine

LLM 是对 LLM serving 部分的封装,也是核心部分。首先它会初始化这个类。初始化过程中大部分参数都会被用来构造 EngineArgs,这是一个 dataclass,封装了 Engine 的初始化参数。然后构建 LLM Engine。一个 LLM 只有一个 LLM Engine,所以它就是对 Engine 再包一层。不过按照作者的这个设计意思,LLM Engine 也可以单提出来使用。

初始化 LLM Engine 时候会先调用 create_engine_configs 将 EngineArgs 分解成 ModelConfig,CacheConfig, ParallelConfig 和 SchedulerConfig。其中:

  • ModelConfig 包括了对 model 和 tokenizer 的定义,dtype 和随机数 seed 以及是否用 pretrained weights 还是 dummy weights 等。
  • CacheConfig 包括 block_size(每个 block 多大), gpu_utilization(GPU 利用率,后面 allocate 的时候占多少 GPU)和 swap_space(swap 的空间大小)。默认 block_size=16,swap_space=4GiB。
  • ParallelConfig 包括了 tensor_parallel_size 和 pipeline_parallel_size,即张量并行和流水线并行的 size,由于我们是单卡,这两个都是 1。
  • SchdulerConfig 包括了 max_num_batched_tokens(一个 iteration 最多处理多少个 tokens),max_num_seqs(一个 iteration 最多能处理多少数量的 sequences)以及 max_seq_len(最大生成多长的 context length,也就是一个 sequence 的最长长度,包含 prompt 部分和 generated 部分)。

然后对于每个 device(也即每张卡 / 每个 rank)创建一个 Worker。Worker 是运行 model 的单位。一个 Engine 管理所有的 workers。同时给这个 engine 创建它的 scheduler,以及初始化这个 engine 的 KV cache。

2.2 workers

Worker 是对单个 GPU 的抽象。

Engine 通过调用 _run_workers(“<method_name>”, *args, get_all_outputs, **kwargs) 来在 所有 workers 上执行方法。如果 get_all_outputs 设成 True,那么它会将所有 workers 的返回结果包装成 List 来返回。否则,它只会返回第一个 worker 的结果,并且 assert 所有 workers 的输出都是一样的。在实际执行中主要会调用如下方法(方法名, get_all_outputs=False/True):

  • profile_num_avaiable_block,True:通过一次 “试运行” 来 profile peak memory。 每张卡的 blocks 个数可能不同(显存不同),所以需要 get all outputs。由于 vLLM 使用一个中心化的管理单元,因此我们会对 profile 出来的 blocks 个数取 min。
  • init_cache_engine,False:初始化 cache engine。由于返回 None,所以不需要 get all outputs。
  • execute_model ,False:执行模型。这里虽然是分布式 inference,但是最后 output 都会被 reduce,所以 get all outputs 也设成 False 就好了。

Worker 初始化阶段会初始化模型和一些 distributed 相关的东西。

2.3 Cache Engine

用于管理 KV Cache 的单元。

初始化时候,它先根据之前 profile 的数据(cpu/gpu blocks数)来 allocate cache。然后再给 caching 操作初始化一个 CUDA Stream,以及给每一个 layer 初始化一个 cuda event 来用做 stream synchronization。

在 vLLM 里,每个 key block 的 shape 是 [num_heads, head_size // x, block_size, x],其中 x 是 16 // dtype 的大小。也就是说 fp32 时 x=4,fp16 时 x=8。每个 value block 的 shape 是 [num_heads, head_size, block_size]。

在分配 cpu cache 时候,默认是会用 pin memory 的(除非在 WSL)。

cache engine 里支持了其它两个操作:

  • copy。由专门的 cu 函数 copy_blocks 支持。
  • swap_in 和 swap_out。有点像操作系统里的 swap 概念。in 就是 cpu to gpu,out 就是 gpu to cpu。内部实现由专门的 cu 函数 swap_blocks 支持。

相关的 cu 函数,实现在 csrc/cache_kernels.cu 中:

  • swap_blocks(src, dst, block_mapping): for 一遍 block_mapping,对于每个 [src, dst] pair(block number to block number)做一个单 block 的 copy。支持 GPU to GPU(必须是同一个 GPU 上),GPU to CPU,CPU to GPU。
  • copy_blocks(key_caches, value_caches, block_mapping):这里的 mapping 是 int->list[int],也就是一个 src block idx 对应多个 dst block idx。copy 的过程用一个 global kernel 并行实现。
  • reshape_and_cache(key, value, key_cache, value_cache, slot_mapping)
  • gather_cached_kv(key, value, key_cache, value_cache, slot_mapping)
2.4 memory sharing
  • memory sharing 是 PagedAttention 的另一个关键特性。
  • 当用单个 prompt 产出多个不同的序列时,可以共享计算量和显存。
  • 通过将不同序列的 logical blocks 映射到同一个 physical blocks,可以实现显存共享。
  • 为了保证共享的安全性,对于 physical blocks 的引用次数进行统计,并实现了 Copy-on-Write 机制。
  • 这种内存共享机制,可以大幅降低复杂采样算法对于显存的需求(最高可下降55%),从而可以提升2.2倍的吞吐量。

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

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

相关文章

SimpleMind Pro 2.3.4中文激活版 思维导图

SimpleMind是一款设计精美、功能齐全的跨平台思维导图软件。它是一个功能强大的优秀的软件工具&#xff0c;可用于头脑风暴的跨平台思维导图。当你和你的朋友坐在一起讨论不同的想法时&#xff0c;你可以很容易地记录下它们&#xff0c;并随时修改它们。思维导图可以帮助你思考…

win10电脑无线网卡优化

近期win10会频繁断网&#xff0c;无任何规律。目前整理搜索后使用以下两种方法优化网卡&#xff0c;更改配置后断网问题得到有效改善。 方法一&#xff1a;在【电源管理】中取消勾选【允许计算机关闭此设备以节约电源】 方法二&#xff1a;【Preferred enable】修改为prefer 5…

c# wpf style 简单试验

1.概要 wpf style 用来控制控件的样式 2.代码 <Window x:Class"WpfApp2.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…

Linux操作系统之防火墙、redis安装

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; 一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙分为两种 硬件…

【Python基础教程】5. 数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

芒果YOLOv8改进154:提出多种<独家原创结构>ReNLANLSK, CPNGhost, CSCLSK, C2fLSK等,基于LSKNet,即插即用

本篇文章内容基于 论文 LSKNet 论文 的核心, 针对其核心,芒果专栏提出多种原创结构 芒果专栏提出基于 LSKNet 的多种原创结构,改进源码教程 | 详情如下🥇 👉1. 原创结构:ReNLANLSK、👉2. 原创结构:CPNLSK 👉3. 原创结构:CSCLSK、 👉4. 原创结构:C3LSK、 👉5…

labelme、labelimg的安装及使用(含格式转换)

目录 labelme、labelimg简要介绍 labelme labelimg Anaconda虚拟环境 labelme安装 labelme的使用 labelimg安装 labelimg的使用 json格式转换 标注便携操作 labelme、labelimg简要介绍 labelme和labelimg都是图像标注工具&#xff0c;它们在机器学习和计算机视觉领…

在CentOS 8.5.2111下安装vncserver tigervnc-server

# 参考&#xff1a; How to Install TigerVNC Server on CentOS 8 前提&#xff1a; 默认用root操作所有命令 安装桌面GUI dnf groupinstall "Server with GUI" 安装tigervnc-server dnf install tigervnc-server 增加vncuser用户&#xff08;这里默认就是vncuse…

基础数据结构-链表,栈,队列

链表 常见的链表有单链表和双链表 单链表&#xff1a;每个结点有一个next指针指向下一个结点&#xff0c;data存放数据 双链表&#xff1a;每个结点有一个next指针指向下一个结点&#xff0c;prev指针指向上一个结点&#xff0c;data存放数据。 4的下一结点为-1&#xff0c;…

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美(含源码仅此一份,先到先得)

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09; 目录 【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09;1.面向对象的引用1.1简介1…

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…

02-JDK新特性-try-with-resources自动管理资源关闭

try-with-resources 为什么要介绍这个了 看看一下以下代码&#xff1a; public static void fileCopyByTryWithResources(File src, File des) throws IOException {try (FileInputStream fis new FileInputStream(src); FileOutputStream fos new FileOutputStream(des);…

AI预测福彩3D第26弹【2024年4月4日预测--第4套算法重新开始计算第11次测试】

今天清明节假日&#xff0c;一会要外出&#xff0c;可能要晚点回来。咱们尽早先把预测数据跑完&#xff0c;把结果发出来供各位彩友参考。合并下算法&#xff0c;3D的预测以后将重点测试本套算法&#xff0c;因为本套算法的命中率较高。以后有时间的话会在第二篇文章中发布排列…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…

Vue3【进阶】

简介 https://cn.vuejs.org/guide/introduction.html 创建vue3工程 【基于 vue-cli创建】 基本和vue-cli的过程类似&#xff0c;只是选择的时候用vue3创建 【基于vite创建】【推荐】 【官网】https://vitejs.cn/ 【可以先去学一下webpack】 步骤 【https://cn.vitejs.…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多进程编程

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

item_search-按关键字搜索淘宝商品接口:精准关键字,多样搜索类型,智能排序——淘宝购物新体验

淘宝购物新体验&#xff1a;item_search接口——精准关键字、多样搜索类型与智能排序 在淘宝购物的新体验中&#xff0c;item_search接口扮演着至关重要的角色&#xff0c;它为用户提供了精准关键字搜索、多样搜索类型以及智能排序等功能&#xff0c;极大地提升了购物的便捷性…

趣学前端 | 综合一波CSS选择器的用法

背景 最近睡前习惯翻会书&#xff0c;重温了《HTML5与CSS 3权威指南》。这本书&#xff0c;分上下两册&#xff0c;之前读完了上册&#xff0c;下册基本没翻过。为了对得起花过的每一分钱&#xff0c;决定拾起来近期读一读。 CSS 选择器 在CSS3中&#xff0c;提倡使用选择器…

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…

程序员的工资是多少,和曹操有莫大的关系

曹操是谁大家都知道了吧&#xff0c;他是三国时期的一个有名的大老板&#xff0c;谁知道曹操的工资是多少呢&#xff1f;这个其实也不好说&#xff0c;有时候曹操赚很多的钱&#xff0c;有时候也亏血本&#xff0c;甚至连脑袋都差点掉了。创业不容易啊&#xff0c;曹老板也是如…