尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LMCache 集成 Mooncake Store:构建支持 RDMA 的分布式 KV Cache L2 存储层

LMCache 集成 Mooncake Store:构建支持 RDMA 的分布式 KV Cache L2 存储层 LMCache 集成 Mooncake Store构建支持 RDMA 的分布式 KV Cache L2 存储层【免费下载链接】LMCacheLMCache: Supercharge Your LLM with the Fastest KV Cache Layer项目地址: https://gitcode.com/GitHub_Trending/lm/LMCache导读本文讲解 LMCache 如何通过原生 C Mooncake Store 连接器构建高性能分布式 KV Cache L2 存储层mooncake_storeL2 Adapter涵盖 Mooncake 扩展的编译启用方式、--l2-adapterJSON 配置中 LMCache 专属字段与透传字段的区分、共享/按操作类型 worker 线程池的调优以及protocol: rdma模式下 L1 内存预注册的硬性要求与常见故障排查。读完本文你将能够在 LMCache v1 的多进程MP分布式部署中正确编译、配置并验证一个以 Mooncake Store 为后端、支持 TCP 或 RDMA 传输的 L2 KV 缓存层。Mooncake Store L2 Adapter 是什么Mooncake Store L2 Adapter 是 LMCache 中一类以 Mooncake 分布式存储为后端的 L2 适配器其核心实现位于配置类与工厂lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py原生 C 连接器csrc/storage_backends/mooncake/connector.cpp 与 csrc/storage_backends/mooncake/connector.hPython 绑定csrc/storage_backends/mooncake/pybind.cpp它通过 C 层直接调用 Mooncake SDK 的RealClient将 KV cache 块持久化到分布式存储中并借助 Mooncake 的高性能传输能力TCP 或 RDMA实现跨节点、跨实例的 KV 复用。与纯 Python 实现不同该适配器在 C 侧使用共享 worker 线程池驱动批量GET/SET/EXISTS/DELETE操作把 LMCache 的单次批量请求映射为 Mooncake 的批量 API 调用batch_get_into、batch_put_from、batchIsExist、batchRemove见 connector.cpp。在 LMCache 的适配器注册机制中该适配器以类型名mooncake_store自注册模块末尾的两行是入口register_l2_adapter_type(mooncake_store, MooncakeStoreL2AdapterConfig) register_l2_adapter_factory(mooncake_store, _create_mooncake_store_l2_adapter)通过--l2-adapter JSON命令行参数即可在启动时声明一个 Mooncake Store L2 实例该参数可重复支持同一类型多个不同配置的实例。RDMA 模式下的 L1 内存预注册约束Mooncake Store 支持两种协议tcp与rdma。当配置protocol: rdma时Mooncake 需要对实际承载 KV 数据的内存区域做 RDMA 注册因此 LMCache 必须提供一个有效的连续 L1 内存区域在多进程MP模式下分布式存储管理器会在调用适配器工厂时自动传入 L1 内存描述符L1MemoryDesc如果描述符缺失None或无效指针为 0、大小不大于 0适配器创建会直接抛出ValueError而不会静默回退到非 RDMA 路径。这一校验逻辑在工厂函数 mooncake_store_l2_adapter.py 中实现对应的行为被单元测试 test_mooncake_store_l2_adapter.py 显式覆盖if config.setup_config.get(protocol) rdma: if l1_memory_desc is None: raise ValueError( RDMA protocol is enabled, but no L1 memory descriptor was provided; cannot create Mooncake Store L2 adapter. ) elif l1_memory_desc.ptr 0 or l1_memory_desc.size 0: raise ValueError(... L1 memory descriptor is invalid ...) else: l1_registration.enabled True l1_registration.base l1_memory_desc.ptr l1_registration.size l1_memory_desc.size得到有效的 L1 描述符后适配器会构造L1RegistrationConfigenabled/base/size三个字段见 connector.h并传给原生客户端LMCacheMooncakeClient由 C 侧完成 L1 内存的 RDMA 预注册。底层 preregister_l1_memory 会按 Mooncake 的max_mr_size把大块 L1 区域切分成多个 segment 逐一调用register_buffer并在失败时回滚已注册的 segment。对应地worker 停止时会调用unregister_all_buffers()释放注册见 connector.cpp。前置条件编译带 Mooncake 支持的 LMCacheMooncake 扩展默认不会编译必须显式启用。最直接的构建命令为BUILD_MOONCAKE1 pip install -e . --verboseBUILD_MOONCAKE环境变量控制编译行为优先级如下取值行为BUILD_MOONCAKE1启用 Mooncake C 扩展编译BUILD_MOONCAKE0强制禁用优先级最高即使设置了MOONCAKE_INCLUDE_DIR也不编译未设置回退检查MOONCAKE_INCLUDE_DIR向后兼容若该变量也未设置则跳过扩展这一逻辑在构建配置 setup_extensions/storage_backend_profiles/mooncake.py 的detect()中实现def detect(self) - bool: mc_env os.environ.get(BUILD_MOONCAKE) if mc_env is not None: return mc_env 1 return os.environ.get(MOONCAKE_INCLUDE_DIR, ) ! 如果 Mooncake 头文件不在系统默认 include 路径如/usr/local/include中需要显式指定头文件与库目录BUILD_MOONCAKE1 \ MOONCAKE_INCLUDE_DIR/path/to/mooncake/include \ MOONCAKE_LIB_DIR/path/to/mooncake/lib \ pip install -e . --verbose从 mooncake.py 可以看出该 profile 会编译生成lmcache.lmcache_mooncake扩展模块源码来自csrc/storage_backends/mooncake/pybind.cpp与connector.cpp链接库为mooncake_store并携带-stdc20 -DYLT_ENABLE_IBV等编译参数YLT_ENABLE_IBV与 RDMA/IB verbs 支持相关。需要说明的是文档描述以BUILD_MOONCAKE为主仓库中的构建 profile 同时兼容较新的BUILD_WITH_MOONCAKE环境变量profile 的env_var字段实际以你所用版本的构建脚本为准。配置字段解析LMCache 专属键与透传键mooncake_store的 JSON 配置可以分成两类字段二者的分界在 mooncake_store_l2_adapter.py 中被一个常量明确界定_LMCACHE_ONLY_KEYS { type, num_workers, eviction, per_op_workers, }LMCache 专属字段num_workersint共享 worker 线程池的 C 线程数默认 4必须大于 0。任何在per_op_workers中未单独指定的操作类型都会使用该共享池。校验逻辑在 config.py 的_validate_num_workers中非正整数值会抛出ValueError(num_workers must be a positive integer)。per_op_workersdict[str, int]可选将 lane key 映射到专属 worker 线程数的字典支持的 key 包括lookup——EXISTS操作线程数retrieve——GET/ 加载load操作线程数store——SET/ 写入put操作线程数delete——DELETE操作线程数。操作类型的 lane key 不在字典中时会回退使用共享的num_workers池。无需配置全部 key只需为需要独立资源隔离的操作配置即可。校验规则见 config.py每个值都必须是正整数否则抛ValueError。在from_dict()解析时除_LMCACHE_ONLY_KEYS之外的所有键值为None的除外都会被转换为字符串并放入setup_config见 mooncake_store_l2_adapter.py。这一“原样转发”的行为有完整的单元测试佐证例如布尔值mooncake_prefer_local_alloc: True会被转发为字符串True未知键experimental_key会原样保留见 test_mooncake_store_l2_adapter.py。Mooncake 字段透传除type、num_workers、per_op_workers、eviction之外的所有键都会被原样as-is转发给 Mooncake 的setup_internal(ConfigDict)。LMCache不会解释、校验或填充这些键的默认值那属于 Mooncake 的职责。可用键包括但不限于local_hostname—— 本机主机名 / IPmetadata_server—— 元数据服务地址如etcd://localhost:2379master_server_addr—— Mooncake master 服务地址gRPC如localhost:50051protocol—— 传输协议tcp/rdmardma_devices—— RDMA 设备名rdma模式使用global_segment_size—— 全局 segment 大小字节字符串local_buffer_size—— 本地 buffer 大小字节字符串。在 C 侧连接器构造时会把整个配置 dict 转为mooncake::ConfigDict并调用client_-setup_internal(mc_config)失败则抛出std::runtime_error见 connector.cpp。关于 Mooncake master 服务、metadata server 等的完整搭建指引请查阅 Mooncake 官方文档本文不展开。配置示例共享池与按操作池示例一共享 worker 池默认适用于负载均衡、无需为某类操作单独分配线程的场景--l2-adapter { type: mooncake_store, num_workers: 4, local_hostname: node01, metadata_server: http://localhost:8080/metadata, master_server_addr: localhost:50051, protocol: tcp, local_buffer_size: 3221225472, global_segment_size: 3221225472 }示例二按操作类型划分线程池GET 密集型负载当读多写少、GET成为瓶颈时为retrieve分配较多专属线程其他操作仍走共享池--l2-adapter { type: mooncake_store, per_op_workers: { lookup: 2, retrieve: 16, store: 4 }, local_hostname: node01, metadata_server: http://localhost:8080/metadata, master_server_addr: localhost:50051, protocol: tcp }注意示例二中未配置delete因此 DELETE 操作会回退使用共享num_workers池默认 4这正是“无需配置全部 key”的设计意图。per_op_workers会一路透传到 C 层由 pybind.cpp 中的parse_per_op_workers解析后用于 worker 池构建。参数解析链路上述 JSON 在启动时按如下链路被消费--l2-adapter参数由 config.py 注册可重复 appendparse_args_to_l2_adapters_config逐条json.loads依据type字段从注册表解析配置类并调用from_dict()config.py工厂注册表create_l2_adapter_from_registry找到mooncake_store对应的工厂并调用factory.py在 MP 模式下传入自动获取的 L1 内存描述符。RDMA 使用注意事项使用protocol: rdma时需注意以下几点protocol: rdma要求 LMCache 提供有效的 L1 内存描述符缺失或无效会直接ValueError见上文工厂校验逻辑推荐使用--no-l1-use-lazy关闭 L1 的惰性分配确保 L1 buffer 在 Mooncake 注册它之前就已完整分配。该选项对应分布式配置中的use_lazy字段惰性模式下 L1 可能按需分配导致注册时内存尚未就绪见 lmcache/v1/distributed/config.py 中的校验逻辑protocol: tcp不需要L1 预注册即使传入描述符TCP 模式下l1_registration.enabled也保持为False由测试 test_mooncake_store_l2_adapter.py 显式验证如果 Mooncake RDMA 初始化在适配器创建阶段失败请确认LMCache L1 内存已启用且描述符的指针ptr非零、大小size大于 0。此外RDMA 模式下注册的内存区域存在边界约束C 侧的ensure_registeredconnector.cpp要求每个待传输 buffer 必须落在预注册 L1 区间内且不能跨过预注册的 block 边界否则会抛出运行时错误。这也解释了为何 RDMA 模式强烈建议关闭 L1 惰性分配——只有 L1 完整、连续且提前注册后续所有 buffer 的合法性检查才能通过。端到端验证与测试仓库为 Mooncake Store L2 Adapter 提供了完整的测试套件tests/v1/distributed/test_mooncake_store_l2_adapter.py分为三层配置单元测试无需 C 扩展验证from_dict的键剥离/透传/类型转换、num_workers与per_op_workers的非法值报错、部分per_op_workers合法等工厂注册测试验证mooncake_store类型已注册、无扩展时工厂抛RuntimeError集成测试需要 C 扩展与运行中的 Mooncake Store 服务覆盖 store → lookup → load 全流程、批量 store/lookup/load、混合存在/缺失键的 lookup、delete 及 delete 后的用量回收。RDMA 相关集成测试通过MOONCAKE_RUN_RDMA_TESTS1环境变量开启且需要使用L1MemoryDesc指向的真实 L1 buffer。运行集成测试前需要设置环境变量export MOONCAKE_LOCAL_HOSTNAMEyour-ip export MOONCAKE_METADATA_SERVERetcd://etcd-host:2379 export MOONCAKE_MASTER_SERVER_ADDRESSlocalhost:50051无扩展或未设置主机名时集成测试会被自动跳过skipif判定不会误报失败。另外仓库还提供基于 Python 层 Mooncake SDK 的 lookup 客户端 lmcache/v1/lookup_client/mooncake_lookup_client.py它使用MooncakeDistributedStore.batch_is_exist批量判定 token chunk 是否存在用于支持 producer kvcache 复用supports_producer_reuse()返回True。它与本适配器是两条独立路径前者面向 lookup/元数据后者承载 KV 数据的存取二者配合完成跨节点 KV 复用。小结mooncake_storeL2 Adapter 为 LMCache 提供了一条高性能、原生 C 的分布式 KV 缓存通路关键要点可归纳为编译必须显式BUILD_MOONCAKE1或借助MOONCAKE_INCLUDE_DIR/MOONCAKE_LIB_DIR构建lmcache_mooncake扩展配置num_workers与per_op_workers是 LMCache 专属键其余键全部透传给 Mooncakesetup_internal按操作类型划分线程池可针对 GET 密集型负载做定向调优RDMAprotocol: rdma必须有有效 L1 描述符并建议--no-l1-use-lazyTCP 则无此要求验证依赖 test_mooncake_store_l2_adapter.py 可分层验证配置解析、工厂行为与真实存取链路。至此你已具备在 LMCache MP 分布式部署中启用并调优 Mooncake Store L2 层的完整能力。【免费下载链接】LMCacheLMCache: Supercharge Your LLM with the Fastest KV Cache Layer项目地址: https://gitcode.com/GitHub_Trending/lm/LMCache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表