深言速舟 · 学习站

15 请求链路

Token 工厂拆解手册:从 GPU、推理服务到合同与现金流第四部分 推理系统约 28 分钟更新于 2026-08-04

15.1 生命周期

一次请求分两段:先把输入读完,再一个字一个字往外吐。这两段叫 prefill(预填充)和 decode(解码),它们消耗完全不同的硬件资源,这是整个推理经济学的地基。模型生成文本的方式是逐 token 预测:看完已有的全部内容,预测下一个 token,接到末尾,再预测下一个。所以输出一千个 token 要跑一千次前向计算,而读入输入只需要一次,因为整段输入可以并行处理。

图 29一次请求的完整生命周期
阶段一 Prefill 预填充接收输入提示词 上下文分词文本转 token id一次前向全部输入并行算首字TTFT阶段二 Decode 解码,循环执行读缓存取历史中间态算一个字一次前向出一 token写缓存追加新中间态吐字TPOT每输出一个 token 循环一次,输出 1000 字就循环 1000 次关键结论Prefill 只跑一次,算力密集;Decode 跑 N 次,每次都要把整个模型权重从显存搬一遍。所以长输入贵在算力,长输出贵在带宽。定价和优化都必须区分这两件事。
示意流程,省略了采样、停止条件判断、安全过滤等步骤。
读你的问题只算一次,写答案是一个字算一次。这就是为什么输入便宜输出贵。

15.2 两段负载

prefill 受限于算力,decode 受限于显存带宽。这一句是本章最值钱的一句,几乎所有推理优化手段都能归到这两个瓶颈中的一个。prefill 阶段,几千个 token 同时参与矩阵运算,GPU 的计算单元被喂满,瓶颈是每秒能做多少次浮点运算。decode 阶段,每次只算一个 token,计算量极小,但仍要把全部模型权重从显存读到计算单元一次;对一个几百 GB 的模型,每吐一个字就要搬几百 GB 数据,瓶颈是显存带宽,计算单元大部分时间在等数据。

图 30两个阶段的资源画像对比
维度Prefill 预填充Decode 解码瓶颈资源算力 FLOPS显存带宽计算单元利用率高,可接近满载低,常在 10% 以下执行次数每请求一次每输出 token 一次对应指标首字延迟 TTFT出字间隔 TPOT批量的作用增大批量收益有限增大批量收益极大优化方向算子融合 更好的 kernel量化 投机解码 更大批量为什么 Decode 阶段增大批量收益极大因为搬一次权重可以同时服务多个请求。一个请求也是搬,三十个请求也是搬同样一份权重,吞吐几乎线性上升而成本不变。这条性质是第 6 章连续批处理的全部动机。
计算单元利用率为典型量级,随模型结构、批量大小、序列长度变化很大。
出字慢不是显卡算不动,是数据搬不过来。所以我们的活儿是想办法一次搬完多服务几个人。

要补一句边界:prefill 算力密集、decode 带宽密集是工程倾向,不是物理定律。模型大小、输入长度、批次、量化、MoE 结构、投机解码和内核都会改变瓶颈,最终结论要来自算子剖析和端到端时序,不能只凭阶段名称定位。但这个倾向解释了一个常见现象:一个大 prefill 插进统一批次,会占用较长执行时间,让正在 decode 的请求出字卡顿。第 17 章的分块预填充和第 18 章的 PD 分离都是针对这类干扰。

15.3 八个节点

用户等待的是整条请求链,GPU 执行只是其中一段。一次请求穿过八个控制点:客户端、网关鉴权、限流排队、模型路由、调度批处理、GPU 执行、流式返回、计量日志。每一点既是功能,也是失败边界:

控制点保存或读取的状态常见失败
网关身份、密钥、配额、请求标识误拒绝、越权、限流不一致
路由模型版本、副本、地域、前缀线索路由热点、版本错配
调度队列、活跃序列、KV 与批次饥饿、抢占、队列爆炸
执行权重、KV、采样状态爆显存、内核错误、硬件故障
流式输出连接、已发送 token、取消状态中断、重复、背压
计量输入输出 token、缓存、错误重复计费、漏计、对账失败

诊断慢要按同一请求标识建立跨层时间线:何时到达、何时完成分词、何时入队、何时被调度、何时产生首 token、每个 token 何时发送、何时完成计量。服务端首 token 很快而客户端晚收到,问题在代理缓冲或跨境网络;入队前就慢,问题在鉴权或分词;队列很长,优化内核只能缓解一部分。把首字延迟拆成时间线之后,它才会变成动作。

15.4 队列反馈

排队解决的是资源暂时不足时谁先运行,但它也会隐藏容量问题:只要入口继续接收,系统表面上没有失败,用户等待却不断变长。典型的反馈循环是:请求率略高于处理率,队列开始增长;请求等待更久,占用连接和网关内存;客户端超时重试,重复请求抬高到达率;系统进一步变慢。没有幂等和重试预算时,一次局部过载会被用户行为放大。所以生产服务需要背压、并发上限或主动丢弃:系统超出安全容量时,明确拒绝、降级或延后批量任务,比把所有请求拖进高尾延迟更可控。BD 要理解的一点是:允许无限排队会暂时让接收率好看,却在破坏 SLA 和信任。

15.5 流式形态

流式响应改变的是时间形态,不是工作量:首 token 可以早于完整响应,感知等待改善,但生成同样数量 token 的计算一分不少。流式连接带来状态问题:系统要知道哪些 token 已经发送、客户端是否取消、断线后是重试整次请求还是继续、工具调用是否已产生副作用、计量如何收口。非流式客户端只在完整响应后收到数据,测得的首 token 时间可能实际是总响应时间,这一点在对比性能数字时经常造成错觉。核

15.6 取消重试

取消、超时和重试是一组状态机。客户端取消后,后端是否立即停止生成?网关断开但调度器没收到取消,GPU 会继续计算无人消费的 token。取消要从入口穿到调度器和引擎,并在计量层记录已完成的实际用量。超时要分层设计:客户端 30 秒、网关 60 秒、服务端无上限的组合,会让客户端先重试而旧请求仍在运行,新旧请求共同占用容量。重试策略至少回答四个问题:哪些错误可重试,在哪一层重试,最大次数和退避是什么,有没有幂等键。对纯文本生成,重试可能得到不同答案;对已经发邮件、下订单的 agent,盲目重试会重复副作用,推理服务的边界与上层应用的幂等控制必须在接口上写清。

多租户入口是控制面,不只是转发地址:只按请求数限流会低估长提示词,只按 token 计量又无法预知输出长度,实践中要组合请求率、输入 token、并发、输出上限和动态负载,并为交互与批量任务设不同队列。验收也不应只测正常返回:无效密钥、配额耗尽、长输入、中途取消、网关断连、服务端过载、单副本摘流、计量延迟与重复请求,每个场景都要定义协议结果、在途 GPU 工作是否停止、是否计费、是否可重试。

追问P99 慢的时候能不能给一条按请求 ID 串起来的跨层时间线;取消能不能传到引擎;过载时是排队到死还是主动丢弃。

修订记录

日期改了什么为什么谁
2026-08-04按章导入,正文与插图保持原样原稿结构清晰,重写反而损失信息工程