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结束。
核心特性一:PagedAttention 的块级内存管理
PagedAttention借鉴操作系统虚拟内存的分页机制。每个请求的KV Cache不再要求连续物理空间,而是以固定大小的块(默认16个token/块)为单位分配。块表维护逻辑块到物理块的映射,当请求生成新token时,仅需追加一个逻辑块,物理块可从全局空闲池中任意选取。
这一机制带来三个直接收益:
- 消除内部碎片:传统方式按最大序列长度预留显存,而PagedAttention按实际生成量分配,显存浪费从平均50%降至接近0%。
- 支持KV Cache共享:当多个请求共享相同前缀(如多轮对话的system prompt),块表可指向同一物理块,实现跨请求的KV复用,节省70%以上的前缀计算。
- 天然支持抢占与驱逐:当显存不足时,调度器可驱逐低优先级请求的块,将其写入CPU内存,待资源释放后再恢复,无需重启整个推理过程。
--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 |
误区与复盘:常见认知偏差
实际上,即使短请求(如20 token),PagedAttention的块分配开销极低(微秒级),而Continuous Batching带来的吞吐提升对所有场景都有益。短请求场景下vLLM相比TGI仍有30%~50%吞吐优势。
实际中,多轮对话的system prompt、few-shot示例、检索增强的上下文前缀都高度相似。vLLM的自动前缀缓存(automatic prefix caching)可检测公共前缀并复用,无需手动指定。
复盘要点:vLLM并非万能。当请求长度极度均匀且并发极低时,其优势不明显;当模型本身不支持PagedAttention(如某些自定义算子)时,需回退到传统模式。但作为生产级推理框架,vLLM在吞吐优先的场景下已成为事实标准。理解其内存调度哲学,是后续调优--max-num-batched-tokens、--block-size等参数的基础。