Prhub

#33777 [HiCache] write_back: reclaim duplicated host copy first under host pressure

原始 PR 作者 xiezhq-hermann 合并时间 2026-08-08 06:59 文件变更 4 提交数 3 评论 1 代码增减 +209 / -11

执行摘要

HiCache write_back 优先回收重复 Host 副本

PR body 开宗明义:'This is to maximize the cache capacity benefit of the write-back policy.' 在 write_back 策略下,设备端已有 Full KV 的节点,其 Host 副本是完全冗余的;优先回收它们可以在不损失任何可用缓存容量的前提下缓解 Host 压力,从而最大化写回策略的有效容量收益。这正是本次变更的核心动机。

值得精读。重点关注惰性跟踪 + 实时复查 + digest 跨 TP 校验的设计模式,以及两轮扫描对“即将被 demote 的 evictable D-leaf”的保留策略。建议后续补充针对 _reclaim_full_host_duplicates 两轮策略与 digest 匹配的独立单元测试,以增强回归保障。

讨论亮点

该 PR 没有 review 讨论线程,reviewer stmatengss 直接 APPROVED 且未附文字意见。唯一的沟通是维护者 hanming-lu 在合并前的评论:'failed tests are unrelated, merging',表明 pr-test-extra 的 CI 失败被判定与本次变更无关,直接放行合并。整体上,这个功能变更的评审过程比较简洁,核心设计权衡(两轮扫描、惰性跟踪、digest 校验)未在评论区展开讨论。

实现拆解

实现按以下步骤拆解:

  1. 树节点状态扩展UnifiedTreeNode 新增 load_back_pending_id 字段,用于标记正在进行的 H->D load-back 读取该节点 host 槽位;UnifiedTreeCore 初始化与 reset 中新增 full_host_duplicates(插入有序字典,保证跨 TP 受害选择确定性)和 write_back_duplicate_reclaim_digest(滚动哈希,用于跨 TP 一致性校验)。

  2. 双份状态跟踪:新增 _update_duplicate_tracking_is_settled_full_host_duplicate,在 backup ack、节点分裂(_split_node)、恢复被驱逐节点(_unevict_node_on_insert)等“双份诞生点”注册;注销是惰性的,依赖 _can_reclaim_full_host_duplicate 在回收时实时复查。节点删除(_remove_leaf_from_parent)时同步清理,避免幽灵条目。

  3. 回收路径改造drive_host_eviction 在 write_back 且目标为 BASE_COMPONENT_TYPE(FULL)时,先调用 _reclaim_full_host_duplicates 回收双份副本,再走常规 LRU 驱逐。回收采用两轮扫描:第一轮跳过 evictable_device_leaves 中的节点(其设备层即将被 demote,主机层可能是唯一副本),第二轮才允许回收;每回收一个节点,更新 write_back_duplicate_reclaim_digest_release_full_host_duplicate 只释放 FULL 的 host 层,aux 组件的 host 切片仍归各自 pool 的 LRU 管理。

  4. DMA 保护与 ack 解除commit_load_back 时为所有涉及 host 槽位读取的节点打上 load_back_pending_idloading_check 在 ack 后通过新增接口 finish_load_back 清除锚点根路径上的标记。节点分裂时该标记会继承给拆分出的新片段,保证 ack walk 不受影响。

  5. 跨 TP 一致性校验_sync_hicache_ready_countsloading_check[digest, -digest] 追加到原有的 all_reduce 张量中,利用 MIN 归约后在所有 rank 上断言 count_values[-2] == -count_values[-1],一旦回收受害顺序分歧立即失败,机制与既有 ready-count 同步共用一次通信。

  6. 测试配套test_unified_radix_cache_unittest.py_simulate_backup 增加 _update_duplicate_tracking 调用,使现有备份模拟与真实 ack 行为一致,从而让既有单元测试覆盖新跟踪逻辑。未新增针对回收策略的独立断言。

文件 模块 状态 重要度
python/sglang/srt/mem_cache/unified_cache/unified_tree_core.py 缓存核心 modified 8.82
python/sglang/srt/mem_cache/unified_cache/unified_tree_core_interface.py 缓存接口 modified 5.92
python/sglang/srt/mem_cache/unified_radix_cache.py 缓存编排 modified 6.08
test/registered/unit/mem_cache/test_unified_radix_cache_unittest.py 单元测试 modified 3.25

关键符号

_update_duplicate_tracking _is_settled_full_host_duplicate _reclaim_full_host_duplicates _can_reclaim_full_host_duplicate _release_full_host_duplicate finish_load_back drive_host_eviction loading_check _sync_hicache_ready_counts

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

CI 失败判定与合并 other

pr-test-extra 的 CI 运行失败,合并者 hanming-lu 在 PR 评论中说明 'failed tests are unrelated, merging'。

结论:维护者判定失败测试与本次变更无关,直接合并;无更多技术争论。 · 已解决

风险与影响

  1. 回收路径性能_reclaim_full_host_duplicatesdrive_host_eviction 同步路径内遍历 full_host_duplicates,Host 压力期间可能引入额外 CPU 开销,但仅在 write_back 且 FULL 组件压力时触发,量级可控。
  2. 跨 TP 一致性断言:digest 要求所有 TP rank 对回收受害者的选择顺序完全一致;任何因 ack 完成顺序、节点创建顺序差异导致的不一致都会直接触发 AssertionError 终止进程。这是有意的强检查,但真实环境若存在 rank 间事件顺序抖动,可能暴露为偶发崩溃。
  3. 惰性跟踪的遗漏风险full_host_duplicates 依赖各事件点调用 _update_duplicate_tracking_remove_leaf_from_parent 清理;若未来新增修改节点状态的路径遗漏调用,可能出现漏回收或误回收。当前 _split_node 只对 new_node 调 _update_duplicate_tracking,child 是否始终保持在正确状态需要持续关注。
  4. 测试覆盖不足:测试仅适配 2 行,没有新增直接断言 duplicate reclaim 行为、digest 计算、DMA 保护等核心逻辑的针对性用例,回归保障有限。

影响范围:启用 HiCache 且写回策略为 write_back 的多卡(TP/PP)部署,在 Host 内存压力下的缓存效率与命中率。对用户而言,优先回收冗余副本能提升有效缓存容量,减少因 Host 内存不足导致的全量换出,理论上改善长上下文复用性能。对团队而言,新增跨 TP 一致性强校验机制为后续 Rust 端口保持等价行为提供契约;接口层新增抽象方法要求所有 TreeCore 实现同步实现,带来一定的维护成本。

host 内存回收核心路径变更 跨 TP 一致性强校验 缺少新增针对性测试 惰性跟踪依赖实时复查

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论