https://zhuanlan.zhihu.com/p/688551989
在 vllm 中,prefill 和 decoding 不会同时发生。
vllm 的算子经过特殊设计,可以支持不同长度的 batch,不像预训练,batch 作为一个单独的维度,每个 batch 的 seqlen 必须一样。vllm 更像是把多个 batch 拼成一个超长 batch 来推理。
准备阶段:维护 waiting 队列和 running 队列。初始时所有请求都在 waiting 队列里。
schedule 阶段:
遍历 waiting 队列的请求,看当前显存是否放得下。如果放得下,就拿出来,放到 running 队列。
由于此处的请求都是刚刚进入 running 队列,所以进行一次 prefill(而不是 decode)。
释放 S2 的显存。并且,从 waiting 队列中按优先级检查,找到合适的,显存能容纳的请求,比如就是 S4(刚刚步骤3中被回收的那个)。