在途环
一条永不排空的流水线:多个请求同时占据不同 stage,没有哪个 stage 需要等前面那个跑完。
Kvasir 以 stage 流水线的形式服务一个模型,每个 stage 持有其中一段连续的层。一个 stage 跑完自己的层,把边界——一个 hidden state,而不是权重——传给下一个。没有节点持有完整模型,数据路径中间也不坐着任何东西:bridge 向头部提交、从尾部读取,而各 stage 通过自己的 agent 互相递交结果。
在途的那部分
为什么排空的流水线浪费掉大半台机器
如果一条流水线要先跑完一个请求才接纳下一个,那么任一时刻除一个 stage 之外全都闲着——四 stage 的环只跑出四分之一的硬件。在途(in-flight)设计让多个请求同时流动:stage 3 在解码一个请求时,stage 0 已经在为另一个做 prefill。stage 会汇报自己持有一个批次多久、又有多久无事可提交,因此一个被饿着的环和一个饱和的环看起来不一样。
四个 stage、三个请求、同一个瞬间。
stage 0 stage 1 stage 2 stage 3
layers 0-11 12-22 23-33 34-44
request A decode
request B decode
request C prefill
boundaries pass → agent to agent, never through the caller成员构成
一个批次究竟是什么
来自不同请求的行被打包进同一个物理批次,而这份确切的成员构成会原样转发给下游每一个 stage,而不是每跳重新决定一次。正是它让一次 prefill 与若干次 decode 共享同一趟计算,也正因如此,批次大小是一次加载的属性:方案事先写明 row 与 micro-batch 宽度,而这些宽度决定了一个 stage 所能返回的最大结果。
一条流水线至少要两个 stage。单 stage 的流水线会被直接拒绝——头部与尾部是不同的角色,一个节点把两者合一,那是另一种引擎,而不是更小的环。
环是延迟路径,它的粒度是层。专家分片通过在层内部切分移除了这个下限,并接入同一套服务网络。