Skip to content

fix(pd): recover paused decode requests without restarting generation - #1562

Draft
sufubao wants to merge 2 commits into
ModelTC:mainfrom
sufubao:fix-pd-request-recovery
Draft

fix(pd): recover paused decode requests without restarting generation#1562
sufubao wants to merge 2 commits into
ModelTC:mainfrom
sufubao:fix-pd-request-recovery

Conversation

@sufubao

@sufubao sufubao commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

PD Decode 显存不足时,旧实现会结束当前分段,由 Master 拼接已生成文本、重新分词并发起下一段请求。已经开始输出的回答因此再次经过资源接纳,可能被限流或超时中断。

本改动用原请求的暂停与 KV 恢复替换分段生成,取代已撤回的 #1561

  • D 保留原 InferReq、共享请求、准确 token ID 历史、采样状态和输出计数,容量不足时进入已有暂停队列。本地缓存命中则直接恢复,否则由 P 补算缺失 KV。
  • D 空闲时立即尝试恢复,不再等待 100 轮轮询;暂停队首长请求放不下时继续检查后面的请求,恢复仍受现有容量预算约束。
  • P 的恢复工作使用独立本地 ID,但传输目标仍为原 D 请求;恢复输出不交付客户端。传输键包含恢复轮次,完成通知回到各自本地请求,旧轮次消息不会推进当前请求。
  • P 保留原始多模态资源供恢复复用,跳过重新分词和多模态 token 展开。正常结束、失败、取消和断连统一清理,等本地共享请求回收后再释放资源。
  • P 恢复工作使用现有高优先级调度,不受新请求接纳超时约束。Master 的 LIGHTLLM_PD_REQUEST_TIMEOUT_SECONDS 默认 1800 秒,负值关闭;旧续跑资源等待配置不再控制该流程。

需同步更新并重启 Master、P、D 及所有工作进程,不能混用旧版传输协议。该改动保留已有实际传输超时,不替代客户端/网关超时,也没有增加 SSE 心跳。

验证:

  • 72 项现有 CPU 测试通过,覆盖请求生命周期、缓存统计、错误上报、采样参数、P 取消和 PD Master。
  • 仓库外 26 项专项检查通过(新增 5 项调度检查,修改前其中 2 项复现等待问题),覆盖准确 int64 token 历史、本地缓存恢复、混合注意力 KV/状态页匹配、首 token 前暂停、多轮恢复、旧消息隔离、传输失败、输出隔离、资源释放及取消/总期限。
  • Black、flake8、git diff --check 通过。按用户要求未提交单元测试变更。
  • 现有 test_pd_dynamic_split.py 中 4 项断言仍要求容量不足时结束分段,与删除的行为绑定,执行时失败;未将它们计入通过项。

在 8×H100 80GB、2P1D、MTP 的同配置服务上,完成 3189 请求的 timestamp 回放(20% session sample、相同 seed、1000 VU)。各行是独立单轮运行:

指标 upstream cd2edb90 原分支 8e5944de 当前 f7eeab04
成功率 90.37% 86.27% 90.22%
HTTP 429 306 437 311
TTFT P90 36.13s 30.77s 37.61s
TPOT P50 11.70ms 11.59ms 10.37ms
TPOT P95 18.52ms 21.69ms 16.70ms

当前版本回放期间每秒采集 D 指标,1920 条样本中暂停数均为 0。采样不能排除短暂暂停,但没有证据证明上述差异来自恢复优化;运行波动、物理节点和输出集合也可能影响结果。因此不声明此改动已解决整体性能问题。

专项 GPU 验证(同一 f7eeab04、8×H100、2P1D、Qwen3.5 hybrid attention + DSpark MTP):

  • 将 D KV 池限制为 8192 tokens,Master/P/D 请求长度上限统一为 6000。4×4000-token 流式请求全部正常完成,实际最多观测到 2 个暂停请求,输出计数连续。
  • 恢复任务在 P 上 GPU/CPU/disk 缓存全部未命中,分别从零补算 2777、2621 tokens;D 的对应 epoch=1 KV 传输成功。
  • 3×5500-token 请求全部正常完成,日志确认同一 D 请求经历到 epoch=3 的恢复;该轮最大相邻 token 间隔为 4.29s。
  • 暂停期间关闭全部客户端流后,D 运行/排队/暂停计数均为 0,随后新请求成功;全部实验结束后健康检查通过。
  • 另一次 4×5500-token 尝试中,新请求返回 429,测试脚本 fail-fast 取消其他流,该轮没有计为通过。前两次测试配置错误导致的启动失败也已归档,不属于恢复失败。

这些检查验证了该文本负载上的真实 GPU 恢复和取消,不保证过载时无停顿,也不是逐 token 数值/质量等价验证。日志轮询存在批次缺口,以上证据来自实际捕获记录,完整角色日志保存在 AFS。所有实验通过 exp 归档。

保持草稿:图片、音频等多模态资源在 GPU 恢复中的专项覆盖,以及更广泛的模型兼容性验证尚未完成。

基于最新 upstream/maincd2edb90),已适配 #1559 的 hybrid checkpoint / att_state 接口并重新验证。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant