已合并
[feature] memcache KvEvent 适配:缓存感知调度全链路 #779
[feature] memcache KvEvent 适配:缓存感知调度全链路 #779
已合并
jason lyu创建于 18 天前
jason lyu
jason lyu成员
18 天前

1. 合入背景

Agentic AI 多轮对话场景下,请求间共享大量相同前缀,随机调度导致 KV Cache 无法命中、每轮重复 Prefill。本 PR 使能 MemCache 池化 + kv-conductor 缓存感知调度:kv-conductor 订阅 memcache MetaService 的 KvEvent 广播(memcache PR #334/#363),结合引擎 offload 事件做两阶段匹配,请求路由到已缓存前缀的节点,最大化 KV 复用、降低 TTFT。

关联 ISSUE:#508

2. 修改内容

  1. memcache kv_events 部署配置memcache_meta_service.py 新增 kv_events 配置块(enable/endpoint/model_name/block_size,默认关闭、解除注释即开启);mmc-local-*.conf 新增 ock.mmc.local_service.backend_id 默认配置,common.sh 部署时替换为 Pod IP;K8s Service 模板(kv_cache_store / infer_service)暴露 kv-events: 5557 端口。
  2. kv-conductor 支持 memcache KvEvent:新增 MemcacheEventBatch 解析({"events": [...]} wire 格式),按 msgpack 首字节(fixmap)快速分流,跳过无谓的 vLLM/Mooncake 试解析;IpOnly 匹配(backend_id=Pod IP → hbm_ip_index → 节点所有 DP);两阶段匹配(pool stored 先到进 pending_pool 排队、engine offload 后到补匹配,双向 + TTL 清理)。
  3. FlexHash 支持 vLLM 默认 32 字节 sha256 块哈希:取低 64 位(trailing 8 bytes),与 vLLM int 模式(& (1<<64)-1)、memcache BlockHashHexToU64 对齐——修复引擎 offload 事件(sha256 bytes)与池确认(u64)无法匹配的问题。
  4. Coordinatorpool_endpoint 支持 tcp://*:5557 通配符(部署时解析为 KVS_MASTER_SERVICE);store_backend 大小写不敏感(与 kv-conductor Rust 侧一致)。
  5. vLLM MultiConnector 补丁:vLLM 上游 MultiConnector.get_kv_connector_kv_cache_events 未实现(TODO),MultiConnector 顶层配置下引擎 offload 事件被静默丢弃。提供 v0.20.2/0.21.0/0.22.1/0.23.0/0.25.0/0.26.0 各版本补丁(examples/deployer/patch/),已建议上游合入。
  6. 日志可维测性:事件日志统一 kv_event <state> 状态机(received/parsed/queued/offload_cached/matched/confirmed/applied/dropped/pending_expired),matched/confirmed 提为 INFO;medium 统一小写(xpu/cpu/disk,StorageMedium::log_str);query 日志输出 per-medium 命中块数(npu_blocks/cpu_blocks/disk_blocks)、修正耗时字段语义。

3. 资料变更

涉及:docs/zh/user_guide/features/kv_cache_store/backend/memcache.md 新增 KV events 广播小节(开启步骤、backend_id 自动注入、MultiConnector 补丁依赖说明)。

4. 接口变更

不涉及跨代码仓接口变更(memcache 广播格式为 memcache 侧已定协议;kv-conductor HTTP 接口无变更)。

5. 测试结果

  • kv_conductor cargo test:123 + 20 全部通过(含 memcache batch 解析/IpOnly 路由/两阶段匹配/FlexHash sha256 用例)
  • coordinator / deployer 单测全部通过
  • 实机验证(vLLM v0.23.0 + memcache + K8s 双节点):memcache stored 事件解析并排队(backend_id=Pod IP 正确路由到节点 DP)、引擎 offload 事件解析成功、两阶段匹配入树(kv_event matched)、/query 命中缓存块

6. CheckList

[x] 代码注释完备

[x] 正确记录维测日志

[x] 是否有UT用例

[x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题

likedislike
Pull Request已成功合入, 合并人@tobking
(感谢 jason lyu 的贡献)
jason lyujason lyu成员
18 天前 关联了issue:[Feature-Request|需求反馈]: memcache KvEvent 适配:缓存感知调度全链路
atomgit-bot
atomgit-bot
18 天前 评论:

变更摘要

本 PR 将 memcache 的 KvEvent 广播接入 kv-conductor 缓存感知调度,实现「memcache 池化 + kv-conductor 缓存感知调度」全链路:kv-conductor 新增 MemcacheEventBatch 解析({"events": [...]} wire 格式),按 msgpack 首字节(fixmap)快速分流并跳过无谓的 vLLM/Mooncake 试解析,配合 IpOnly 匹配(backend_id=Pod IP 经 hbm_ip_index 路由到节点全部 DP)与两阶段匹配(pool stored 事件先入 pending_pool 排队、引擎 offload 事件后补匹配,双向 + TTL 清理);FlexHash 支持 vLLM 默认 32 字节 sha256 块哈希(取低 64 位),修复引擎 offload 事件与池确认哈希无法匹配的问题。部署侧新增 kv_events 配置块、ock.mmc.local_service.backend_id 占位符(common.sh 部署时替换为 Pod IP)及 K8s Service 暴露 kv-events: 5557 端口;Coordinator 侧 pool_endpoint 支持 tcp://*:5557 通配符解析、store_backend 大小写不敏感;另提供 vLLM MultiConnector 各版本补丁并将事件日志统一为 kv_event <state> 状态机以提升可维测性。

主要改动

  • kv-conductor 支持 memcache KvEvent 解析与两阶段匹配zmq_subscriber.rs 按 msgpack 首字节将 fixmap 分流为 memcache 批次并解析 MemcacheEventBatchpool.rs 中 memcache stored 事件(仅有哈希、无 token 信息)先进入 pending_pool 排队,待引擎 offload 事件到达后补匹配入树,indexer/mod.rs 增加 pending_pool TTL 清理与过期计数日志,events/tests.rs 新增 wire 格式解析与 IpOnly 路由用例。
  • FlexHash 支持 vLLM 32 字节 sha256 块哈希flex_hash.rs 对超过 8 字节的二进制哈希改为取尾部 8 字节(低 64 位 big-endian),与 vLLM int 模式(& (1<<64)-1)和 memcache BlockHashHexToU64 对齐,原「bytes too long」报错改为兼容解析并补充对应单测。
  • Coordinator 池注册增强conductor_api_client.pypool_endpoint 支持 tcp://*:5557 通配符,部署时以 KVS_MASTER_SERVICE 环境变量替换为 KVS master 域名(未设置则跳过池注册并告警);store_backend 改为大小写不敏感并归一为规范名(Mooncake/Memcache/YuanRong),新增对应单测。
  • memcache kv_events 部署配置memcache_meta_service.py 新增默认关闭的 kv_events 配置块(kv_events_enable/endpoint/model_name/block_size,注释解除即开启);mmc-local-inprocess.confmmc-local-standalone.conf 新增 ock.mmc.local_service.backend_id = <POD_IP> 占位符,common.sh 部署时用 $POD_IP 替换;kv_cache_store_template.yamlinfer_service_template.yaml 暴露 kv-events: 5557 端口,并新增 tests/examples/deployer/test_kv_events.py 覆盖上述配置行为。
  • vLLM MultiConnector 补丁与日志状态机统一:为 v0.20.2/0.21.0/0.22.1/0.23.0/0.25.0/0.26.0 提供 MultiConnector.get_kv_connector_kv_cache_events 补丁,合并子连接器事件避免顶层配置下引擎 offload 事件被静默丢弃;事件日志统一为 kv_event <state> 状态机(received/parsed/queued/offload_cached/matched/confirmed/applied/dropped/pending_expired),matched/confirmed 提升为 INFO,新增 StorageMedium::log_str 统一小写 medium(xpu/cpu/disk),query 日志输出 per-medium 命中块数(npu_blocks/cpu_blocks/disk_blocks)并修正耗时字段语义。
likedislike
不准确?
atomgit-bot
atomgit-bot
18 天前 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
ascend-robotascend-robot成员
18 天前 添加了label:stat/needs-squash
ascend-robotascend-robot成员
18 天前 添加了label:ascend-cla/yes
此处折叠了101条消息 查看更多
ascend-robotascend-robot成员
15 天前 添加了label:approved
tobking
tobking成员
15 天前 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
15 天前 添加了label:lgtm
tobkingtobking成员
15 天前 关闭了关联的issue
tobkingtobking成员
15 天前 合入了pull request