十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

vLLM 实战:从 PagedAttention 到连续批处理的推理加速全攻略

vLLM 实战:从 PagedAttention 到连续批处理的推理加速全攻略 这里写自定义目录标题欢迎使用Markdown编辑器一、为什么推理成了大模型落地的最后瓶颈二、PagedAttention操作系统式的 KV Cache 管理生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能丰富你的文章UML图表流程图FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好 这是你第一次使用# vLLM 实战从 PagedAttention 到连续批处理的推理加速全攻略一、为什么推理成了大模型落地的最后瓶颈大模型在对话、代码生成等任务上展现了惊人的能力但它的推理阶段正成为规模化部署的拦路虎。以 70B 参数规模的模型为例仅单次生成就需要约 140GB 显存BF16 精度即便用 A100 80GB 也需要双卡而 token 生成速率往往低于 20 tokens/s。如果不做优化每百万次对话的 GPU 成本就可能高达数千美元。推理的高延迟、高显存占用直接卡住了大模型从能用走向好用、用得划算的最后一段路。要理解推理优化的着力点先要看清推理阶段的两个阶段。大模型生成分为预填充Prefill——一次性处理输入 Prompt 并计算出首个输出 token以及自回归解码Decoding——逐个生成后续 token。解码阶段每生成一个新 token都需要读取全部历史 token 的键值Key-Value向量。假设序列长度 2048、batch size 3270B 模型的 KV Cache 很容易超过 50GB。更严峻的是不同请求的序列长度差异巨大传统静态批处理必须等待最长序列完成才能返回导致 GPU 利用率常常不足 30%。明确地说LLM 推理是内存密集型而非计算密集型——GPU 内存带宽是主要瓶颈。理解了这一点你就能明白为什么推理优化的核心几乎都围绕显存管理展开。二、PagedAttention操作系统式的 KV Cache 管理vLLM 能成为生产级推理服务的事实标准最关键的技术突破是PagedAttention——它借鉴了操作系统虚拟内存的分页机制来管理 KV Cache。传统实现中每个请求的 KV Cache 是连续分配的大块内存还要为可能的后续增长预留空间导致 40%-60% 的显存被浪费。PagedAttention 把 KV Cache 划分为固定大小的物理块如 16 tokens/block不同请求的块可以离散存储通过块表映射实现逻辑连续。这带来了三重收益消除碎片化块按需分配与回收显存利用率从传统方式的 30%-50% 提升到 90% 以上支持前缀共享相同前缀的请求可以共享页表减少重复计算这对固定系统提示 用户可变输入的服务场景收益巨大支持抢占与恢复长请求可以被挂起释放显存短请求插队完成后恢复配合调度策略提升整体吞吐。下面给出 PagedAttention 的伪代码帮助理解其核心逻辑defpaged_attention(query,key_cache,value_cache,page_table):# 按页表索引获取数据而非连续内存keysgather_pages(key_cache,page_table)valuesgather_pages(value_cache,page_table)# 标准注意力计算scoressoftmax(query keys.T,dim-1)returnscores values ## 三、连续批处理让 GPU 永远满负荷显存管理之外**调度策略**是另一块重要拼图。传统静态批处理的问题在于一批请求必须等最长的那个生成完才一起返回短的干等GPU 空转。 vLLM 采用的**连续批处理Continuous Batching**则完全不同它放弃固定 batch每次迭代后检查哪些请求已完成、哪些新请求已到达动态调整 batch 组成。这样 GPU 始终在处理可运行的序列尤其适合在线场景请求长度差异大。配合 PagedAttention 的抢占式调度长请求可以挂起恢复不会阻塞短请求。实测中这种策略能把 GPU 利用率保持在80%以上相比传统方法提升3-4倍吞吐。## 四、量化用精度换显存与速度如果说显存管理和调度是省内存、提利用那么量化就是直接给模型减负。模型权重默认是 FP16每参数2字节量化把它压缩到更低精度-**INT8**每参数1字节模型大小减半--**INT4**每参数0.5字节模型大小缩至1/4--**FP8**在现代 GPUH100/Blackwell上误差略高于 INT8但性能更高常与 Tensor Core 配合使用。 量化的主要方式有**AWQ、GPTQ**等其原理是对权重做精度压缩同时尽量保留关键权重的精度以减少质量损失。工程上通常需要评估精度下降是否可接受——对多数生成任务INT8 量化带来的质量损失微乎其微而显存和速度收益立竿见影。## 五、vLLM 快速部署实战纸上谈兵不如跑一个真实的。下面是用 vLLM 部署一个开源模型的完整流程 bash# 1. 安装 vLLMpip install vllm# 2. 启动 OpenAI 兼容的推理服务python-m vllm.entrypoints.openai.api_server \--model meta-llama/Meta-Llama-3-8B-Instruct \--tensor-parallel-size2\# 使用 2 张 GPU 做张量并行--gpu-memory-utilization0.90\# 显存使用率--max-model-len8192\--enable-prefix-caching \# 开启前缀缓存--quantization awq \# 量化方式--port8000 启动后客户端可以用标准 OpenAI SDK 调用 pythonfromopenaiimportOpenAI clientOpenAI(base_urlhttp://localhost:8000/v1,api_keytoken-abc123)respclient.chat.completions.create(modelmeta-llama/Meta-Llama-3-8B-Instruct,messages[{role:user,content:解释一下什么是 RAG}],max_tokens1024,temperature0.7)print(resp.choices[0].message.content) 几个关键参数值得单独说明-**--gpu-memory-utilization**建议0.85-0.92太高容易因显存不足导致 OOM太低则浪费显存--**--enable-prefix-caching**当系统提示固定、用户输入变化时务必开启前缀共享能显著降低重复计算--**--tensor-parallel-size**按 GPU 数量设置多卡时把模型权重切分到多张卡上并行计算--**--quantization**可选 awq/gptq/fp8需要与模型权重的量化格式匹配。## 六、监控与压测别让优化变成“玄学”很多团队把 vLLM 跑起来就以为完事了这是大忌。推理服务上线后吞吐、延迟、显存占用都会随负载波动没有监控就是盲飞。至少要有四个维度的监控指标-**吞吐Tokens/s**单位时间生成的 token 总量反映整体产能--**首 token 延迟TTFT**用户发起请求到收到第一个 token 的时间决定交互体感--**每 token 延迟TPOT**后续每个 token 的生成间隔反映解码流畅度--**显存利用率与排队队列长度**反映资源是否吃紧、是否需要扩容。 压测工具方面vLLM 自带 benchmark 脚本benchmark_serving.py可以模拟多路并发请求输出吞吐与延迟分布是评估“优化到底提了多少”的标准手段。我的建议是**每次改动配置或模型后都跑一次压测基线**用数据说话而不是靠感觉判断“快没快”。 这里还要提醒一个常见的排查顺序。当线上出现“响应变慢”时不要一上来就怀疑模型按这个顺序排查往往事半功倍① 先看排队队列——是不是并发超了② 再看显存——是不是 KV Cache 占满导致频繁抢占③ 再看 batch 大小——是不是调度参数不合理④ 最后才看算子与内核——是不是版本兼容或设备驱动问题。绝大多数“变慢”都出在前三层动后两层反而可能引入新问题。## 七、把优化组合起来而不是单点突进最后想强调一个工程视角推理优化是一个**系统工程**不能靠单点突破。PagedAttention 解决显存碎片、连续批处理解决调度效率、量化解决模型体积、前缀缓存解决重复计算——它们彼此配合才能把端到端吞吐提升5-10倍。 对团队的落地建议是先用默认配置跑通用压测工具如 vLLM 自带的 benchmark找出瓶颈在显存、带宽还是调度再针对性地逐项开启优化。优化的顺序建议是先开前缀缓存成本最低、收益明显再调显存利用率和批处理大小最后根据精度容忍度决定是否上量化。循序渐进才能让每一分优化投入都花在刀刃上。**Markdown编辑器**所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章了解一下Markdown的基本语法知识。## 新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持除了标准的Markdown编辑器功能我们增加了如下几点新功能帮助你用它写博客1.**全新的界面设计**将会带来全新的写作体验2.在创作中心设置你喜爱的代码高亮样式Markdown**将代码片显示选择的高亮样式**进行展示3.增加了**图片拖拽**功能你可以将本地的图片直接拖拽到编辑区域直接展示4.全新的**KaTeX数学公式**语法5.增加了支持**甘特图的mermaid语法[^1]**功能6.增加了**多屏幕编辑**Markdown文章功能7.增加了**焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置**等功能功能按钮位于编辑区域与预览区域中间8.增加了**检查列表**功能。[^1]:[mermaid语法说明](https://mermaid.js.org/intro/)## 功能快捷键撤销kbdCtrl/Command/kbdkbdZ/kbd重做kbdCtrl/Command/kbdkbdY/kbd加粗kbdCtrl/Command/kbdkbdB/kbd斜体kbdCtrl/Command/kbdkbdI/kbd标题kbdCtrl/Command/kbdkbdShift/kbdkbdH/kbd无序列表kbdCtrl/Command/kbdkbdShift/kbdkbdU/kbd有序列表kbdCtrl/Command/kbdkbdShift/kbdkbdO/kbd检查列表kbdCtrl/Command/kbdkbdShift/kbdkbdC/kbd插入代码kbdCtrl/Command/kbdkbdShift/kbdkbdK/kbd插入链接kbdCtrl/Command/kbdkbdShift/kbdkbdL/kbd插入图片kbdCtrl/Command/kbdkbdShift/kbdkbdG/kbd查找kbdCtrl/Command/kbdkbdF/kbd替换kbdCtrl/Command/kbdkbdG/kbd## 合理的创建标题有助于目录的生成直接输入1次kbd#/kbd并按下kbdspace/kbd后将生成1级标题。输入2次kbd#/kbd并按下kbdspace/kbd后将生成2级标题。以此类推我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。## 如何改变文本的样式*强调文本*_强调文本_**加粗文本**__加粗文本__标记文本~~删除文本~~引用文本 H~2~Ois是液体。2^10^运算结果是1024.## 插入链接与图片链接:[link](https://www.csdn.net/).图片:![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw)带尺寸的图片:![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw30x30)居中的图片:![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center)居中并且带尺寸的图片:![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center 30x30)当然我们为了让用户更加便捷我们增加了图片拖拽功能。## 如何插入一段漂亮的代码片去[博客设置](https://mp.csdn.net/console/configBlog)页面选择一款你喜欢的代码片高亮样式下面展示同样高亮的 代码片.javascript//An highlighted block var foobar;生成一个适合你的列表项目项目项目项目1项目2项目3计划任务完成任务创建一个表格一个简单的表格是这么创建的项目Value电脑$1600手机$12导管$1设定内容居中、居左、居右使用:---------:居中使用:----------居左使用----------:居右第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPantsSmartyPants 是一个文本转换工具主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如原始符号转换后说明引号“引号”直引号变弯引号单引号‘单引号’直单引号变弯单引号--–两个连字符变短破折号---—三个连字符变长破折号...…三个点变省略号创建一个自定义列表MarkdownText-to-HTMLconversion toolAuthorsJohnLuke如何创建一个注脚一个具有注脚的文本。1注释也是必不可少的Markdown将文本转换为HTML。KaTeX数学公式您可以使用渲染LaTeX数学表达式 KaTeX:Gamma公式展示Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n\in\mathbb NΓ(n)(n−1)!∀n∈N是通过欧拉积分Γ ( z ) ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) \int_0^\infty t^{z-1}e^{-t}dt\,.Γ(z)∫0∞​tz−1e−tdt.你可以找到更多关于的信息LaTeX数学表达式here.新的甘特图功能丰富你的文章2014-01-072014-01-092014-01-112014-01-132014-01-152014-01-172014-01-192014-01-21已完成进行中计划一计划二现有任务Adding GANTT diagram functionality to mermaid关于甘特图语法参考 这儿,UML图表可以使用UML图表进行渲染例如下面产生的一个序列图王五李四张三王五李四张三李四想了很长时间, 文字太长了不适合放在一行.你好李四, 最近怎么样?你最近怎么样王五我很好谢谢!我很好谢谢!打量着王五...很好... 王五, 你怎么样?关于UML图表语法参考 这儿,流程图链接长方形圆圆角长方形菱形关于Mermaid语法参考 这儿,FLowchart流程图我们依旧会支持flowchart.js的流程图语法Created with Raphaël 2.3.0开始我的操作确认结束yesno关于Flowchart流程图语法参考 这儿.导出与导入导出如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到文章导出生成一个.md文件或者.html文件进行本地保存。导入如果你想加载一篇你写过的.md文件在上方工具栏可以选择导入功能进行对应扩展名的文件导入继续你的创作。注脚的解释 ↩︎
返回列表