s05批处理与调度18 分钟阅读

Work in Batches

把多条请求放到一次计算里

用静态 batch 对照理解请求身份、输入布局与独立停止条件。

batch 共享一次计算,不能共享每条请求的进度与停止条件。

01一次只算一条请求浪费了什么

模型参数很大,而单个 decode token 的计算往往不足以充分利用设备。把多条请求拼到一次前向,可以共享权重读取和矩阵运算的组织成本。静态 batch 在开始时固定成员,直到这组请求全部结束再接受下一组;它容易理解,也让最长的请求成为整批结束时间的决定因素。

s05_static_batch.py
# Framework pseudocode for fixed batch membership.
members = choose_initial_requests(waiting)
while not all_finished(members):
    metadata = prepare_batch_metadata(members)
    outputs = execute_scheduled_round(metadata)
    apply_ready_updates(outputs)
    for request in members:
        if request.finished:
            preserve_finished_status(request)
    # Do not admit waiting requests into this fixed group.

release_group_references(members)
# Static batching is a comparison model for the scheduler.
# Upstream scheduling has additional phase and budget rules.

02形状对齐后,语义仍要分开

不同输入长度需要 padding 或变长布局,位置与可见范围由元数据表达。每条请求还有自己的缓存长度、输出上限和结束状态。完成的请求应停止累计输出,但不能让同批的其他请求提前结束;固定成员与独立生命周期是两回事。

03上游的自动组批不等于这段静态循环

DeepInfer 的 LLM.generate 将输入逐条加入引擎,再由 Scheduler 根据 token、序列数量和缓存约束组批,而不是把任意长短输入直接 stack。静态 batch 是用于比较的概念模型;阅读重点是哪些元数据随请求保留,哪些执行集合在调度时建立。

TRY IT YOURSELF

动手想一想

画出三条输出长度为 2、5、8 的请求。标出静态 batch 每轮的有效行,以及等待整批结束才进来的第四条请求要等多久;只比较轮次,不虚构耗时。

把这个机制,加入你的工具箱。