Skip to content

会话批处理(Session Batching)——ds4-server 预分配 N 个独立的常驻 KV session,把多个并发请求里"已就绪的 decode 步"打包到一次内核调用里一起算,提升聚合吞吐。有原生批处理内核时直接用,没有时退化成有序精确兜底,保证结果与逐 session 单跑完全一致。

为什么需要它 ​

ds4-server 原本是"一个 GPU 同时只跑一个请求":推理串行,HTTP 并发用队列解耦(见 Part 5)。这对单用户够了,但多用户服务时,decode 阶段每个 token 只读一个 token 的权重,GPU 算力大量闲置——多个 session 的 decode 步本可以塞进同一个 batch kernel 一起算。

--batched-session N 预分配 N 个独立常驻 KV session:

  • 就绪的 decode 步一起评估(同一个 batch kernel)
  • 长 prefill 交替进有限大小的 chunk,避免一个 prefill 堵死所有 decoder
  • 超过 N 的请求等空位;启用了磁盘 KV 缓存时,空闲槽位被持久化、对话回来时再恢复,活跃请求永不被驱逐
  • 选 N 和 --ctx 让所有常驻 KV 分配都能装进显存

精确性保证:有序兜底 ​

批处理是精确的:当没有原生批处理内核时,ds4 按固定顺序跑受影响的行,返回与"逐 session 单独评估"完全相同的完整 logits。每个后端/模型的行为:

后端 / 模型session 执行方式
Metal,常驻 DeepSeek Flash支持时从两行起原生共享专家 + QKV 批处理;否则有序兜底
Metal,常驻 V4.1 Flash(2026-09)2–8 session 原生解码(逐位对齐标量);含图像的 session 走有序兜底
Metal RDMA TP,V4.1 Flash(2026-09)3–8 session 原生解码;两路有序兜底(两行摊不平批量交换的固定开销)
Metal SSD streaming,V4.1 Flash(2026-09)有序兜底
Metal,GLM 5.2有序精确兜底
Metal,GLM 5.3可见 token ≤2051 时原生批处理,超出走有序兜底
Metal,Qwen3.8 Flash Next(2026-09 中旬)原生批处理:读权重的 dense 工作整批一次,GDN 递归状态/注意力缓存/PLE 历史每 session 一份;槽共享一个 prefill 工作区(每 session 内存 ÷3.6 @ctx4096;C=16 聚合 ~50→~143 t/s @M5 Max);--mtp 时批处理推测解码(贪心组,≤16 session)
CUDA,DeepSeek Flash(受支持的 TP/EP 多卡布局)原生 decode + 混合 prefill/decode,不支持的 kernel 形状走精确兜底
CUDA,V4.1 Q2 SSD(2026-09 中旬)最多 8 行 decode 批处理;更大混合 prefill 有序
双 Spark 网络 TP,V4.1(2026-09 中旬)≥5 个就绪 session 才批,小组有序更快
CUDA 单卡(含 DGX Spark,Qwen)有序执行

N 个常驻 session 分配 N 份 KV 状态,所以"能装一次的上下文"未必能装 N 次。原生批处理提升聚合吞吐;有序兜底提供并发和公平性,但没有同样的加速。V4.1 的原生解码(ds41_sessions_batch_supported)要求各 session 有有效检查点、pos == checkpoint.len、非 SSD streaming、非质量采集,且 image_count == 0——原生批处理图没有逐行 Engram/图像抑制逻辑(见 engram)。Qwen 的原生批处理(qwen4_graph_native_session_batch_check)要求非图像、非 steering、非分布式、无待决快照。

注意:原生会话批处理激活时,MTP 推测解码被禁用——唯一例外是 Qwen3.8 on Metal(--mtp 批处理推测,逐周期"整批同进退"的起草决策)。批处理槽位路由(复用阶梯探测 + 陈旧度驱逐分层)2026-09 中旬重构,详见 Part 5 §6。

相关概念 ​

详见 Part 5 — 会话批处理。