Files
agentic-pd-hybrid/docs/REFACTOR_PLAN_V1_ZH.md
kzlin 2ec0debef4 feat(kvc): session migration with reset-on-success + direct-append threshold tuning
KVC v2 beats 4DP at ts=1 same-scale on 7/8 metrics:
  TTFT mean -24%, p50 -54%, p90 -64%; lat mean -0.8%, p50 -12.6%, p90 -0.7%.
  Direct-to-D rate jumped 42.8% -> 91.7%. REFACTOR_PLAN_V1 scenario C achieved.

Two-knob fix:
- reset-on-success blacklist decay: clear (sess, D) reject counter on
  successful direct-to-D path. Eliminates v1 thrashing where session 6880
  was stable on decode-1 for 70 turns then collapsed to 75 D-changes after
  cumulative transient pressure tripped the permanent blacklist.
- bump --kvcache-direct-max-uncached-tokens default 2048 -> 8192 via CLI flag.
  41% of v1 fallbacks were 'real-large-append' (>2048 token append); raising
  the threshold lets these go through the direct-to-D fast path.

Code:
- policies.py: RoutingState.session_d_rejects counter + KvAwarePolicy
  migration_reject_threshold; degenerate fallback picks least-rejected D.
- replay.py: record_admission_reject + reset-on-success in _run_request;
  _fallthrough_reason classifies turn-2+ fall-throughs as session-not-resident
  / real-large-append / etc, replacing misleading 'large-append' suffix
  (TEAM_REPORT §2.7).
- cli.py + benchmark.py: --kvcache-migration-reject-threshold flag wiring.

Docs:
- REFACTOR_PLAN_V1_ZH.md: forward-looking plan after ts=1 validation.
- MIGRATION_V1_FINDINGS_ZH.md: v1 thrashing root-cause analysis.
- V2_RESULTS_ZH.md: v2 results, scenario C achievement, attribution.
- TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md: comprehensive team report.

Scripts:
- sweep_ts1_kvc_n3_plus_dp.sh: ts=1 baseline (KVC 1P3D N=3 + 4DP CA).
- sweep_ts1_migration_v1.sh / v2.sh: validation runs.
- analyze_ts1_validation.py: 4-way comparison analyzer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 01:18:13 +08:00

18 KiB
Raw Blame History

Refactor Plan v1基于 ts=1 验证后的重构方向

日期2026-05-08 前置文档

  • docs/REFACTOR_PLAN_ZH.mdv0已被本文 supersede——v0 的 backpressure 切入点结论已撤回)
  • docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md(包含 §1-§7 结构性问题清单)
  • docs/STRUCTURAL_VALIDATION_REPORT_ZH.mdts=10 数据下的早期验证)

触发outputs/qwen3-30b-tp1-ts1-validation/ 4 个 run 完成KVC 1P3D × N=3 + 4DP CA × 1全部 ts=1

目的:把 ts=1 验证结果落到具体的重构决策——哪些事必须做、哪些事不要再做、KVC 项目本身是否需要重新定义价值主张


0. TL;DR

  1. ts=10 失真是真的,影响 5-10×——KVC 在 ts=10 灾难性输 DP 是 benchmark artifact不是机制本身有问题
  2. ts=1 同 scale 下 KVC ≈ DPlat mean 差 9%TTFT 差 47%errors 双 0
  3. TEAM_REPORT 的 §1session pin 不公平)是真问题,但代价从 6× 降到 ~2×——仍是唯一值得做的 KVC 优化
  4. TEAM_REPORT 的 §2/§3/§4/§5 大多是 ts=10 高压 artifact——ts=1 下要么不显著、要么自然吸收
  5. N=1 不可信是 ts=10 现象——ts=1 下系统在 categorical 层面完全确定routing/admission/errors 三次 run 完全相同)

