vLLM 推理内核深度解析

深入 LLM 推理引擎的内核实现。

同样一张 A100,同样一个 7B 模型,为什么 vLLM 的吞吐能比朴素实现高一个数量级?答案不在模型里,在显存怎么切、请求怎么排、一拍里放多少 token 这三件事上。

本专栏基于 vLLM v0.8.x(V1 引擎架构) 源码,从一个推理请求的完整旅程出发,由外到内拆开这台引擎。

flowchart LR
  REQ[请求] --> API[API Server]
  API --> EC
  subgraph EC [EngineCore · 三进程拓扑]
    direction TB
    SCH[Scheduler<br/>统一 token budget] --> KV[KV Cache Manager<br/>Block 分配 · 引用计数]
    KV --> WK[Worker / Executor]
  end
  WK --> MR[Model Runner<br/>前向计算]
  MR --> ATT[PagedAttention Kernel<br/>离散 Block 上算注意力]
  MR --> SMP[Sampling]
  SMP --> OUT[输出]
  SCH -.复用.-> PC[Prefix Cache]
  SCH -.拆分.-> CP[Chunked Prefill]
  MR -.加速.-> SD[Speculative Decoding]

为什么是 V1。 V0 到 V1 有七个结构性变革,不是重构而是换骨架——调度器从"prefill 与 decode 分家"变成统一的 token budget,KV Cache 从整块变成引用计数共享。拿 V0 时代的理解去读今天的源码,读到的是两个系统。

读完你能做到什么

  1. 画出一个请求从进入到吐字的完整路径。 三进程拓扑为什么这样拆、五大子系统的边界在哪、四类跨边界 DTO 各自承载什么(第1章 架构总览第2章 EngineCore)。
  2. 讲清 PagedAttention 到底解决了什么。 从 1961 年的分页思想讲到 Block Table 这本"地址簿",再到在离散 Block 上做 Online Softmax 的内核实现(第4章 PagedAttention)。
  3. 管理显存到字节。 KVCacheBlock 的元数据、空闲队列一个结构三种角色、"共享满块不共享半块"的引用计数协议、显存预算怎么"试探"出来(第5章 KV Cache)。
  4. 调对 chunked prefill 和 prefix cache。 num_computed_tokens 为什么是断点续传的唯一状态、被抢占后如何靠 prefix cache 找回、chunk_size 的四条调优曲线,以及五种常见误区(第10章 前缀缓存第11章 Chunked Prefill)。
  5. 判断投机解码和量化值不值得开。 各自吃掉什么、换回什么,以及它们与调度器的相互作用(第12章 投机解码第13章 量化)。
  6. 把引擎铺开到多卡与多模态。 分布式执行、LoRA 多适配器、多模态输入路径(第14章 分布式第15章 多模态第16章 LoRA)。

这个专栏的讲法

先给地图,再钻细节。 第 1 章就把 vllm/ 根目录 29 个子系统列成账本、给出从 LLMEngine 到 Kernels 的架构全景图、17 章与架构的精确映射,还有"读源码的三个切入姿势"。你不会读到一半不知道自己在哪。

每个机制都落到源码符号上。 KVCacheBlockFreeKVCacheBlockQueueSpecializedManagernum_computed_tokens——讲的是这些东西怎么写的、为什么这么写,不是"vLLM 使用了分页机制"。

给可操作的调优结论。 chunk_size 的调优曲线、生产环境该测哪些指标、组合优化时谁和谁会打架。读完能上手调,不是只能点头。

适合谁读

不适合:找 vLLM 部署教程或 API 用法的读者——那些官方文档写得很好,这里讲的是它内部为什么这样设计。

源码版本

本专栏的源码引用以 vllm-project/vllmv0.8.5 为准。选这一支是因为 V1 引擎在 v0.8.x 正式成为默认架构——它代表了 vLLM 团队对「推理引擎该长什么样」这个问题的当时答案:

仓库 版本 Git Commit
vllm-project/vllm v0.8.5 ba41cc9
git clone https://github.com/vllm-project/vllm.git
cd vllm && git checkout v0.8.5

vLLM 的迭代节奏很快,vllm/v1/ 目录在后续版本里持续重构;正文以模块职责和函数名为锚点,行号仅供定位。涉及 V0 与 V1 差异的地方,章内会分别标注。

目录

开篇

第一篇:全景

第二篇:引擎核心

第三篇:执行层

第四篇:性能优化

第五篇:分布式与工程

版权声明

本专栏内容为 杨艺韬 版权所有,保留一切权利。未经书面许可,不得全文或大段转载、改编、翻译,或用于任何商业用途(含以本专栏内容训练模型、生成衍生课程或商品)。

欢迎分享本专栏的链接。引用少量内容用于评论、教学或研究时,请署名 杨艺韬 并附上原文链接。