Hacker News 中文摘要

RSS订阅

深入解析vLLM:高吞吐量LLM推理系统的架构剖析(2025) -- Inside vLLM: Anatomy of a High-Throughput LLM Inference System (2025)

文章摘要

这篇文章介绍了现代高吞吐量LLM推理系统vLLM的核心组件和先进特性,包括调度、分页注意力、连续批处理等基础功能,以及分块预填充、前缀缓存、引导解码等高级功能,并涵盖从单GPU到多GPU扩展、服务层架构及性能调优等内容。文章采用由浅入深的方式帮助读者建立系统整体认知。

文章总结

好的,作为一位专业的中文编辑,我将对您提供的英文文章进行中文重述。我会保留核心细节,同时删减与主题无关的冗余内容,使其更符合中文读者的阅读习惯。


文章重述:深入解析 vLLM:高性能 LLM 推理系统剖析

本文是系列文章的第一篇,旨在逐步介绍构成现代高性能大语言模型(LLM)推理系统的核心组件与高级特性,并以 vLLM 为例进行详细拆解。文章采用倒金字塔结构,先构建宏观认知,再深入细节。

一、LLM 引擎与引擎核心

LLM 引擎是 vLLM 的基础构建块,它本身已能实现高吞吐量的离线推理,但尚不支持对外提供 Web 服务。

引擎构造:引擎主要由 vLLM 配置、处理器(将原始输入转化为引擎核心请求)、引擎核心客户端(本例中为进程内客户端,等同于引擎核心本身)和输出处理器组成。引擎核心内部包含模型执行器、结构化输出管理器(用于引导解码)和调度器。调度器是核心,它包含调度策略(如先来先服务或优先级)、等待/运行队列,以及 KV 缓存管理器——这是分页注意力机制的核心。KV 缓存管理器维护一个空闲块队列,用于管理可用的 KV 缓存块。

在模型执行器构建过程中,会创建一个工作进程,并执行三个关键步骤: 1. 设备初始化:分配 CUDA 设备,检查显存,设置分布式环境,并实例化模型运行器和输入批次对象。 2. 模型加载:实例化模型架构,加载权重,并设置为推理模式。 3. 初始化 KV 缓存:通过一次虚拟前向传播计算可用显存,确定可分配的 KV 缓存块数量,然后分配并绑定 KV 缓存张量。同时,会进行预热并捕获 CUDA 图以优化延迟。

生成函数:引擎接收请求后,会为每个提示创建唯一 ID,进行分词等预处理,并将其封装为请求对象,放入调度器的等待队列。随后,引擎会循环调用 step() 函数,每个步骤包含三个阶段: 1. 调度:决定本轮执行哪些请求(解码和/或预填充)。 2. 前向传播:运行模型并采样 token。 3. 后处理:将采样的 token ID 追加到请求中,进行反分词,并检查停止条件。若请求完成,则释放其 KV 缓存块并输出结果。

调度器:调度器处理两种主要工作负载:预填充(计算密集型)和解码(内存带宽密集型)。V1 调度器可以混合处理这两种请求。它优先处理运行队列中的解码请求,然后处理等待队列中的预填充请求。allocate_slots 函数负责计算并分配所需的 KV 缓存块,若资源不足,则可能触发抢占。

前向传播:模型执行器调用工作进程,工作进程再调用模型运行器。主要步骤包括:更新状态、准备输入(将缓冲区从 CPU 复制到 GPU,构建位置和槽映射)、执行前向传播(使用自定义的分页注意力内核,将所有序列展平并拼接成一个“超级序列”)、收集最后一个 token 的状态、计算 logits 并进行采样。前向传播有即时模式和捕获模式两种执行方式。

二、高级特性

  1. 分块预填充:将长提示的预填充步骤拆分成更小的块,防止单个长请求独占引擎步骤,从而降低其他请求的延迟。
  2. 前缀缓存:避免重复计算多个请求共享的前缀 token。通过将前缀 token 的 KV 缓存分块并哈希存储,后续请求可直接复用,加速预填充过程。
  3. 引导解码:在每一步解码时,通过基于语法的有限状态机(FSM)约束 logits,确保只采样语法允许的 token。这可以强制执行正则表达式或上下文无关文法。
  4. 推测解码:使用一个更小的草稿模型快速生成 k 个候选 token,然后由大模型一次性验证。通过接受/拒绝机制,保证最终输出在统计上等价于大模型自回归解码,但速度更快。vLLM V1 支持 n-gram、EAGLE 和 Medusa 等方案。
  5. 分离式预填充/解码:将预填充和解码分离到不同的实例上运行,因为两者性能特征不同。预填充实例负责计算 KV 缓存并写入共享存储,解码实例则从中读取并执行解码,从而更好地控制延迟。

