2、vLLM基础:vLLM架构、核心特性、与常见推理框架的对比

2.1 为什么需要专门的推理引擎

大语言模型(LLM)的推理与传统的深度学习模型推理有本质区别。传统模型(如ResNet、BERT)的推理通常是固定形状、低延迟、高吞吐的请求-响应模式;而LLM推理是自回归生成过程,每个请求需要循环执行“前向传播→采样→更新KV Cache→再次前向传播”,直到生成结束符。这种动态性带来了三个核心挑战:

  • 显存管理复杂:每个请求的KV Cache大小随生成长度动态增长,无法预分配固定空间,容易产生碎片化浪费。
  • 调度开销大:不同请求的生成进度不同,若按批次同步等待最慢的请求,会造成大量GPU空闲。
  • 吞吐瓶颈明显:朴素实现下,GPU算力利用率低,尤其在长序列生成时,访存带宽成为主要瓶颈。

vLLM正是为解决这些问题而设计的高性能LLM推理引擎,其核心目标是:在保证低延迟的同时,最大化GPU吞吐量。

关键认知:LLM推理是“访存密集型”而非“计算密集型”任务。生成每个token时,需要读取整个模型权重(数GB),但只产生少量计算。因此,减少显存浪费、提高批大小是提升吞吐的核心手段。

2.2 vLLM核心架构:PagedAttention与Continuous Batching

vLLM的架构创新集中在注意力机制和调度器两个层面。其最核心的突破是PagedAttention——一种受操作系统虚拟内存分页机制启发的KV Cache管理方案。

vLLM 核心架构:PagedAttention + Continuous Batching 请求队列 Req A: "今天天气如何?" Req B: "写一首关于AI的诗" Req C: "解释量子纠缠" 调度器 Continuous Batching 动态组批/抢占 显存感知调度 KV Cache 管理器 PagedAttention 分页机制 逻辑块 0 逻辑块 1 逻辑块 2 逻辑块 3 物理显存块 块 7 块 3 块 1 块 9 块表映射 GPU 批量推理(一次前向传播处理多个请求) Req A (token 5) KV: 块0→块7 Req B (token 12) KV: 块1→块3 Req C (token 3) KV: 块2→块1 新请求随时加入 无需等待当前批次完成 与传统KV Cache管理的对比 传统方式:预分配连续显存 • 每个请求预留最大长度空间 → 大量浪费 • 显存碎片化严重,批大小受限 • 实际利用率通常仅 20% ~ 40% • 无法支持超长序列生成 vLLM:按需分页分配 • 按需分配物理块,利用率可达 90%+ • 块表映射支持非连续显存 • 支持请求级抢占与动态优先级 • 吞吐量提升 2~4 倍(官方数据)

上图展示了vLLM的核心机制。左侧的请求队列中的多个请求(Req A/B/C)进入调度器后,调度器采用Continuous Batching策略:当一个请求生成完成,立即从队列中拉入新请求,而不是等待整个批次结束。每个请求的KV Cache被划分为固定大小的逻辑块,通过块表映射到物理显存中的任意位置(如逻辑块0→物理块7),从而彻底解决了显存碎片化问题。

2.3 核心特性清单

特性 说明 对压测的影响
PagedAttention 分页KV Cache管理,显存利用率高 支持更大并发批大小,吞吐上限高
Continuous Batching 请求级动态调度,无需等待整批完成 吞吐曲线更平滑,尾延迟降低
Prefix Caching 自动缓存公共前缀的KV Cache 多轮对话/系统提示词场景收益明显
量化支持 GPTQ/AWQ/FP8等量化格式 降低显存占用,但可能影响精度
张量并行 多GPU分片模型权重 压测需考虑跨卡通信开销
流式输出 支持token级流式返回 压测需模拟流式接收逻辑

2.4 与常见推理框架的对比

在生产环境选型时,需要综合评估吞吐、延迟、易用性和生态。下表对比了当前主流的LLM推理框架:

维度 vLLM TensorRT-LLM HuggingFace TGI llama.cpp
核心优势 PagedAttention,吞吐高,易用 NVIDIA深度优化,延迟极低 生态好,功能全 CPU/边缘设备友好
显存管理 分页机制,利用率高 静态KV Cache规划 连续缓存,有碎片 简单分配
批处理策略 Continuous Batching In-flight Batching Continuous Batching 无/简单批处理
GPU支持 NVIDIA/AMD/华为等 仅NVIDIA NVIDIA为主 CPU/Apple Silicon
编译优化 无(PyTorch eager模式) 图编译+算子融合 部分优化 C++手工优化
生产成熟度 高(OpenAI等使用) 高(NVIDIA官方) 中高 中(偏研究)
选型误区:不要盲目认为“TensorRT-LLM一定比vLLM快”。实际压测中,吞吐量取决于批大小、序列长度分布、显存容量等多因素。在长序列、高并发场景下,vLLM的PagedAttention往往能获得更高吞吐;而在短序列、追求极致延迟的场景,TensorRT-LLM可能更优。务必以真实压测数据为准。

2.5 压测视角的关键理解

从压测工程师的角度,理解vLLM架构有助于设计更合理的测试方案:

  1. 吞吐瓶颈通常在显存而非算力:压测时需监控KV Cache使用率和GPU显存占用,而非仅看GPU利用率。
  2. 批大小是动态的:Continuous Batching意味着实际并发数会波动,压测工具需支持动态请求注入,而非固定并发。
  3. 前缀缓存影响结果:若压测数据包含相同系统提示词,vLLM会缓存前缀,导致后续请求更快。压测时应设计前缀多样性场景。
  4. 首token延迟与生成延迟分离:vLLM的调度策略会影响首token延迟(TTFT),压测指标需分别统计TTFT和TPOT(每token生成时间)。
压测参数建议:使用vLLM的--max-num-seqs参数控制最大批大小,--gpu-memory-utilization控制显存利用率(默认0.9)。压测时建议将显存利用率调至0.85~0.95,观察不同批大小下的吞吐曲线,找到最佳吞吐点。

2.6 常见误区与复盘

在实际压测项目中,以下误区反复出现,值得特别注意:

  • 误区一:用固定并发数压测。vLLM的Continuous Batching使得实际处理中的请求数动态变化,固定并发无法反映真实吞吐能力。应使用恒定请求速率(QPS)或队列长度作为控制变量。
  • 误区二:忽略输入/输出长度分布。vLLM的显存分配与序列长度强相关。若压测使用固定长度(如128输入+128输出),结果无法代表真实场景。应使用真实业务日志中的长度分布。
  • 误区三:只测吞吐不测延迟分布。高吞吐下可能出现长尾延迟(P99极高)。压测报告应同时包含吞吐(tokens/s)和延迟分位数(TTFT/TPOT的P50/P95/P99)。
  • 误区四:跨框架对比不公平。不同框架的默认配置不同(如批大小上限、量化格式),对比时应统一模型、精度、硬件、请求分布,并分别调优各框架参数。