项目落到情景 BKVC ≈ DP——三种 forward 路径任团队决策(见 §6


1. ts=1 验证数据

1.1 实验配置

Trace outputs/qwen35-swebench-50sess.jsonl4449 reqs / 52 sessions
模型 Qwen3-30B-A3B-Instruct-2507TP1
硬件 单机 4× H100 80GB原始 ts=10 实验是 8 GPU本次缩配
Time-scale 1真实 trace 时序inter-turn gap p50 = 2.5s
Concurrency 32
KVC 配置 1P3Dpolicy=kv-awareadmission=workerseed-min-turn=1prefill-priority-eviction
DP 配置 4-way colopolicy=kv-awarecache-aware
输出根 outputs/qwen3-30b-tp1-ts1-validation/

1.2 Headline 对比

Metric KVC 1P3D ts=1N=3 均值) 4DP ts=1 Delta
真实 mechanism errors 0 0
报告 errors口径不一致见 §1.3 5 0
Lat mean 1.574s 1.443s DP 优 9%
Lat p50 0.810s 0.659s DP 优 19%
Lat p90 3.796s 3.641s DP 优 4%
Lat p99 8.722s 8.433s DP 优 3%
TTFT mean 0.244s 0.129s DP 优 47%
TTFT p50 0.122s 0.090s DP 优 26%
TTFT p90 0.572s 0.252s DP 优 56%
Per-worker spread ±3.8% (3D) ±3.1% (4 direct) 接近

1.3 KVC 5 errors 的真实身份

DP 的同 5 个 (sess, turn) 也"失败"——但 metrics 口径不同:

KVC: 计入 error_count
DP:  metrics 记 error=OK + finish_reason={'type':'abort', 'message':'Input length (X) exceeds the maximum allowed length (87811)'}
sess turn input_len KVC max DP max
35680 132 91600 92098 (✓) 87811 (✗)
35680 133 92335 92098 (✗) 87811 (✗)
39360 137 91700 92098 (✓) 87811 (✗)
39360 138 92003 92098 (✓) 87811 (✗)
39360 139 92135 92098 (✗) 87811 (✗)

两边都拒同样的请求——区别只在于 KVC 在 P 端拒KV 池满、DP 在 prefill 端拒max-input limit真实 mechanism 错误率KVC 0 / DP 0

1.4 ts=1 的确定性

KVC N=3 三次 run 跨 4449 records

维度 跨 run 差异
execution_mode 0 / 4449 records 不同
assigned_decode_node 0 / 4449 records 不同
Errors5 个 sess/turn 对) 完全相同
18 starved + 16 lucky session 完全相同
Per-D load (1502/1445/1502) 完全相同
Lat mean 1.574 / 1.573 / 1.5740.06% 漂移)
Lat p50 0.811 / 0.809 / 0.8120.4% 漂移)
单 request lat abs p90 diff = 25ms

结论:低压 / ts=1 区间下 KVC 系统在 categorical 层面(路由 / admission / 失败位置)完全确定,仅低层数值有 model 计算微抖动。


2. 对 TEAM_REPORT §1-§7 的修订

