LLM 推理系统从请求到返回的完整链路
1. Aside: 一条请求真的有那么简单吗?
这让我开始换一个视角
模型只是推理系统中的一个组件。一次响应背后还有请求接入、模板处理、Tokenization、排队、调度、模型执行、KV Cache、采样、流式传输和指标采集。
这篇文章记录如何理解一个请求从进入 LLM Serving 系统到返回文本的完整过程。第 7 节保留验证摘要,实验环境、故障现场和复现步骤见独立报告《本地 LLM 推理服务实验》。
2. 从模型推理到 LLM Serving
2.1 同一份模型,两种系统目标
训练 & 推理
训练是在固定数据上反复调整参数,推理是在固定参数上响应动态请求。到了 Serving 场景,问题不再只是“模型能否算出结果”,而是如何让许多到达时间、输入长度和输出长度都不确定的请求,共享有限的计算与内存资源。
2.2 模型 ≠ 服务?
3. 一个请求走完整条链路
3.1 文本还不是模型输入
长度最终要回到 token
同一段文本会因为语言、Tokenizer 和 Chat Template 不同而得到不同数量的 token。上下文上限、Prefill 工作量和 KV Cache 占用最终都按 token 计算,所以性能实验不能用字符数或单词数代替实际 token 数。
Tokenization 通常发生在 CPU 侧,也属于 TTFT 的一部分。Prompt 很长、模板复杂或并发很高时,模型还没开始执行,前端处理就可能已经成为瓶颈。
3.2 请求运行
3.3 Prefill:一次读完 Prompt
3.4 KV Cache:缓存的不是文本
3.5 Decode:一次只向前走一个 token
一个容易写反的时序
预测第 100 个生成 token 时,第 100 个 token 还未知。系统处理的是第 99 个已经确定的 token,并由这一步产生预测第 100 个 token 的 Logits;不能先计算“第 100 个 token 的 KV”再预测它自己。
Decode 每轮只有一个新的序列位置,却要读取不断增长的历史 KV Cache;下一轮又依赖本轮采样结果,所以单个 Sequence 无法跨 token 并行。它通常具有较低的算术强度,更容易受到内存带宽、Batching 和调度效率影响。
3.6 Token 怎样重新变回文字?
4. Prefill、Decode 和 KV Cache 为什么必须一起理解?
4.1 如果没有 KV Cache?
4.2 两个阶段为什么表现不同?
不要把趋势误认为是固定倍数
Prompt 增长 8 倍,Prefill 工作通常会显著增加,但 TTFT 不一定严格增长 8 倍。TTFT 还包含 Tokenization、排队、调度、采样和传输;Prefill 自身也受算子实现、Batching 和硬件利用率影响。
5. Scheduler:从单请求推理进入 Serving
5.1 顺序执行还不够
5.2 Scheduler 在权衡什么?
利用率不是最终目标
一个系统可以让 GPU 始终繁忙,却让请求长时间排队;也可以追求很低的单请求延迟,却无法形成有效 Batch。Serving 优化面对的是吞吐、尾延迟、公平性、KV Cache 容量和成本的共同约束。
6. Metrics:系统的“快”不是一个数字
6.1 用户在等待什么?
6.2 系统在完成多少工作?
指标必须和工作负载一起出现
没有输入/输出 token、并发和分位数,单独一个 tokens/s 很难支持可复现的系统结论。指标不是给系统贴上“快”或“慢”的标签,而是帮助定位请求在哪个阶段付出了时间和资源。
7. 实践验证摘要:理论是否符合真实观测?
这一节只保留验证结果,用来检查前文的请求链路能否解释真实系统。完整的实验环境、测量方法、测试脚本、故障分析、两版 CSV、vLLM Metal 部署过程和复现步骤记录在实验报告《在 Apple Silicon 上运行 Qwen3-4B:本地 LLM 推理服务实验》中。
完整实践记录
如果需要复现实验或查看失败过程,请继续阅读完整实验报告。其中保留了运行命令、指标定义、原始数据范围、Metal Plugin 排查过程、服务日志与验收依据。
8. 重新回答最初的问题
模型之外,系统仍然决定体验
同一份模型权重不会自动带来相同的 Serving 表现。LLM Serving 的性能是模型计算、请求调度、内存管理、基础设施和服务目标共同形成的结果。
阶段 1 的真正产出,也不是记住几个缩写,而是能用一条因果链解释请求为什么这样流动、为什么这样耗时,以及应该收集什么证据来验证判断。
仍然没有回答完的问题
- 并发增加后,Scheduler 怎样在 Prefill 和 Decode 之间分配 Token Budget?
- Batch 变大时,吞吐提高到什么程度会开始伤害 TTFT 和 P99?
- KV Cache 为什么需要 Block / Page 管理,而不能简单地连续分配?
- Prefix Cache 命中、淘汰和重算应该怎样进入调度决策?
这些问题会进入下一阶段:Transformer 推理、Attention、Continuous Batching、Prefix Caching 与 KV Cache 管理。
阅读材料
- Jay Alammar,The Illustrated Transformer
- Jay Alammar,The Illustrated GPT-2
- Hugging Face,How to generate text
- Hugging Face,Text generation
- Hugging Face,Caching
- Hugging Face,LLM inference optimization
- vLLM,vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention
- vLLM,Paged Attention
- NVIDIA,LLM Benchmarking Metrics
