执行摘要
- 一句话:Mooncake后端支持DSA和Mamba模型
- 推荐动作:值得精读:该PR是HiCache支持混合模型的关键一步,引入了重要的设计模式:
- 使用
build_*_stack 函数封装特定模型池的组装逻辑,使 HiRadixCache 和 HiMambaRadixCache 保持干净。
HostPoolGroup 和 PoolEntry 的抽象使得混合池的管理统一化。
- Mooncake后端的
batch_v2 系列接口提供了多组件页面的通用处理方法,可复用于其他存储后端。
建议密切关注后续PR:#22767(修复HostPoolGroup属性问题)、作者承诺的新PR(处理mha_suffix和cp配置)以及原子性问题。
功能与动机
根据关联Issue #21846,代理工作负载驱动KV缓存存储和传输量快速增长,现有PD分离+HiCache堆栈遇到瓶颈,HiCache对混合模型的兼容性有限。为实现端到端PD增量传输、HiCache/HiSparse、流水线并行和Eagle的集成,需要Mooncake后端支持Hybrid Model(Linear & DSA)。本PR实现路线图中“Mooncake backend support for hybrid model”项。
实现拆解
-
引入混合池组装器 (python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.py,新增)
- 新增 build_nsa_hybrid_stack 和 build_mamba_hybrid_stack 函数。
- 这些函数负责创建 HostPoolGroup(包含KV、INDEXER或MAMBA池)和 HybridCacheController,并挂接到 HiRadixCache / HiMambaRadixCache 上。
- 通过 PoolEntry 区分主锚点池和共享索引池,使额外池(如INDEXER)与KV池共享相同的页面索引。
-
扩展主机缓存池体系 (python/sglang/srt/mem_cache/memory_pool_host.py)
- 添加 HICACHE_HOST_MEMORY_RESERVE_BYTES 常量替代硬编码10GB。
- 新增 MambaPoolHost 类,管理Mamba temporal/conv状态在主机端的缓存。
- 新增 NSAIndexerPoolHost 类,管理NSA索引器的主机缓存,布局与锚点MLA池对齐。
- 为 HostPoolGroup 添加 share_indices_with_anchor 属性,支持池间共享页面索引。
- 添加 get_hybrid_pool_buffer 和 get_page_buffer_meta 方法,供存储后端零拷贝I/O使用。
-
Mooncake存储后端支持混合页面批量操作 (python/sglang/srt/mem_cache/storage/mooncake_store/mooncake_store.py)
- 实现 register_mem_host_pool_v2,仅注册额外池(Hybrid pool)的缓冲区到Mooncake。
- 添加 _tag_keys 支持额外的后端标记。
- 实现 _get_hybrid_page_component_keys 将逻辑页面分解为多个存储键(如MAMBA页面对应1个temporal键 + N个conv键)。
- 添加 batch_exists_v2、batch_get_v2、batch_set_v2、_batch_io_v2 等新批量接口,处理混合池的多组件页面。
-
调整层次缓存初始化流程 (python/sglang/srt/mem_cache/hiradix_cache.py、hi_mamba_radix_cache.py)
- HiRadixCache.__init__ 中对于 NSATokenToKVPool 不再直接创建 NSATokenToKVPoolHost,而是在后续通过 build_nsa_hybrid_stack 填充。
- HiMambaRadixCache 移除内联的池构建逻辑,改为调用 build_mamba_hybrid_stack,大幅减少重复代码。
-
增强HybridCacheController的共享池传输 (python/sglang/srt/mem_cache/hybrid_cache/hybrid_cache_controller.py)
- 添加 _resolve_shared_pool_transfers,在 _page_transfer 和 _page_backup 中为共享索引的池填充相同的 hash_value 和 host_indices。
- 修改 _resolve_pool_transfers_allocation,允许传入 kv_device_indices 和 kv_host_indices 供共享池复用。
测试配套:更新 test/registered/unit/mem_cache/test_nsa_pool_host_unit.py,覆盖新增的 NSAIndexerPoolHost 相关路径。
配置配套:hicache_storage.py 补充 PoolHitPolicy、PoolName、PoolTransfer 等枚举,供混合池标识用。
关键文件:
python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.py(模块 混合池组装器;类别 source;类型 core-logic;符号 build_nsa_hybrid_stack, layer_mapper, build_mamba_hybrid_stack, kv_layer_mapper): 完全新增的文件,是混合池组装的核心入口,定义了 build_nsa_hybrid_stack 和 build_mamba_hybrid_stack,负责组装 HostPoolGroup 和 HybridCacheController。
python/sglang/srt/mem_cache/memory_pool_host.py(模块 主机内存池;类别 source;类型 core-logic;符号 get_hybrid_pool_buffer, get_page_buffer_meta, kv_buffer, size_per_token): 核心变更文件,新增 MambaPoolHost、NSAIndexerPoolHost 类,修改 HostPoolGroup 以支持共享索引,添加 get_hybrid_pool_buffer 和 get_page_buffer_meta 方法,调整内存预留常量。
python/sglang/srt/mem_cache/storage/mooncake_store/mooncake_store.py(模块 Mooncake存储;类别 source;类型 dependency-wiring;符号 register_mem_host_pool_v2, _tag_keys, _get_hybrid_page_component_keys, batch_exists_v2): Mooncake 存储后端获取批量操作 v2 接口,支持混合页面(多个存储键对应一个逻辑页面)的 exists/get/set 操作。
python/sglang/srt/mem_cache/hiradix_cache.py(模块 层次缓存;类别 source;类型 dependency-wiring;符号 _get_extra_pools, _get_hybrid_storage_attach_kwargs): 调整初始化逻辑,对于 NSA 模型不再直接创建 NSATokenToKVPoolHost,而是由 build_nsa_hybrid_stack 延迟填充;依赖引入 HybridCacheController 和 build_nsa_hybrid_stack。
python/sglang/srt/mem_cache/hi_mamba_radix_cache.py(模块 Mamba层次缓存;类别 source;类型 core-logic;符号 kv_layer_mapper, mamba_layer_mapper): 重构,将大部分池构建代码(HostPoolGroup、MambaPoolHost 等)移至 hybrid_pool_assembler,仅保留调用 build_mamba_hybrid_stack,减少重复逻辑。
python/sglang/srt/mem_cache/hybrid_cache/hybrid_cache_controller.py(模块 缓存控制器;类别 source;类型 entrypoint;符号 _resolve_shared_pool_transfers): 添加 _resolve_shared_pool_transfers 方法以确保共享索引的额外池与KV池在传输时使用相同的 hash_value 和 indices;修改 _resolve_pool_transfers_allocation 接收外部 indices。
python/sglang/srt/mem_cache/hicache_storage.py(模块 存储公共定义;类别 source;类型 data-contract): 添加 PoolHitPolicy、PoolName、PoolTransfer 等枚举和数据类,为混合池标识和传输提供类型支持。
test/registered/unit/mem_cache/test_nsa_pool_host_unit.py(模块 单元测试;类别 test;类型 test-coverage): 测试文件更新以覆盖新的 NSAIndexerPoolHost 行为,提高代码信心。
关键符号:build_nsa_hybrid_stack, build_mamba_hybrid_stack, register_mem_host_pool_v2, batch_exists_v2, batch_get_v2, batch_set_v2, get_hybrid_pool_buffer, get_page_buffer_meta, _resolve_shared_pool_transfers, _get_hybrid_page_component_keys
评论区精华
Review过程中主要讨论了以下若干设计决策与潜在问题:
-
添加单元测试(stmatengss):建议为 build_nsa_hybrid_stack 添加单元测试。该建议未得到明确处理,当前PR未包含对应测试,状态待定。
-
_get_hybrid_page_component_keys 复杂度(vladnosiv):指出该函数中的循环逻辑可能导致多项式的复杂度,建议将主逻辑从循环中移出并简化。作者表示将在后续PR中解决。
-
HostPoolGroup 属性重复注册(ShangmingCai):发现 HostPoolGroup 中的 kv_buffer、size_per_token、allocator 属性直接引用锚点池,但锚点池已经暴露了这些属性,当前设计会导致不必要的重复注册。作者确认这是一个bug,并引用PR #22767 来修复。
-
_resolve_shared_pool_transfers 原子性担忧(ShangmingCai):在 HybridCacheController._page_backup 中调用 _resolve_shared_pool_transfers,但基类 HiCacheController._page_backup 不是原子操作,可能造成数据不一致。该问题在review中没有得到进一步回应。
-
mha_suffix 的类型兼容性(ShangmingCai):在 MooncakeStore 中 mha_suffix 在 should_split_heads 时是列表,但其余部分代码中仍当作字符串处理。作者承诺将提交新PR处理包括cp在内的配置细节。
- build_nsa_hybrid_stack 缺少单元测试 (testing): 当前 PR 未添加对应的单元测试,建议仍开放。
- _get_hybrid_page_component_keys 复杂度优化 (performance): 作者表示“I will submit a new PR to address these details”,部分解决。
- HostPoolGroup 属性重复注册问题 (correctness): 作者确认是 bug,并提及由 PR #22767 修复。
- _resolve_shared_pool_transfers 原子性担忧 (correctness): 未收到进一步回应,问题仍然开放。
- mha_suffix 类型兼容性 (correctness): 作者承诺将提交新PR处理包括
cp在内的配置细节,当前未修复。
风险与影响
关联脉络
参与讨论