Skip to content

feat(pd): add adaptive cache-aware admission control - #1529

Open
sufubao wants to merge 8 commits into
ModelTC:mainfrom
sufubao:feat/pd-cache-aware-admission
Open

feat(pd): add adaptive cache-aware admission control#1529
sufubao wants to merge 8 commits into
ModelTC:mainfrom
sufubao:feat/pd-cache-aware-admission

Conversation

@sufubao

@sufubao sufubao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

概述

这个 PR 将 PD Master 原先基于进行中请求数的静态阈值,改为一个真实、有界、可取消的缓存感知准入队列。目标不是单纯放大容量,而是在以下三件事之间形成闭环:

  • 优先保护已经成功建立的多轮会话,降低连续对话被 429 中断的概率。
  • 控制冷请求写入 Radix cache 的速度,避免高并发持续刷新缓存、拉低整体命中率。
  • 用一个 Decode 波次的等待队列吸收短时流量尖峰,同时保持明确的内存和等待上限。

准入模型

请求在派发到 P/D 节点前分为三类:

  1. CONTINUATION:携带 X-Session-Id,且服务端在 TTL 内已经观察到同一 Session 成功返回过结果。
  2. PROBABLE_CACHE_HIT:前缀树预估缓存命中率达到阈值。
  3. COLD:没有已确认 Session,也没有足够的预估缓存复用。

队列使用 8:3:1 的加权轮转,优先保护连续会话,同时为低优先级请求保留进展机会。同一 Session 严格串行并保持 FIFO;高优先级请求可在队列满时替换低优先级请求。

自动调节

  • 总准入容量来自当前 Master 实际持有的 Decode 容量租约,不再使用固定 1.5D/2D 阈值。
  • n 个 choice 原子占用 n 个 Decode 槽位,避免单个用户请求绕过容量限制。
  • 等待队列容量随 Decode 容量变化,固定为一个 Decode 波次。
  • P 节点通过 token 包和心跳上报动态 token 负载、Radix 总 token、引用 token 和缓存容量。
  • Master 根据“运行中请求之外可用于缓存的空间”和本地观测到的冷请求实际未命中 token EWMA,自动计算冷请求并发槽位:缓存剩余空间能容纳几个平均冷请求,就开放几个冷槽位。
  • 缓存已满时仍保留一个探索槽位,避免新会话完全饿死;缓存遥测不可用或动态缓存关闭时安全降级为只按 Decode 容量控制。
  • 冷请求内部优先处理预计新增缓存更少的任务,降低短时间内的缓存污染。

多 Master 容量安全

每个 P/D 节点根据当前 PD Master 集合,将 running_max_req_size 确定性切分为互不重叠的容量租约,并随心跳上报租约 epoch。Master 集合变化时会立即唤醒心跳重新上报,旧 epoch 不会覆盖新租约,避免多个 Master 重复计算同一份 Decode 容量。

生命周期与可观测性

  • 排队请求支持超时、任务取消和客户端断开清理,不泄漏槽位。
  • 已取得的租约在生成器关闭、异常或正常结束时统一释放。
  • 节点增删、租约变化和缓存余量变化都会立即重新驱动队列。
  • 新增队列长度、活动槽位和冷请求容量 Gauge,并继续记录排队时长 Histogram。

边界

本 PR 只调整 Master 准入和控制面遥测,不修改底层 Radix cache 的驱逐策略。Probationary/Protected 分段等缓存内部策略留给后续独立 PR。

测试

PYTHONPATH=. pytest -q \
  unit_tests/server/test_pd_admission.py \
  unit_tests/server/test_pd_cache_aware.py \
  unit_tests/server/test_pd_master_mode.py \
  unit_tests/server/httpserver/test_pd_generate_error.py \
  unit_tests/server/httpserver/test_pd_master_cached_tokens.py \
  test/test_pd_selector/test_pd_master_multi_choice.py \
  test/test_api/test_server_busy_handling.py

88 项测试通过;同时通过 git diff --check、新准入模块 Flake8 检查和指标注册验证。本次未运行 benchmark / performance experiment。

@sufubao
sufubao force-pushed the feat/pd-cache-aware-admission branch from 93312ef to b915415 Compare August 31, 2026 12:11
@sufubao sufubao changed the title feat(pd): add cache-aware waiting queue admission feat(pd): 添加缓存感知的等待队列准入策略 Aug 31, 2026
@sufubao sufubao changed the title feat(pd): 添加缓存感知的等待队列准入策略 feat(pd): add cache-aware waiting queue admission Aug 31, 2026
@sufubao sufubao changed the title feat(pd): add cache-aware waiting queue admission feat(pd): add adaptive cache-aware admission control Aug 31, 2026
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