Prhub

#27293 [HiCache][Dsv4] Don't cache C128 State pool in L3

原始 PR 作者 vladnosiv 合并时间 2026-06-08 21:23 文件变更 1 提交数 3 评论 13 代码增减 +2 / -18

执行摘要

HiCache 不再缓存 C128 State 池

C128 State 池被添加到 HiCache 的池列表中,但由于页大小 256 能被 128 整除,缓存命中边界上尾部实际为空,缓存命中时永远不会被消耗。同时槽位仍然被分配,导致 L3 缓存中每百万 token 约 0.54GB 的开销。

该 PR 值得精读,展示了如何分析缓存系统中无效的池注册问题,并进行针对性优化。设计决策(基于页大小整除性判断 State 是否可被读取)值得类似场景借鉴。

讨论亮点

审核者 hzh0425 和 ispobock 均认可该变更,ispobock 特别感谢了作者的发现和测试结果。讨论中作者详细解释了 C128 State 池不会被读取的技术原因:State 缓冲区在 c128_forward 中通过 kv_buf 读取,但仅在 prefill 期间且 plan 有效时才调用 c128_forward,而 plan 的填充逻辑决定了 State 数据不会被有效使用。此外,作者提供了多组 AIME25、GPQA、MMLU 的冷/热 L3 缓存精度对比,结果均在正常波动范围内,证明移除后精度无损。

实现拆解

  1. 识别无效池条目:在 python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.pybuild_deepseek_v4_hicache_stack 函数中,发现 DEEPSEEK_V4_C128_STATE 池的注册是冗余的,因为其 State 大小 (128) 整除页大小 (256),导致缓存命中时 State 数据永远不会被读取。
  2. 移除 State 池创建和注册:删除了创建 c128_state_host_poolbuild_pool_entry 中对应的 DEEPSEEK_V4_C128_STATE 条目,仅保留 DEEPSEEK_V4_C128 (KV) 池的注册。
  3. 添加注释说明:在移除位置添加注释,解释不再注册 C128 State 池的原因,便于后续维护。
  4. 验证:通过 AIME25、GPQA、MMLU 等精度测试确认移除后模型精度无退化,同时 CI 测试全部通过。
文件 模块 状态 重要度
python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.py HiCache modified 6.55

关键源码片段

python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.py core-logic

核心变更文件,移除了 C128 State 池在 HiCache 中的注册,减少 L3 缓存无效占用。

# python/sglang/srt/mem_cache/hybrid_cache/hybrid_pool_assembler.py#L432-L454
# 修改前:创建 c128_state_host_pool 并注册到 HiCache
# 修改后:仅保留 C128 (KV) 池,State 池不再注册
if c128_layer_mapping:
    c128_host_pool = DeepSeekV4PagedHostPool(
        pool_name=str(PoolName.DEEPSEEK_V4_C128),
        device_buffers=kvcache.c128_kv_pool.kv_buffer,
        item_bytes=kvcache.c128_kv_pool.bytes_per_page_padded,
        num_host_pages=num_host_pages,
        slot_page_size=page_size,
        layout=server_args.hicache_mem_layout,
        allocator_type=server_args.hicache_storage_backend,
    )
    # 注释说明:C128 state pool 有意不注册到 HiCache。
    # 因为 page_size=256 % 128 == 0,state 在加载时不会被消耗。
    entries.extend([
        build_pool_entry(
            name=PoolName.DEEPSEEK_V4_C128,
            host_pool=c128_host_pool,
            device_pool=kvcache.c128_kv_pool,
            layer_mapping=c128_layer_mapping,
            transfer_layer_num=transfer_layer_num,
        ),
        # 移除了之前注册 DEEPSEEK_V4_C128_STATE 的 build_pool_entry 调用
    ])

评论区精华

确认修改合理性 设计

hzh0425 表示认同修改,并请 ispobock 双重检查。

结论:ispobock 认可修改,并感谢作者的发现和测试结果。 · 已解决

精度测试验证 测试

作者提供了 AIME25 (max-tokens=384k)、GPQA、MMLU 等大量精度测试结果,冷 /L3 精度均在正常波动范围内。ispobock 指出 AIME25 分数偏低可能因为 max_tokens 较小,建议设为 200k 可获得更高分数。

结论:精度无损,验证了修改的安全性。 · 已解决

技术原理说明 设计

作者详细解释了 C128 State 池不会被读取的技术原因:state 缓冲区在 c128_forward 中通过 kv_buf 读取,但仅在 prefill 期间且 plan 有效时才调用,而 plan 的填充逻辑使得 State 数据不会被有效使用。

结论:确认移除是安全的。 · 已解决

风险与影响

风险较低。主要风险是移除 State 池后,如果未来某处代码路径开始读取 C128 State 且依赖 HiCache 预加载,会导致功能缺失。但当前代码中 State 池的读取路径已被证明在缓存命中时永远不会被调用,且移除后 CI 和精度测试均通过。

对用户:HiCache 启用且使用 DeepSeek-V4 模型时,L3 缓存占用减少约 0.54GB/1M tokens,可间接提升其他数据的缓存效率。对系统:移除无效的 L3 分配逻辑,减少不必要的内存带宽和存储空间消耗。对团队:代码简化,移除约 18 行冗余代码。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论