三、从单 GPU 到多 GPU 扩展

当模型权重无法放入单个 GPU 显存时,需要扩展。首先,在同一节点内使用张量并行(TP)将模型分片到多个 GPU。如果仍不够,则跨节点使用流水线并行(PP)。MultiProcExecutor 提供了多进程编排层,通过消息队列协调多个工作进程。从引擎角度看,多进程的复杂性被抽象化,调用方式与单进程一致。

四、服务层

为了对外提供服务,需要构建分布式系统。例如,使用两个 H100 节点运行四个 vLLM 引擎。一个节点以无头模式运行引擎核心,另一个节点作为 API 服务器。

  • 无头服务器节点:启动多个引擎核心进程,每个进程包含主线程、输入线程和输出线程,通过 ZMQ 套接字与前端通信。
  • API 服务器节点:实例化 AsyncLLM 对象,内部创建数据并行、负载均衡的异步多进程客户端。它通过 DP 协调器与后端引擎核心通信,进行负载均衡。前端运行多个 asyncio 任务处理输入、输出和状态更新。最终,FastAPI 应用挂载 OpenAI 兼容的端点,通过 Uvicorn 提供服务。

完整请求生命周期:用户通过 curl 发送请求 -> FastAPI 路由处理 -> AsyncLLM.generate 调用 -> 负载均衡选择引擎 -> 请求发送到引擎的输入套接字 -> 引擎内部处理(调度、前向传播、采样)-> 结果通过输出套接字返回 -> AsyncLLM 任务处理结果 -> FastAPI 返回 JSON 响应。

五、基准测试与自动调优

衡量推理系统性能的两个核心指标是延迟(用户等待时间)和吞吐量(每秒处理的 token/请求数)。两者相互竞争:批量大小增加会提高吞吐量,但也会增加单步延迟。常用指标包括 TTFT(首 token 延迟)、ITL(token 间延迟)、TPOT(每输出 token 时间)和 Goodput(满足服务等级目标的吞吐量)。

vLLM 提供了 vllm bench 命令行工具,包含 latencythroughputserve 三个子命令,分别用于测试延迟、吞吐量和模拟真实工作负载。此外,还有自动调优脚本,可根据目标 SLO 自动寻找最佳配置。

结语:本文从基础引擎核心出发,逐步添加高级特性,扩展到多 GPU 和多节点分布式服务,最后介绍了性能测量方法。vLLM 还包含许多其他高级功能,如对多种硬件后端、模型架构和技术的支持,这些大多与本文描述的主流程正交。后续文章将深入探讨特定子系统。

评论总结

根据评论内容,总结如下:

主要观点与论据:

  1. 技术对比与扩展性(评论1,评分None):作者赞赏vLLM超越“分页注意力”的范畴,并好奇其与Radix Attention的对比。关键引用:"Love that this goes beyond paged attention. Curious how this compares with Radix Attention?"

  2. 学习资源推荐(评论2,评分None):推荐通过阅读nano-vllm代码理解vLLM工作原理,称其为“vllm but cut down to size”,约5000行代码,保留核心加速组件。关键引用:"Another great way to understand how vllm works is to read the code of nano-vllm... contains all the major pieces that make an inference engine fast."

  3. 核心贡献反思(评论3,评分None):指出vLLM最初以分页注意力闻名,但事后看,分离Web服务器与GPU进程、连续批处理、KV缓存/分块、以及包含低精度的大型模型库更为重要。关键引用:"vLLM is originally marketed as paged attention, but in hindsight... separating the web server and GPU process, continuous batching, kv caching / chunking, and a huge model library including low precision mattered more."

平衡性说明: 评论1和3均对vLLM的技术演进提出建设性思考(对比Radix Attention、反思核心贡献),评论2则提供学习路径。无显著对立观点。