vLLM基础:架构、核心特性与传统推理框架对比

核心原理:从“按请求隔离”到“全局调度”的架构跃迁

传统推理框架(如Triton Server、TensorFlow Serving)通常采用静态批处理模式:请求到达后,要么等待攒够一个batch再执行,要么立即执行但独占GPU资源。这种模式在请求到达率不均匀时,会造成GPU算力闲置或排队延迟飙升。vLLM的核心突破在于将KV Cache管理从“请求私有”转变为“全局可调度”,配合Continuous Batching(连续批处理)实现微秒级的请求插队与退出。

vLLM的架构可拆解为四个关键层次:

  • 调度器(Scheduler):维护全局等待队列与运行序列,每次迭代决定哪些请求进入GPU计算,哪些请求的KV Cache可以被驱逐或复用。
  • KV Cache管理器(PagedAttention核心):将KV Cache划分为固定大小的“块”(block),通过块表(block table)实现物理内存的按需分配,而非传统连续内存预留。
  • 模型执行器(Model Executor):负责将当前批次的所有token前向计算,支持张量并行与流水线并行。
  • 采样与输出层:对每个请求独立采样,完成后立即释放其占用的块,无需等待整个batch结束。
关键认知:vLLM不是“更快的推理引擎”,而是“更聪明的内存调度器”。其性能提升主要来源于将GPU显存利用率从传统方法的40%~60%提升至90%以上,从而允许更大的batch size和更高的吞吐。
vLLM 核心架构与 PagedAttention 内存管理 请求队列 Req A (seq_len=128) Req B (seq_len=512) Req C (seq_len=64) 调度器 Continuous Batching 迭代级调度 抢占/驱逐策略 块表 (Block Table) 逻辑块 → 物理块映射 每个请求独立维护 支持非连续物理内存 GPU 物理 KV 块池 块0 块1 块2 ← Req A 块3 块4 块5 ← Req B(非连续块) 块6 ← Req C 空闲 传统方式 预留连续显存 内部碎片浪费 无法共享KV Cache 利用率仅40%~60% 模型执行器 批量前向计算 采样输出 完成即释放块 PagedAttention:逻辑块与物理块分离,按需分配,支持前缀共享

核心特性一:PagedAttention 的块级内存管理

PagedAttention借鉴操作系统虚拟内存的分页机制。每个请求的KV Cache不再要求连续物理空间,而是以固定大小的块(默认16个token/块)为单位分配。块表维护逻辑块到物理块的映射,当请求生成新token时,仅需追加一个逻辑块,物理块可从全局空闲池中任意选取。

这一机制带来三个直接收益:

  1. 消除内部碎片:传统方式按最大序列长度预留显存,而PagedAttention按实际生成量分配,显存浪费从平均50%降至接近0%。
  2. 支持KV Cache共享:当多个请求共享相同前缀(如多轮对话的system prompt),块表可指向同一物理块,实现跨请求的KV复用,节省70%以上的前缀计算。
  3. 天然支持抢占与驱逐:当显存不足时,调度器可驱逐低优先级请求的块,将其写入CPU内存,待资源释放后再恢复,无需重启整个推理过程。
实践提示:vLLM的--max-num-seqs参数控制最大并发序列数,而--gpu-memory-utilization决定GPU显存用于KV Cache的比例(默认0.9)。调优时优先增大后者,观察吞吐变化。

核心特性二:Continuous Batching 的迭代级调度

传统静态批处理必须等待批次内所有序列生成完毕才能释放资源。Continuous Batching将调度粒度从“请求级”细化为“token级”:每个前向迭代(iteration)结束后,调度器立即检查是否有请求已完成,若有则将其移出批次,并从未完成队列中挑选新请求补入。

这种机制的效果是:

  • GPU始终在处理“最需要计算”的token,而非等待慢请求。
  • 新到达的请求平均等待时间从秒级降至毫秒级。
  • 吞吐量(tokens/s)相比静态批处理提升2~4倍,尤其在请求长度差异大的场景下效果更显著。

案例:混合负载下的吞吐对比

假设GPU显存为40GB,模型为LLaMA-13B(KV Cache约需1.2GB/1k token)。传统框架预留连续显存,最多同时处理8个请求(每个预留5GB);vLLM按需分配,可同时处理32个请求,且当短请求(如“你好”)完成时立即释放资源给长请求(如“写一篇2000字文章”)。

指标 传统静态批处理 vLLM (PagedAttention + Continuous Batching)
显存利用率 ~45% ~92%
最大并发请求数 8 32
平均请求延迟(P50) 2.8s 1.1s
吞吐量(tokens/s) 1,200 4,800
长请求尾延迟(P99) 9.5s 3.2s

误区与复盘:常见认知偏差

误区1:vLLM只适合长文本场景。
实际上,即使短请求(如20 token),PagedAttention的块分配开销极低(微秒级),而Continuous Batching带来的吞吐提升对所有场景都有益。短请求场景下vLLM相比TGI仍有30%~50%吞吐优势。
误区2:KV Cache共享只对前缀完全相同有效。
实际中,多轮对话的system prompt、few-shot示例、检索增强的上下文前缀都高度相似。vLLM的自动前缀缓存(automatic prefix caching)可检测公共前缀并复用,无需手动指定。

复盘要点:vLLM并非万能。当请求长度极度均匀且并发极低时,其优势不明显;当模型本身不支持PagedAttention(如某些自定义算子)时,需回退到传统模式。但作为生产级推理框架,vLLM在吞吐优先的场景下已成为事实标准。理解其内存调度哲学,是后续调优--max-num-batched-tokens、--block-size等参数的基础。