vLLM:大语言模型推理与服务库
vLLM 是由加州大学伯克利分校天空计算实验室最初研发、现由学术界和工业界共同贡献的社区驱动型大语言模型推理与服务库,核心定位为简单、高速、低成本的 LLM 服务工具,其核心特性围绕极致的推理性能和高度的灵活性与易用性两大维度展开,同时具备跨硬件、易集成的工程化优势,以下是基于官方文档的详细特性解析:
一、极致的推理性能:业内领先的吞吐量与效率
vLLM 实现了 state-of-the-art 的服务吞吐量,核心依托一系列创新技术和底层优化,从内存管理、请求调度、模型执行等全链路提升推理效率:
PagedAttention:注意力键值内存的高效管理
这是 vLLM 的核心创新技术,借鉴操作系统虚拟内存管理思想,将注意力机制的 Key/Value(KV)缓存分割为固定大小的物理块,通过页表映射实现逻辑序列与物理存储的解耦,彻底解决传统连续内存分配带来的显存碎片问题,将 KV 缓存利用率提升至 90% 以上,同时支持动态按需分配和回收内存块,大幅提升并发处理能力,降低长上下文推理时的显存溢出风险。
连续批处理(Continuous batching)
打破传统静态批处理 “请求需同时完成” 的限制,以token 生成迭代为单位进行请求调度,当一个请求完成后,其资源会被立即释放并分配给新的待处理请求,彻底解决 “头阻塞” 问题,最大化 GPU / 硬件资源利用率,即使面对长度差异极大的混合请求,也能保持稳定的高吞吐量。
CUDA/HIP Graph 加速模型执行
针对 GPU 推理中频繁的核函数(kernel)启动开销问题,通过 CUDA/HIP Graph 将重复的计算步骤 “捕获并复用”,首次执行时记录完整的 kernel 调用序列,后续相同规模的推理直接重放该序列,消除 99% 的 kernel 启动开销,仅保留计算本身耗时,让模型执行更高效。
全面的量化支持
兼容主流的量化方案和精度,包括 GPTQ、AWQ 两种专用量化算法,以及 INT4、INT8、FP8 通用量化精度,在几乎不损失模型效果的前提下,大幅降低显存占用,提升推理速度,适配不同显存预算的硬件环境。
高度优化的 CUDA 内核
深度集成 FlashAttention、FlashInfer 等业内顶尖的注意力计算优化库,同时定制化开发 PagedAttention 专属 CUDA 内核,适配分页式 KV 缓存的非连续内存访问特性,实现注意力计算的并行化和内存合并访问,进一步降低计算延迟。
投机解码(Speculative decoding)
通过轻量级小模型提前预测大模型的输出 token,仅对预测不一致的部分进行重计算,在保证生成精度的前提下,大幅提升大模型的 token 生成速度,平衡推理效率和结果质量。
分块预填充(Chunked prefill)
将长提示词(prompt)切分为多个小分块进行并行预填充计算,避免长提示词独占硬件资源导致解码请求被阻塞,提升混合请求(长提示词 + 短解码)场景下的整体服务效率。
二、高度的灵活性与易用性:低开发成本,高场景适配性
vLLM 在追求性能的同时,大幅降低了 LLM 推理服务的开发和部署成本,支持多场景、多架构的灵活使用,核心特性包括:
与 HuggingFace 模型无缝集成
兼容 HuggingFace Hub 上的主流开源 LLM 模型,无需对模型进行大量修改,即可直接基于 vLLM 启动推理,大幅降低模型迁移和适配成本,覆盖绝大多数开源 LLM 的使用需求。
丰富的解码算法支持
提供高吞吐量服务所需的各类解码策略,包括并行采样、束搜索(beam search)等,支持不同的生成需求(如精准度优先、多样性优先),适配对话、生成、翻译等多类 LLM 应用场景。
分布式推理的全并行支持
支持张量并行、流水线并行、数据并行和专家并行四种分布式推理模式,可根据模型规模(如千亿、万亿参数大模型)和硬件集群配置灵活选择,实现大模型的高效分布式部署。
流式输出(Streaming outputs)
支持 token 级的流式输出,符合大模型对话类应用的交互需求,让用户无需等待完整结果生成,即可实时获取输出内容,提升交互体验。
OpenAI 兼容的 API 服务器
内置与 OpenAI API 规范兼容的服务端,基于 vLLM 部署的开源模型可直接替换 OpenAI 闭源模型,原有基于 OpenAI API 开发的应用代码无需修改即可直接调用,实现低成本的模型国产化 / 开源化替代。
前缀缓存(Prefix caching)
对多个请求中相同的提示词前缀进行缓存,避免重复的预填充计算,在批量处理相似请求(如统一指令前缀的对话请求)时,进一步提升推理效率,降低硬件资源消耗。
多 LoRA 支持(Multi-LoRA)
支持同时加载多个 LoRA 微调适配器,可根据不同请求动态切换 LoRA 模型,适配个性化、多场景的微调需求(如不同领域的专业问答、风格化生成),且无需重新加载基础模型,大幅提升 LoRA 微调模型的服务效率。
三、全栈的硬件支持:跨平台、多架构的广泛适配
vLLM 突破了传统 LLM 推理库对硬件的限制,支持CPU、GPU、专用加速芯片等全类型硬件,同时兼容主流架构和厂商的硬件插件,满足不同部署环境的需求:
基础硬件支持
覆盖 NVIDIA GPU(主流 LLM 推理硬件)、AMD 的 CPU 和 GPU、Intel 的 CPU 和 GPU、PowerPC CPU、Arm CPU,以及谷歌 TPU,适配云服务器、边缘设备、自研硬件集群等多类部署环境。
专用硬件插件支持
提供针对行业专用加速芯片的硬件插件,包括 Intel Gaudi、IBM Spyre、华为昇腾(Ascend)等,让 vLLM 可适配国产化、行业化的专用算力硬件,具备更强的工程化落地能力。
多架构 CPU 适配
对 x86、ARM AArch64、Apple silicon、IBM Z(S390X)等主流 CPU 架构均提供支持,部分架构虽需从源码构建,但已实现基础的 FP32/FP16/BF16 等数据类型推理,适配无 GPU 的轻量部署场景。
四、vLLM核心——PagedAttention
PagedAttention 是 vLLM 解决 LLM 推理 KV Cache 内存瓶颈的核心技术,核心思路是把操作系统虚拟内存分页机制引入 GPU 显存管理,将连续 KV Cache 切分为固定大小的物理块(Block),通过块表(Block Table)做逻辑 - 物理映射,实现非连续存储、动态分配与高复用,最终把显存利用率从传统 20%–40% 提升到 95%+。
下面从问题背景、核心架构、内存管理、计算内核、动态调度五个层面详细拆解实现。
4.1 传统 KV Cache 的痛点(为什么需要 PagedAttention)
LLM 推理时,每个 token 生成都依赖之前所有 token 的 Key/Value(KV)缓存,传统方案有三大致命问题:
连续内存强制分配:必须为每个序列预分配最大长度(如 4096)的连续显存,短序列会造成大量空间浪费,长序列易触发 OOM。
严重内存碎片:不同长度序列频繁分配 / 释放,导致显存碎片化,无法分配大块连续空间。
低复用与难共享:KV Cache 无法跨请求共享,相同前缀(如系统提示)重复计算与存储。
PagedAttention 就是为彻底解决这三个问题而生。
4.2 核心架构:三大组件(Block + Block Table + Block Pool)
PagedAttention 由三个核心组件构成,完全复刻操作系统虚拟内存的分页模型:
1. 物理块(Physical Block)
定义:将 KV Cache 切分为固定大小的物理块(vLLM 默认 16 token / 块,可配置),每个块存储若干 token 的 K 向量与 V 向量。
内存布局(CUDA 内核定义):
// KV Cache 物理块布局(csrc/attention/attention_kernels.cu) template<typename scalar_t, int HEAD_SIZE, int BLOCK_SIZE> struct KVCacheLayout { // Key: [num_blocks, num_kv_heads, head_size/x, block_size, x] scalar_t* k_cache; // Value: [num_blocks, num_kv_heads, head_size, block_size] scalar_t* v_cache; };- 按块 → 头 → 子维度 → token → 向量组织,适配 GPU 合并访问(Memory Coalescing)。
- 优势:统一分配粒度,消除外部碎片;仅最后一块可能有内部碎片(浪费 < 1%)。
2. 块表(Block Table)
作用:维护每个请求的逻辑块 → 物理块 ID的映射表,类似进程页表。
结构:
每个序列对应一个 Block Table 数组,记录其 KV Cache 占用的所有物理块 ID。
例:序列 S 长度 50 token,块大小 16 → 需 4 块 → Block Table = [102, 205, 78, 33](物理块 ID)。
关键能力:
支持非连续物理块组成一个逻辑序列。
块内容零拷贝迁移:仅修改 Block Table,不移动显存数据。
支持前缀共享:多个序列的相同前缀可指向同一物理块(如系统提示)。
3. 物理块池(Block Pool)
实现:vLLM 启动时预分配一大片连续显存,拆分为固定大小的块,用Free List管理空闲块。
核心接口(C++ 简化版):
class BlockAllocator { public: // 预分配 num_blocks 个块 BlockAllocator(size_t num_blocks, size_t block_size_bytes) { gpu_memory_ = cudaMalloc(num_blocks * block_size_bytes); free_list_ = 0..num_blocks-1; // 初始化空闲块列表 } // O(1) 分配一个空闲块 int64_t Allocate() { if (free_list_.empty()) throw OOM(); auto block_id = free_list_.back(); free_list_.pop_back(); return block_id; } // O(1) 释放块 void Free(int64_t block_id) { free_list_.push_back(block_id); } };- 优势:O (1) 分配 / 释放,无搜索开销;显存利用率接近 100%。
4.3 内存管理流程(从请求到生成)
1. 请求初始化
新请求到达 → 为其分配空 Block Table。
预填充 Prompt 时,按 token 数按需分配物理块(而非预分配最大长度)。
2. 动态扩展(生成阶段)
每生成一个新 token → 检查当前块是否已满。
满则从 Block Pool 分配新物理块 → 更新 Block Table → 写入 KV 数据。
3. 内存回收与置换
请求结束 → 释放所有物理块 → 归还 Free List(O (1))。
显存不足时:
基于访问频率做冷热分离,优先回收非活跃块。
支持按需置换(类似 Swap),避免强制终止请求。
4. 前缀缓存(Prefix Caching)
检测多个请求的相同前缀(如
You are a helpful assistant)。相同前缀的物理块跨请求共享,避免重复计算与存储,进一步节省显存。
4.4、PagedAttention CUDA 内核实现(计算层面)
传统 Attention 要求 KV 连续存储,PagedAttention 需定制内核支持非连续 KV 访问,核心在csrc/attention/``paged_attention_v1.cu。
1. 内核输入
q_ptr:当前 Query 向量(连续)。k_cache/v_cache:物理块池的 KV 数据(非连续)。block_tables:所有序列的 Block Table(映射表)。context_lens:每个序列的有效长度。
2. 三级并行架构(最大化 GPU 利用率)
Grid 级:每个线程块(Thread Block)处理一个头(Head)+ 一个序列 + 一个 Query token。
Block 级:一个线程块处理一个 Query 与所有上下文 KV 块的注意力计算。
Warp 级(32 线程):一个 Warp 处理一个 Query 与一个物理块的 KV 计算。
3. 核心计算逻辑(块级融合)
- 对每个 Query token:
从 Block Table 取出该序列的所有物理块 ID。
遍历每个物理块,从
k_cache/v_cache读取对应 KV 数据。计算Query·Key得分 → Softmax → 加权求和 Value → 输出 Attention 结果。
- 数学形式(块级并行):
其中BBB为块大小,直接在块级别计算,无需拼接完整 KV Cache。
4. 内存访问优化
向量化读取:按 16 字节向量单元组织数据,匹配 GPU 内存总线宽度,实现合并访问。
共享内存缓存:将热点 KV 块读入共享内存,减少全局内存访问延迟。
寄存器优化:关键计算数据驻留寄存器,进一步降低 latency。
4.5、与连续批处理(Continuous Batching)协同
PagedAttention 是连续批处理的内存基础:
连续批处理以token 为单位动态调度请求,请求随时 “上下线”。
PagedAttention 提供O (1) 块分配 / 释放+ 非连续存储,让每个请求的 KV Cache 可快速分配 / 回收,GPU 始终满载,吞吐量提升 10–24 倍。
4.6、核心优势总结(实现带来的收益)
显存利用率 95%+:彻底解决碎片,同样硬件可承载 3–4 倍并发。
动态按需分配:无需预分配最大长度,长序列无 OOM 风险。
前缀共享:相同前缀跨请求复用,进一步节省显存。
O (1) 分配 / 释放:配合连续批处理,实现极致高并发。
非连续访问:内核级支持,性能损失可忽略。
4.7、与传统方案对比(直观差异)
| 维度 | 传统 KV Cache | PagedAttention |
|---|---|---|
| 内存分配 | 连续、预分配最大长度 | 非连续、按需分配块 |
| 碎片 | 严重(外部 + 内部) | 几乎无外部碎片 |
| 利用率 | 20%–40% | 95%+ |
| 分配 / 释放 | O (n) 搜索 | O(1) |
| 前缀共享 | 不支持 | 原生支持 |
| 长序列 | 易 OOM | 稳定支持 |
五、vLLM 与其他推理库的对比及选型决策
vLLM 相比 TGI、TensorRT-LLM、SGLang、LMDeploy、Ollama 等主流推理库,核心优势是:PagedAttention + 连续批处理带来的极致显存利用率与高并发吞吐量、OpenAI API 兼容、HuggingFace 无缝集成、跨硬件与国产芯片支持、活跃开源社区,在高并发在线服务场景下综合竞争力最强。
5.1、核心对比总览(vLLM vs 主流框架)
| 对比维度 | vLLM | TGI (HuggingFace) | TensorRT-LLM (NVIDIA) | SGLang | LMDeploy | Ollama |
|---|---|---|---|---|---|---|
| 核心技术 | PagedAttention、连续批处理 | 动态批处理、部分分页 | 算子融合、编译优化、FP8 | RadixAttention、结构化输出 | 异步流水线、量化 | 轻量封装、CPU/GPU 混合 |
| 显存利用率 | 95%+(最高) | 60%-70% | 80%-90% | 85%-90% | 75%-85% | 低(CPU 为主) |
| 吞吐量 | 10–24 倍于传统方案(最高) | 中等 | 极高(NVIDIA 专属) | 高(长上下文优) | 中高 | 低 |
| 首字延迟 (TTFT) | 低(123ms@Llama3.1-70B) | 中 | 极低(<10ms@H100) | 中高 | 中 | 高 |
| 模型兼容 | HuggingFace 原生 | HuggingFace 原生 | 主流模型(需编译) | 主流模型 | 主流模型 | 主流模型(GGUF) |
| API 兼容 | OpenAI 100% 兼容 | OpenAI 兼容 | 需适配 | 部分兼容 | 部分兼容 | 无标准 API |
| 硬件支持 | NVIDIA/AMD/ 昇腾 / Gaudi/TPU | NVIDIA/TPU/Gaudi | 仅 NVIDIA | NVIDIA 为主 | NVIDIA 为主 | CPU+GPU |
| 部署复杂度 | 中(Python+Docker) | 低(一键 Docker) | 极高(编译 + 硬件绑定) | 中 | 中 | 极低(单命令) |
| 开源社区 | 活跃(32.6K + 星) | 一般 | 活跃(NVIDIA 主导) | 活跃 | 活跃 | 活跃 |
5.2、vLLM 核心优势详解(对比其他框架)
1. 显存管理:PagedAttention 碾压传统方案(对比 TGI、Ollama、LMDeploy)
vLLM:将 KV Cache 切分为固定大小的 “页”,动态分配 / 复用,显存利用率 95%+,同样硬件可承载3–4 倍并发。
TGI:仅部分实现分页,显存利用率 60%–70%,并发能力弱。
Ollama:以 CPU 内存为主,显存利用率极低,无法支撑高并发。
LMDeploy:无完整分页机制,显存碎片严重,长上下文场景劣势明显。
2. 并发与吞吐量:连续批处理(Continuous Batching)(对比 TGI、TensorRT-LLM)
vLLM:以 token 为单位动态调度,请求 “随时上下客”,GPU 始终满载,吞吐量 10–24 倍于传统方案。
TGI:静态批处理为主,头阻塞严重,吞吐量仅为 vLLM 的 1/3–1/2。
TensorRT-LLM:极致单卡性能,但高并发调度不如 vLLM 灵活,多请求混合场景吞吐量被 vLLM 反超。
3. 易用性与生态:OpenAI API + HuggingFace 无缝集成(对比 TensorRT-LLM、SGLang、Ollama)
vLLM:内置 OpenAI 兼容 API,现有应用零代码迁移;直接加载 HuggingFace 模型,无需转换格式。
TensorRT-LLM:需编译为专属 Engine,模型迁移成本极高,无原生 OpenAI API。
SGLang:API 不完整,结构化输出强但通用场景适配差。
Ollama:无标准 API,仅适合本地调试,无法直接用于生产服务。
4. 硬件兼容性:跨平台 + 国产芯片支持(对比 TensorRT-LLM、TGI)
vLLM:支持 NVIDIA、AMD、华为昇腾、Intel Gaudi、TPU 等,国产化部署友好。
TensorRT-LLM:仅支持 NVIDIA GPU,硬件锁定,无法适配国产芯片。
TGI:硬件支持有限,国产芯片适配差。
5. 功能完整性:多 LoRA、前缀缓存、投机解码(对比 TGI、Ollama)
vLLM:同时支持多 LoRA、前缀缓存、投机解码、分块预填充,功能最全面。
TGI:仅基础量化与批处理,高级功能缺失。
Ollama:仅基础推理,无高级优化功能。
6. 社区与迭代:开源活跃、更新快(对比 TGI、TensorRT-LLM)
vLLM:GitHub 星标 32.6K+,社区贡献活跃,每月迭代新特性。
TGI:更新慢(约 2 个月 / 版本),社区活跃度低。
TensorRT-LLM:NVIDIA 主导,开源度低,定制化开发门槛高。
5.3、vLLM 相对各框架的独特价值
vs TensorRT-LLM:不绑定 NVIDIA 硬件、部署更简单、高并发调度更强、国产芯片支持,适合多硬件混合部署与大规模在线服务。
vs TGI:显存利用率与吞吐量翻倍、首字延迟更低、功能更丰富、社区更活跃,生产级性能全面领先。
vs SGLang:通用场景吞吐量更高、API 兼容更好、硬件支持更广,长上下文场景互补但通用场景更优。
vs LMDeploy:显存管理与并发能力更强、模型兼容更广、社区更活跃,高并发场景首选。
vs Ollama:纯 GPU 优化、吞吐量高 10 倍 +、支持生产级 API,从本地调试到生产服务全覆盖。
5.4、vLLM 最佳适用场景
高并发在线 API 服务(如 AI 助手、对话平台)
大规模开源模型部署(Llama、Qwen、Mistral 等)
多硬件 / 国产芯片混合部署环境
需要 OpenAI API 兼容的应用迁移
追求性价比:用更少 GPU 支撑更多并发
整体而言,vLLM 通过底层技术创新解决了 LLM 推理的核心痛点(内存、吞吐量、延迟),通过工程化优化降低了部署和开发成本,通过跨硬件适配提升了场景落地能力,成为大语言模型推理与服务的主流选择,兼顾了性能、灵活性和易用性,适用于从个人开发、中小企业部署到大型企业级服务的全场景 LLM 应用。