§ TEAM_REPORT 原 claim TEAM_REPORT 原优先级 ts=1 验证后状态 修订优先级
§2.1 session pin + 容量盲选 → 25% 饿死 P0 结构性问题仍在18/52 session 永久 pin但代价从 6× 慢降到 ~2× P0(唯一值得做的 KVC 优化)
§2.2 D-side LRU 跟不上 → 8% errors P0 ⚠️ D 仍瞬时顶到 token_usage=1.00,但ts=1 下 drain time 自然吸收——0 KVTransferError 雪崩vs ts=10 369 次) 降级 P3drain time 已解决症状)
§2.3 无 backpressure 通道 P1已实现 ts=1 下 transfer cascade 不存在backpressure 无作用对象 冷藏(代码留着,但默认 off
§2.4 P-side round-robin 不感知 D 健康 → prefill-0/-1 错误差 180× P1 ⚠️ 1P 配置不可测ts=10 现象高度怀疑也是 artifact(错误本身在 ts=1 消失) 存疑 / 重测后再说
§2.5 admission RPC 进 scheduler 主循环 → 1Hz polling 让 errors ↑46× P2 是 ts=10 高压时的现象ts=1 下不显著 冷藏
§2.6 time-scale=10 失真 → 所有 KVC vs DP 结论可能被放大 P0 完全证实74× errors↓, 8.7× TTFT↓, 7× per-D spread↓ DONE作为前置条件锁定
§2.7 execution_mode 标签命名错位 P1 仍存在;本次 ts=1 又发现 error_count 在 KVC vs DP 口径不一致 P1(纯 labeling 修复,~半天)
§2.8 N=1 不可信 → 实验必 N≥3 P2 ⚠️ 是 ts=10 高压现象——ts=1 下 N=1 categorical 完全确定 改写规则:高压 N≥3 / 常规 N=1
§2.9 microbench 把 KVC 失效条件全规避 仍成立 保留观察(实验设计原则)

3. v0 REFACTOR_PLAN 回顾

3.1 v0 做对的

  • 唯一代码改动选 backpressure:作为对 §2.3 的最小验证手段是合理的
  • 预算 KISS:用 8h GPU 验证 §1-§7思路正确
  • 明确"P0 是 time-scale=1 baseline"v0 的 §1 末尾就指出 "time-scale=1 验证为 P0 待办"——本次实验正是把这条做了

3.2 v0 的核心误判

v0 假设 实际
backpressure 是 §3 的最小验证 → 也是修复 ts=1 下 §3 的症状transfer cascade不存在backpressure 无效
8h 预算够跑 ts=1 baseline + backpressure smoke ts=1 单 run 5.5h4 run 全跑要 22h实际跑了 22h
§1 / §2 的修复"超出 KISS 边界",先验证不修 验证后发现 §1 是唯一值得做的真问题,应该早点把它纳入

3.3 v0 的 backpressure 代码命运

代码保留(--enable-backpressure 默认 off原因

  • 不删除是因为如果未来跑高压 / 大 trace / 真 RDMA 失败回归到类 ts=10 区间,可能仍有用
  • 不部署、不启用、不文档化为推荐配置——避免给以后看到代码的人误导

4. 修订后的优先级矩阵

                    必做                   建议做                  不做
                  ────────              ────────              ────────
ts=1 必修        §1 capacity-aware   (空)                   §2 / §3 / §4 / §5
                 policy + migration                          的 ts=10 fix

ts=1 nice        §2.7 metrics 标签   (空)                   §2.8 N≥3 严苛规则
to have         统一口径                                    (改成"高压 N≥3"

文档              §3 写入 TEAM      v0 标记 superseded     ts=10 数据归档
                  REPORT 更新                               (但保留可追溯性)

唯一进入"必做工程"列表的是 §1。其他全是文档或冷藏。


5. KVC vs DP 拆分到 path-level 看真实差距

理解 §1 的 ROI 必须先看 path-level不是整体均值

5.1 KVC 内部 path 性能(来自 ts=1 N=3 一致数据)

Path n 占比 Lat p50 TTFT p50
kvcache-direct-to-d-session(快路径) 1903 42.8% 0.475s 0.042s
pd-router-fallback-large-append-session-cap(慢路径) 2409 54.2% 1.04s 0.32s
pd-router-turn1-seed(每 session 一次) 52 1.2% 0.375s 0.057s
其余 85 1.8% 多种 多种

5.2 DP 全部 path单一

Path n 占比 Lat p50 TTFT p50
dp-colo-router 4449 100% 0.659s 0.090s

5.3 路径级对比

KVC direct KVC fallback DP
Lat p50 0.475s(赢 DP 28% 1.04s(输 DP 58% 0.659s
TTFT p50 0.042s(赢 DP 53% 0.317s(输 DP 252% 0.090s

事实陈述

  • KVC 快路径 明显快于 DP无 P 介入、无 mooncake transfer
  • KVC 慢路径 明显慢于 DPP→D transfer 开销没法摊到 turn 内)
  • 当前 quick:slow = 42.8% : 54.2%——慢路径多 → 整体输 DP 9-47%
  • 如果能把比例反过来到 70:25 或更好KVC 整体会赢 DP

§1 的本质就是"为什么有 54% 进了慢路径"——因为 18/52 session 被 pin 在容量紧张的 D 上,每次 admission 都拒。


6. 三种 forward 路径

更新2026-05-09:情景 C 已实现——见 docs/V2_RESULTS_ZH.md。下面三个分支保留作历史记录。

情景 描述 状态
A KVC < DP接受现状转维护 不适用
B KVC ≈ DP重新定义价值主张 不适用
C KVC > DP优化拉大差距 ✓ 实现v2 在 7/8 头部指标击败 4DPTTFT mean -24%, p50 -54%, p90 -64%lat mean -0.8%, p50 -12.6%

关键修复:(1) reset-on-success blacklist decay消除 v1 thrashing(2) --kvcache-direct-max-uncached-tokens 2048→8192让 41% 大 append 走 direct-to-D 快路径。direct-to-D rate 从 baseline 42.8% 升到 v2 91.7%。

6.1 选项 A接受现状项目转维护

判断KVC 在 ts=1 + 同 scale 下 ≈ DP9% 慢、47% TTFT 慢),但也没灾难性输。如果项目目标是"验证 KV-aware routing 在 agentic 上是否可行",答案是 可行但收益不显著

操作

  • 写 TEAM_REPORT §3 总结 ts=1 实验
  • 把 ts=1 数据 + 4 个 run 归档到 RESULTS_FROZEN_TS1.md
  • KVC 代码保留但标记 "experimental, not recommended for production"
  • 团队转下一个项目方向(不是本文范围)

成本1 周文档收尾。 风险:放弃了 §1 修复后可能的 KVC > DP 上限。

6.2 选项 B做 §1目标让 KVC > DP

判断5.3 节的路径分析表明 KVC 快路径已经赢 DP如果把饿死 session 救回快路径KVC 整体可能赢 DP。

具体改动

6.2.1 capacity-aware policypolicies.py:166-172

当前评分(无容量项):

score = (
    overlap + sticky * self.sticky_bonus,
    sticky,
    inflight_penalty,
    assignment_penalty,
)

提议改为:

# 新增D 当前容量利用率(从 worker-mode admission 已能查到)
capacity_used = worker_capacity_used_ratio.get(worker.worker_id, 0.0)

# Hard cap容量 > X 时禁止该 D 进入候选
if capacity_used > HARD_CAP_THRESHOLD:  # e.g. 0.85
    continue

score = (
    overlap_capped,           # 原 overlap但限幅避免单个 D 永远赢
    -capacity_used,           # 新增二级排序项:偏好空闲 D
    sticky,
    inflight_penalty,
)

6.2.2 session migrationreplay.py 或 policy 层)

当 session X 在 D-A 上连续被 admission 拒 N 次(如 N=3

  • 主动 release X 在 D-A 上的 session state
  • 允许下次 turn 把 X 路由到另一个 D
  • 代价:丢失 D-A 上已积累的 KV——但 fallback 路径本来也丢了,净收益正

6.2.3 metric 修复(replay.py

把"pd-router-fallback-large-append-*" 标签按真实原因细分:

  • session-not-resident-on-pinned-D§1 主因)
  • real-large-append>2048 阈值§2.7
  • session-was-evicted(被 LRU 踢过)
  • session-cap-rejectedworker admission 拒)

让以后看 metrics 的人不再被名字误导。

6.2.4 验证

  • 每改动跑 KVC 1P3D ts=1 N=1categorical 确定,不需要 N=3
  • 对比 baseline run1已有数据
  • 关键指标:kvcache-direct-to-d-session 占比、整体 lat mean、TTFT mean
  • 目标direct-to-D rate 从 42.8% 升到 > 70%、整体 lat 追平或赢 DP

成本3 天编码 + 5 天测试 + 2 天文档 ≈ 2 周。 风险

  • session migration 可能导致 thrashA→B→A→B需要冷却时间机制
  • capacity HARD_CAP 阈值需要 sweep 找最优
  • 改完仍可能不赢 DP理论上限不知道

6.3 选项 C保留 KVC但寻找 KVC 真正赢的工作点

判断:当前 SWE-Bench 50 sessions × 30B 模型 × 4 GPU 是一个特定工作点。KVC 的设计初衷是"长 multi-turn session 的 KV 复用"——可能在某些其他工作点有显著优势。

候选工作点

  • 更长 session>200 turns:复用收益更大
  • 更小模型(如 7B / 14Bmooncake transfer 占比更大KVC 节省更明显
  • 更大 trace>200 sessionsDP 的 prefix cache 命中率会下降KVC 的 session-aware 优势放大
  • 真实 RDMA非 mooncake TCP loopbacktransfer 更快KVC 的 P→D 开销更小

操作

  • 设计 1-2 个新 micro/macro benchmark
  • 跑 KVC vs DP 对比
  • 找到差距 > 30% 的工作点KVC 赢 / 输都是数据)

成本~1 个月trace 设计 + benchmark + 分析)。 风险:可能找不到 KVC 显著赢的工作点。


7. 推荐组合

按风险 / 收益排序:

  1. 必做(无论选 A/B/C

    • TEAM_REPORT §3 ts=1 验证更新
    • metrics 标签口径§2.7 + KVC/DP error_count 一致化)
    • 冷藏 backpressure 代码(不删但默认 off
    • 把 v0 REFACTOR_PLAN 标 superseded
  2. 强烈推荐:选项 B 的 §6.2.1capacity-aware policy hard cap

    • 工程量小(~1 天编码 + 1 天测试)
    • 验证 §1 修复的真实收益是否如预测
    • 如果 direct-to-D rate 不显著提升 → 把 §6.2.2 也加上
    • 如果还不行 → 接受现状走选项 A
  3. 看团队带宽:选项 C 的工作点探索

    • 不与 §6.2 冲突,可以并行
    • 找到一个 KVC 真正赢的工作点会极大改变项目价值主张

8. 应该砍掉的事(明确列表)

砍的理由
backpressure smoke sweepv0 计划的 4 run ts=1 下 backpressure 无作用对象
§2.5 admission API probe/commit 拆分 高压才显著,等找到 KVC 高压 workload 再说
§2.2 D-side 分层 LRU evictionhot retract drain time 自然吸收
§2.4 P-side D-health-aware routing 1P 测不出ts=10 现象高度存疑
大量 instrumentadmission-events / pool timeseries 已经够了,先用现有数据
任何 ts=10 区间的优化 那是 benchmark artifact 主导的区间,不代表真实部署
N≥3 实验作为硬规则 改写为"高压 N≥3常规 N=1 即可"

9. 风险与未验证的假设

  1. 4DP ts=1 是 N=1:虽然 KVC ts=1 是确定性的DP 是新机制 N=1理论上需要 N≥3 验证。但 DP 在 ts=10 也是 0 errors / 1.43s mean行为相对 KVC 更稳定N=1 风险较小。如选项 B 推进,建议补 N=2
  2. 2 个 input-too-long session 是 trace 数据问题:这两个 session35680、39360在 turn 132+ / 137+ 才超过 input limit。可能是 trace 生成时没控制好 max input。应该独立把这两个 session 从 trace 移除或截断后重跑作为对照
  3. 4 GPU 缩配 vs 8 GPU 原始:本次 1P3D / 4DP 数据无法跨 8 GPU 原始数据直接比,需要在结论中明确。但 ts=1 + 同 scale 内部对比是干净的。
  4. mooncake TCP loopback:所有 transfer 在单机 TCP 模拟下进行。生产 RDMA 下 KVC 的 transfer 开销可能显著降低KVC 优势可能扩大——这是 选项 C 的一个候选维度
  5. §1 修复是否真能让 direct-to-D 上升到 70%+ 是预测:实际可能受 hash overlap 限制(即使 D 容量充裕,没有 prefix overlap 就走不了 direct-to-D需要 §6.2 验证后才知道天花板
  6. input-limit error 的 metrics 口径修复影响以后所有比较:注意修改后 ts=10 历史数据的 error_count 也需要重算(或在分析时显式补偿)。

10. 决策点(需要团队确认)

请审阅后回答:

# 决策 选项
D1 选哪条 forward 路径? A维护/ B修 §1/ C探索 workload/ B+C
D2 写 TEAM_REPORT §3 ts=1 验证更新章节? Yes / No
D3 把 v0 REFACTOR_PLAN 标 superseded Yes / No
D4 删除 backpressure 代码 vs 冷藏? 删 / 冷藏(默认 off
D5 修 metrics 标签口径§2.7 + error_count 一致化)? Yes / No
D6 是否补 4DP ts=1 N=2 / N=3 做更稳的 baseline Yes / No
D7 是否把 sess 35680 / 39360 从 trace 移除做"干净" baseline Yes / No

附录 A本文数据来源

章节 数据源
§1.2-§1.4 outputs/qwen3-30b-tp1-ts1-validation/{kvc_1p3d_run{1,2,3},dp4}_{summary.json,metrics.jsonl}
§1.4 跨 run 一致性 per-record diff via scripts/analysis/analyze_ts1_validation.py + 临时 diff 脚本
§5 path-level metrics.jsonl 按 execution_mode 分组
§2 §1-§7 修订 docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md 原数据 + ts=1 新数据交叉对比

附录 B相关文档

  • docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md — §1-§7 原结构性问题清单
  • docs/REFACTOR_PLAN_ZH.md — v0 重构计划(本文 supersede
  • docs/AGENTIC_FIT_ANALYSIS_ZH.md — 早期 fit 分析§1-§7 来源)
  • docs/STRUCTURAL_VALIDATION_REPORT_ZH.md — ts=10 结构性 claim 验证
  • docs/KVC_DEBUG_JOURNEY_V1_TO_V5.md — v1→v5 演进
  • docs/V5_PROFILE_INVESTIGATION_ZH.md — v5+profile 调查(已 critic 修订)
  • scripts/sweep_ts1_kvc_n3_plus_dp.sh — 本次 4 run sweep 脚本
  • scripts/analysis/analyze_ts1_validation.py — 本次分析脚本

作者注:本文偏决策导向。如果要写更技术的 §1 capacity-aware policy 实现细节,应该在 D1 决策为 B 之后单独出一份 IMPL_CAPACITY_AWARE_POLICY.md