vLLM大模型推理加速方案原理(PagedAttention)

在这里插入图片描述

一、vLLM 简介

vLLM 用于大模型并行推理加速,核心是 PagedAttention 算法,官网为:https://vllm.ai/。

在这里插入图片描述

vLLM 主要特性:

  1. 先进的服务吞吐量
  2. 通过 PagedAttention 对注意力 key 和 value 进行内存管理
  3. 对传入请求的批处理
  4. 针对 CUDA 内核的优化

vLLM 灵活易用:

  1. 与 HuggingFace 模型无缝集成
  2. 支持并行采样、beam search 等解码算法的高吞吐量服务
  3. 支持分布式推理的张量并行
  4. 支持流式输出
  5. 兼容 OpenAI 的接口服务

服务吞吐量对比:单路输出
图 - 服务吞吐量对比:单路输出
在这里插入图片描述
图 - 服务吞吐量对比:3 路并行输出

二、vLLM 原理

PagedAttention 原理(一)

用于自回归生成的 KV cache 占大量显存,受OS中的虚拟内存和分页的思想启发,提出了该 attention 优化算法,可在不连续的显存空间存储连续的 key 和 value。用于将每个序列的 KV cache 分块(blocks),每块包含固定数量的 token 的 key 和 value 张量。
在这里插入图片描述
动图☝️:以 for 的 attention计算为例。KV cache 被划分为多个块,块在内存空间中不必连续

PagedAttention 原理(二)

因为 blocks 在显存中不必连续,所以可以像 OS 的虚拟内存分页一样,以更灵活的方式管理键和值:

  • 将 block 视为 page
  • 将 token 视为 bytes
  • 将序列视为进程

序列的连续逻辑块通过 block table 映射到非连续物理块。
物理块可在生成新 token 时按需分配。因此只有最后一个block会发生显存浪费,小于4%。
在这里插入图片描述
动图☝️:通过 block table 将逻辑块映射到物理块

PagedAttention 原理(三)

并行采样时,同一个 prompt 生成多个输出序列,这些序列生成时可以共享 prompt 的 attention 计算和显存。
与 OS 中进程共享物理 page 的方式类似,不同序列可以通过将其逻辑块映射到同一物理块来共享块。为了确保共享安全,Paged Attention 跟踪物理块的引用计数,并实现 “写时复制”(Copy-on-Write)机制,即需要修改时才复制块副本。内存共享使得显存占用减少 55%,吞吐量提升 2.2x。

写时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。

在这里插入图片描述
动图☝️:并行采样生成时的引用计数和 Copy-on-Write

三、内部模型实测

在这里插入图片描述
硬件:单卡A100(80G)
模型:内部 7B 模型
测试工具:Apache JMeter
实验结论:vLLM 加速 7.44 倍

指标解释:

# Samples :总请求数(样本个数)
Throughput :吞吐量(Request/Sec),即每秒处理的请求数
Average :平均响应时间(ms)
Received KB/sec :每秒从服务器端接收到的数据量(字节)
Sent KB/sec :每秒向服务器发送数据量(字节)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI + Swift 设备振动

如何让设备振动呢 iPhone 6S 3D Touch,可以识别轻,中,重三种按压力度,配合恰到好处的振动有利于提升交互体验,但后面的新设备都不支持 3D Touch 了,改为了检测按压时间,按同一个图标&#xff0…

尚医通04:Axios Node Npm bable webpack+前端工程改造

目录 本日学习 内容介绍 Axios Node NPM包管理器 本日学习 1. 了解Axios :他是异步请求用的,前后端。 用于在浏览器和 Node.js 中发送 HTTP 请求。它支持从服务器获取数据、上传数据以及执行其他与 HTTP 相关的操作。 2.Node:它允许你在服务器端运行 JavaScrip…

python PYQT5 键盘,鼠标,绘制,焦点,改变,输入法,事件的方法和使用例子

https://img-blog.csdnimg.cn/7630017d3ee444eab9bdedf8d48d575f.png from PyQt5.Qt import * import sys class MyQwidget(QWidget):def __init__(self):super().__init__()def showEvent(self, a0) -> None:print("窗口被展示出来",a0)def closeEvent(self,a0) …

linux开发工具:repo

1:repo简单介绍 repo是Google开发的用于管理Android版本库的一个工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库。repo不是用于取代git,而是简化了对多个Git版本库的管理。 repo…

Java中可以使用哪些系统架构?怎样选择?

架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。 Java企业级的应用根据业务的复杂程度,通常使用的系统架构有应用架构、垂直应用架构、面向服务的架构(Service-Oriented Architectu…

IDEA 导入多模块项目并设置运行

1、导入多模块项目 导入的步骤点击左上角File->New->Module from Existing Sources,最后点击选择项目的pom文件即可 2、设置模块 如果pom.xml文件是灰色并且有横杠,则需要这样设置: 把√去掉。 项目结构如图所示: 本项…

816. 数组翻转

链接: 链接 题目: 给定一个长度为 nn 的数组 aa 和一个整数 sizesize,请你编写一个函数,void reverse(int a[], int size),实现将数组 aa 中的前 sizesize 个数翻转。 输出翻转后的数组 aa。 输入格式 第一行包含两个整…

【Docker】简单的Linux安装Redis

目录 Docker 安装 Redis拉取镜像安装容器修改配置文件容器随docker启动自动运行redis客户端 史上最详细Docker安装Redis (含每一步的图解)实战 Docker 安装 Redis 拉取镜像 docker pull redis安装容器 创建redis配置文件目录:如果内部没有相…

webRTC实现P2P音视频通话(无服务端)

文章目录 先看效果视频对话源码音频对话源码遇到问题解决方案 先看效果 视频对话源码 虽然是vue项目&#xff0c;但是我卸载了主页的index页面&#xff0c;仅仅为了测试&#xff0c; <!DOCTYPE html> <html lang"en"> <head><meta charset"…

IDEA debug 断点调试技巧

1、首先看下IDEA中Debug模式下的界面&#xff1a; ① 以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ② 断点&#xff1a;在左边行号栏单击左键&#xff0c;或者快捷键Ctrl…

ceph用户认证

Cephx认证机制 ceph使用cephx协议对客户端进行身份认证 cephx用于对ceph保存的数据进行认证访问和授权&#xff0c;用于对访问ceph的请求进行认证和授权检测&#xff0c;于mon通信的请求都要经过ceph认证通过&#xff0c;但是也可以在mon节点关闭cephx认证&#xff0c;但是关…

Android AccessibilityService 实现《李跳跳》功能

AccessibilityService&#xff08;无障碍服务&#xff09;是 Android 操作系统中的一个功能&#xff0c;旨在帮助用户具有视觉、听觉或运动上的障碍更轻松地使用设备。它是 Android 提供的一种特殊服务&#xff0c;可以接收设备上发生的各种事件&#xff0c;并提供自定义的反馈…