| 编辑推荐: |
文章主要介绍了大语言模型在生产环境部署时面临的挑战,并详细讲解了高性能推理框架 vLLM 如何通过三大关键技术来解决这些挑战, 希望对你的学习有帮助。
本文来自于知乎,由火龙果软件Alice编辑推荐。 |
|
大模型应用正在飞速发展:从聊天机器人(Chatbot)、智能客服,到 AI 写作、代码助手,它们已经融入到我们日常的工作与生活中。
但当我们真正把大模型“搬到生产环境”时,往往会撞上两个难题:
显存不够用:模型本身能跑,但一旦上下文变长,显存占用就迅速膨胀,甚至直接报错 Out Of Memory;
并发不高效:多个用户同时请求时,GPU 资源并未被充分利用,请求排队导致延迟体验差。
一、大模型推理的挑战
大模型的推理表面上是输入 Prompt,输出 Respone。但背后隐藏着多重挑战。
1. Prefill & Decode 的差异性
推理可以拆分为两个阶段:
- Prefill 阶段 :一次性处理用户输入的完整 prompt,算力开销集中且巨大。
- Decode 阶段 :逐 token 生成输出,每次计算量小,但需要频繁访问和新增 KV Cache,显存开销持续增长。
这意味着:Prefill 阶段的问题是算力, Decode 阶段的瓶颈是显存 ,两者对系统的要求完全不同,很难用统一的调度与资源管理策略兼顾。
2. 动态请求场景下的调度难题
在线服务场景中,请求是随时到来的:
- 有的请求只生成几十个 token,很快结束。
- 有的请求可能要生成几千个 token,长期占用显存和算力。
如果调度不合理:
- 短请求 会被“拖慢”,延迟上升,用户体验差。
- 长请求 可能“霸占资源”,导致其他用户的任务无法及时调度。
3. KV Cache 的显存瓶颈
每个 token 的推理都需要存储对应的 KV Cache 。
- 上下文越长,占用显存越大;
- 多个请求并发时,显存消耗会急剧膨胀;
- 如果显存不足,系统只能淘汰一些KV Cache,然后重算,但这会带来 性能下降 。
大模型推理复杂性来自 算力差异、请求动态性 和 显存瓶颈 ,系统必须在 算力、显存、调度 三者间做精细化优化。
二、推理框架的演进
大模型推理框架 的发展经历了从 易用到高效 的演进:
- Hugging Face Transformers :易用为主 简单易用、生态成熟,但长上下文和高并发场景下,吞吐率和显存利用率有限。
- DeepSpeed-Inference / FasterTransformer:算子级优化通过内核优化和 算子融合加速推理,但仍难解决:
- KV Cache 的高效管理(长上下文显存膨胀);
- 动态批处理(在线请求随时到达的调度问题)。
正是针对这些挑战, vLLM 从系统层重新设计推理引擎,引入 动态批处理、PagedAttention 和 前缀共享 ,实现高吞吐、高并发、高显存利用率。
什么是 vLLM?
vLLM 是由 UC Berkeley 团队开源的一个 大模型推理框架 (Serving Framework),它的目标是让大语言模型(LLM)在推理时更高效,特别是在 高并发、多请求、长上下文 等场景下。
vLLM 的三大关键技术:
- PagedAttention: 像操作系统虚拟内存一样管理 KV cache,解决显存碎片问题。
- Continuous Batching: 动态批处理机制,让新请求能随时加入,提升吞吐与并发。
- Prefix Sharing: 相同前缀的请求共享 KV Cache,减少重复计算。
从而解决了显存碎片问题、KV Cache 不能复用的问题,在相同的延时水平下,vllm 是FastTransformer 的 2~4 倍。
PagedAttention
在大模型推理中, KV Cache 是加速生成的核心机制 。它存储了历史上下文的注意力信息,使模型在 decode 阶段无需重新计算整个上下文的注意力,从而大幅提升推理效率。
然而,传统框架在管理 KV Cache 时存在几个明显痛点:
1. 内部显存碎片
短请求仍然必须占用最大生成长度(max new token)显存空间,导致大量内存被闲置,利用率低。
假设模型context length 为 2048,max new token 为 512。如下述例子,浪费 505
个 token 显存空间。
2. 外部显存碎片
不同请求的长度和生命周期不一致,显存中容易形成零散空洞。显存分配器 很难找到连续大块显存,可能引发 OutOfMemory。
假设 request 3 推理完成后,释放了物理显存空间,但是未来的请求,如 request 5 等需要的显存空间比 request 3释放的空间大,request 3 释放的空间就成为了外部碎片。
3. KV Cache 无法复用
每个请求的 KV Cache 都是独立分配且独占使用的 。即使两个请求(例如 request 1 和 request 2)的 prompt 存在相同的前缀部分,这些已经计算好的 KV Cache 也无法共享或复用,只能重复计算并各自存储一份。
vLLM 提出的 PagedAttention 技术巧妙借鉴了操作系统的 分页机制 :
- 拆分KV Cache :把每个请求的 KV Cache 分成固定大小(如16个token)的逻辑页。
- 灵活分配 :不同请求可以按需申请页,不需要大块的连续物理显存。
- 页表管理 :每个请求维护一个页表,记录它的 KV cache 存在哪些物理页里。注意力计算时通过页表将这些小页拼接起来使用。
优势:
- 避免显存碎片 :零散小页可以灵活复用,不会出现大块空洞无法使用的情况。
- 显存利用率高 :短请求只占用实际需要的页数,不浪费资源。
Prefix Sharing
在大模型推理中,不同请求的 prompt 往往有相同的前缀。例如:
- request 1: “写一首诗,主题是春天,风格模仿李白”
- Request 2: “写一首诗,主题是春天,风格模仿杜甫”
传统方法会重复计算和存储前缀的 KV Cache,浪费显存。
vLLM 的 Prefix Sharing 技术正是为了解决这一问题。其核心思路是:
- 借助 PagedAttention 的分页机制,把 KV Cache 划分成固定大小的逻辑页。
- 用这些逻辑页构建一棵 前缀树(Prefix Tree) 。相同前缀的请求共享同一组物理页,不再重复存储。
- 当请求在共享前缀之后生成了不同的 token,就会触发 Copy-on-Write(写时复制) :共享的逻辑页保持不变,新的 token 会写入一份复制出的新页,从而在前缀树中分叉。
优势:
- 节省显存 :相同前缀只保留一份 KV Cache。
- 减少计算 :前缀部分只需计算一次。
- 保证正确性 :通过 Copy-on-Write,让分叉后的请求互不干扰。
Continuous Batching
在传统推理框架里,batch 通常是 静态批处理(Static Batching) :
- 一个 batch 中的所有请求必须同时交给 GPU 执行。
- 如果某些请求先完成,其余请求仍在生成,那么 batch 中空闲的位置就浪费了。
- 新来的请求需要等到当前 batch 完成后才能被处理,延迟增加。
举个例子:
request 1 生成 10 个 token 就完成了,request 2 生成 1000 个 token 才完成。当 request 1 在第 10 步完成后,它在 batch 里对应的 slot 会空出来,但这部分计算资源不会自动被新请求利用。
结果就是:
- 吞吐率下降:GPU 有空闲却不能马上服务新请求 。
- 延迟增加:新请求必须等 batch 完成 。
vLLM 引入了 Continuous Batching ,允许 不同的请求同时在一个 batch 中运行 :
- 已在 decode 阶段的老请求,和刚进入 prefill 阶段的新请求,可以放在同一个 batch 里计算。
- 当一个请求完成时,它占用的 slot 会立即被回收,新请求可以立刻加入 batch,而不用等待整个 batch 完成。
- batch 的大小是 动态变化 的,始终保持 GPU 尽可能满负荷运行。
优势:
- 高吞吐 :GPU 始终保持高利用率。
- 低延迟 :新请求无需等待,随时可以插入。
- 更灵活的调度 :不同长度的请求能混合执行,避免长请求拖慢整体速度。
三、KV Cache 淘汰策略
在 vLLM 中,KV Cache 是推理加速的关键,但显存有限,需要动态管理。系统采用 分页管理和淘汰策略 ,核心逻辑如下:
- 分页管理 :KV Cache 按固定大小逻辑页分配,每页存储若干 token KV Cache。
- 显存不足时交换 :当 GPU 显存不足时,部分 KV Cache 页会被 换出到 CPU 内存 ,释放 GPU 显存供新请求使用。
- 内存不足时淘汰 :如 CPU 内存也不足,使用淘汰策略如 LRU,丢弃相应的 KV Cache 页。
- 需要时重新计算 :被丢弃的 KV Cache 页在后续生成新 token 时,会 重新计算 ,保证推理正确性。
vLLM 通过系统级优化,引入了 PagedAttention、Prefix Sharing、Continuous Batching 和 KV Cache 淘汰策略 ,形成高性能推理方案:
- PagedAttention :将 KV Cache 分页管理,按需分配逻辑页,解决内部与外部显存碎片问题。
- Prefix Sharing :相同前缀请求共享 KV Cache,节省显存并减少重复计算,分叉时通过 Copy-on-Write 保证正确性。
- Continuous Batching :动态批处理机制,让新请求随时加入正在执行的 batch,提高 GPU 利用率 并 降低请求延迟。
- KV Cache 淘汰策略 :显存不足时先换到 CPU 内存,内存不足时再淘汰,必要时重新计算。
通过这些技术,vLLM 能在 高并发、长上下文 场景下,实现 显存高效利用、高吞吐量 和 低延迟 。vLLM 成为生产环境的高性能推理 框架。
四、 如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
最先掌握AI的人,将会比较晚掌握AI的人有竞争优势。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。 |