调度与内存#

调度与内存部分关注的是系统怎样在请求并发、batch 成形和缓存占用之间维持平衡。它不再问“请求怎么进来”,而开始问更内部的问题:哪些请求先被推进,哪些请求会被延后,逻辑 token 怎样映射成物理 KV 状态,哪些前缀能被复用,压力上来时系统又是怎样退化、自救和回收的。

这一部分在整本书里处在一个很关键的位置。读完 3. 运行时架构 之后,读者已经知道系统有哪些边界;而到这里,才真正开始理解这些边界内部靠什么对象和不变量维持秩序。只要这一部分稳住了,后面的执行模型就不再像“模型自己在跑”,而会被看成建立在 batch、预算和 cache 状态之上的第二层过程。

这一部分怎么读#

比起顺着十五章标题平推,更稳的读法是把这一部分压成四条主线。

第一条:先立住 scheduler 主语#

先读:

这组章节回答的是:scheduler 到底在管什么。不是“有一个主循环”这么简单,而是 waiting queue 如何被加工、batch 如何被吸收、预算如何决定还能不能继续塞请求。

第二条:再看 cache 怎样真正被占用和复用#

然后读:

这组章节的共同主题不是“缓存结构很多”,而是逻辑请求如何逐步变成物理 cache 状态,以及这些状态怎样被保护、恢复、回收和驱逐。

第三条:最后回到单请求运行时本体#

接着读:

这组章节把前面大量分散的机制重新落回同一个请求对象和一组运行时不变量上。读到这里,Req 不再只是某个文件里的 dataclass,而会成为调度、前缀、KV、输出和自救逻辑真正汇合的地方。

第四条:再补压力、队列塑形与特殊人格#

最后再读:

这组章节解释的是“系统不在理想状态下时会怎样工作”:队列怎样被塑形,前缀复用为什么会退化,decode 内存不够时怎样回退,disaggregation 模式下为什么又会长出另一套队列人格。

这一部分最该反复抓的对象#

这部分读厚以后,最值得持续抓住的不是章节名,而是这些对象:

  • Scheduler
  • ScheduleBatch
  • PrefillAdder
  • Req
  • ReqToTokenPool
  • TokenToKVPoolAllocator
  • prefix cache / RadixCache

它们会在后面的 5. 执行模型 中继续被回扣。因为执行层并不是凭空开始的,它总是建立在这里已经塑形好的 batch、预算和 cache 现实之上。

这一部分和前后章节的关系#

这一部分放在 3. 运行时架构 之后,是因为只有先分清 manager、worker、执行壳和连接边界,才知道 scheduler 和 cache 到底位于哪一层。它又放在 5. 执行模型 之前,是因为 batch 没成形、KV 没准备好、请求状态没稳定下来时,谈 token loop 还太早。

换句话说,第 4 节负责把“系统怎样被组织起来”进一步压成“请求怎样被推进和占用资源”。第 5 节才开始回答“在这套资源现实上,模型怎样真正跑起来”。