LLM Inference / SWE · 45-minute Coding

xAI 动态 Batch 解码:结束回调、空槽补位与 Slot 映射

简化模型接口按 token 前缀批量返回下一 token;实现请求补位、max_tokens/stop 终止及结果不串线。

题目重点:简化模型接口按 token 前缀批量返回下一 token;实现请求补位、max_tokens/stop 终止及结果不串线。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版模型每轮对每个活跃 slot 返回恰好一个 token;若真实接口返回多 token,要逐 token 检查停止条件并明确多余 token 的丢弃规则。
  • batchCapacity B>0;请求有唯一 ID、prompt、maxNewTokens≥0、stop token 序列列表和一次性 callback;模型返回顺序对应本轮提交的 slot 顺序。
  • 未公开取消、优先级、KV cache 迁移和流式部分回调;训练版按 FIFO 补位,满 batch 时不再读取等待队列。

解题路线

  1. 用 fixed array slots[0..B−1] 持有 request ID 与生成状态,另有 FIFO waiting;先填空槽,maxNewTokens=0 的请求可直接结束回调,不占模型调用。
  2. 每轮冻结本次活跃 slot ID 列表及 request ID 快照,构造前缀批输入;模型返回第 i 个 token 后,只更新该快照对应的 slots[activeSlots[i]],不能在处理返回数组中途先补位再继续用旧索引。
  3. 把 token 附到该请求输出,检查已生成数量≥maxNewTokens,以及输出尾部是否匹配任一 stop sequence;若终止,记录原因、只调用一次 callback、释放 slot。stop sequence 是否包含在交付文本属于接口契约,训练版保留并标记结束位置。
  4. 一整轮模型输出处理完后,按 slot 编号把 waiting 中新请求填入空位;不足 B 也照常用非满 batch 继续,直到 waiting 为空且所有 slot 为空。
  5. 错误和重试要定义:模型调用失败时不能把未知半批输出当成成功;若每请求回调失败,标记交付状态并可重试同一 ID,避免重复完成。

手动走一遍

训练例 B=2:A 的 maxNewTokens=1,B 的上限 3,C 等待。第一轮 slot0=A、slot1=B;模型给 A 一个 token 后 A 回调并释放,B 保持原 slot1。随后 C 进入 slot0。第二轮入参顺序若按 [slot0,slot1],返回第一个只给 C、第二个给 B;若沿用旧 [A,B] 映射就会串线。B 第三 token 后完成;C 可继续在不满 batch 下运行。

规模与取舍

R 个请求共生成 T 个 token、batch 容量 B:模型调用次数至少 ceil(T/B),实际因长短请求/补位不同而更高;调度更新 O(T+R),slot 状态 O(B),等待队列 O(R),各序列输出总空间 O(T)。模型计算和上下文长度成本取决于接口,题目未明确。

易错点与追问

容易失分的边界

  • 回收 slot 后立即补位却仍按本轮旧输出索引赋 token。
  • 只检查单个 stop token,漏掉跨轮的 stop sequence 后缀。
  • 最后不满 B 时继续等待满批,导致队尾请求永远不结束。
  • 同一请求 max_tokens 与 stop 同时触发时回调两次。
  • 把生成 token 数与 prompt token 数混淆。

继续深挖

  • 请求取消时怎样释放 slot 与 KV cache?
  • 多 token 输出中 stop sequence 出现在中间如何裁剪?
  • 长短请求混合时怎样改善 tail latency?
  • 模型失败/回调失败怎样保证一次交付?
✓已复制微信号!