Arganzheng's Blog

stay hungry, stay foolish

大模型推理系统揭秘(12):PD 分离:从资源混部走向计算解耦

版本说明:实现分析以 vLLM v0.27.1(tag 6e448d0)为准,重点走读 NIXL pull + 示例 Proxy 的交接路径。通用架构、其他 Connector 的选择和系统设计建议会分别说明,不把一种实现视为 PD 分离的唯一路径。文中算例均为注明假设的理论估算,不是本地 GPU 或网络实测。 前面几篇已经解释了,一个推理实例如何通过 Scheduler、KV Cache Manager、Model Runner 与多卡执行器,把动态到来的请求组织成持续运行的 GPU 工作负载。 现在考虑一个常见冲突:一批用户正在逐 Token 接收回答,另一个用户提交了一份长文档。前者希望每一步生成稳定推进,后者希望尽快完成长 Prompt 的处理。...

大模型推理系统揭秘(11):硬件解耦:如何不让芯片差异污染 Serving 核心?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 上一篇讨论了模型适配:面对不断变化的模型结构,Serving 框架如何通过统一接口、模型注册和模块化执行路径,降低新模型接入成本。 但模型只是变化来源之一。 在真实部署环境中,硬件同样在快速变化。GPU 不再是唯一选择,AMD ROCm、华为昇腾 Ascend、Intel XPU、Google TPU 以及各种专用加速器,都在参与大模型推理基础设施的竞争。 这就带来一个更棘手的问题: 如何让同一套 Serving 逻辑运行在不同芯片上,同时避免芯片差...

大模型推理系统揭秘(10):请求形态的扩展:multi-LoRA 与多模态

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 上一篇讲的是”一个新模型如何接进来”——ModelConfig 收敛意图、ModelRegistry 找到实现、ModelLoader 装配权重、Worker + ModelRunner 组织执行。整条链路有一个没有说出口的假设:服务里只有一个模型、一份权重,每个请求就是一串 token id。调度器按 token 分预算,KV Cache 按 token 分块,model runner 把所有请求的 token 拍平成一条 input_ids 送进同一个 for...

大模型推理系统揭秘(09):模型适配:如何跟上变化极快的模型世界?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 前面几篇解决的是一个固定模型如何被高效地调度、缓存、执行和扩展。但模型世界变化极快:MLA、MoE、MTP、Mamba、各种量化格式和权重布局层出不穷,而每一种差异都会往下捅穿好几层——Attention Kernel、KV Cache 布局、调度预算、并行与通信都可能被牵动。 本篇的核心问题是: 面对结构、状态表示和执行方式都在快速变化的模型,推理引擎应该在哪一层吸收变化,才能既跟得上模型世界,又不牺牲性能与可维护性?1 一、总览:抽象吸收变化,特...

大模型推理系统揭秘(08):Multi-GPU:一张卡不够时如何扩展?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 前面几篇讨论的都是一张卡内部的事:调度器决定这一轮算哪些 token,KV Cache 决定状态放在哪里,GPU 执行决定每个 token 算多快。但模型很快就会大到一张卡装不下,或者一张卡的吞吐远远不够。这时模型、状态和通信都要在多张 GPU 之间重新分配。 本篇的核心问题是: 一张卡装不下、或者一张卡不够快时,模型、KV 状态和通信应该怎样在多张 GPU 之间切分?1 每种切法的代价是什么,通信又该如何优化?2 一、总览:分布式推理的混合并行策略...

大模型推理系统揭秘(07):解码的扩展:采样、投机解码与结构化输出

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 上一篇把一轮 batch 送进 GPU,跑完 forward,拿到 logits,采样出 token——到这里,”下一个 token”似乎就是一次 argmax 或一次 multinomial。但在真实的服务里,这一步几乎从来不是那么干净的:一个请求要 top_p=0.9 加 repetition_penalty=1.1,另一个请求要求输出必须是合法的 JSON,服务本身又开着投机解码想把 300 步 decode 压成 120 步。 这三件事看起来风马牛不相及...

大模型推理系统揭秘(06):GPU 执行:如何让每个 Token 算得更快?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 前面几篇解决的是”这一轮算哪些 token”(Scheduler)和”它们的状态放在哪里”(KV Cache)。这一篇的问题是: 这些已经确定要算的 token,怎么算得更快?1 一、总览:四种浪费与一笔账 1. GPU 上的四种浪费形态 Decode 偏 memory-bound、Prefill 偏 compute-bound,但落到 GPU 上,浪费其实只有四种形态: GPU 上的四种浪费形态 浪费形态 ...

大模型推理系统揭秘(05):KV Cache:LLM Serving 的第一号内存问题

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 设想一个场景: 你有一张 80 GB 的卡,同时来了 100 个请求。第一个请求最后只生成了 300 个 token,第二个生成了 3000 个,第三个一路写到 20K。问题在于:这三个数字,你在请求到达的那一刻一个都不知道。 如果按传统做法,给每个请求划一块连续显存来放它的 KV Cache,那你只能按”最坏情况”预留——按模型支持的最大长度划。于是那个只生成 300 token 的请求,占着一块够装 32K token 的地。100 个请求这么一摊,卡就满...

大模型推理系统揭秘(04):Scheduler:GPU 这一轮到底给谁用?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 上一篇的全景图里已经出现了一个关键事实:KV Cache 不再是一整块连续显存,而是按 Block 动态分配和回收的资源(PagedAttention),不同请求因此可以灵活共享 GPU 显存——它的管理细节留到第五篇。有了”显存可以按块调配”这个前提,一个更直接的问题就浮上来了: GPU 这一轮到底给谁用?1 每个请求这一轮应该推进多少?2 这正是 Scheduler 要解决的问题。 传统深度学习推理通常以固定 Batch 为基本调度单位: Ba...

大模型推理系统揭秘(03):鸟瞰 vLLM:一个请求如何穿过整个推理系统?

NOTE 本文基于 vLLM v0.27.1(tag 6e448d0, 2026-08-11)源码剖析。文中文件路径、类名和函数名均以该版本为准;vLLM 迭代很快,阅读时请以你手上的版本对照。 前两篇分别定义了问题(LLM Serving 为什么难)和尺子(用什么指标衡量)。在深入调度、KV Cache、GPU 执行等单个战场之前,需要先有一张全景图:一个请求进入 vLLM 之后,会经过哪些模块,以什么形式被传递,最后如何变成 token 返回给用户。 本篇的核心问题是: 一个请求如何穿过 vLLM 的整个推理系统——哪个模块负责决策、哪个模块负责执行,它们之间传递的到底是什么?1 一、总览:静态拓扑、动态生命周期与数据流 1. 三个视角...

×