架构概述#
高层系统架构#
LMCache 扩展了一个 LLM 推理引擎(例如,vLLM),并配备了一个跨越显存、CPU 内存和磁盘/远程后端的多层 KV Cache 存储系统。下面的图示说明了 KV Cache 块如何在这些层之间移动。
多层存储架构
LMCache 实现了一个具有三个不同层次的分层存储系统:
显存:保存当前模型使用的 KV Cache 的活动工作集
CPU DRAM: 作为最近使用的 KV 块的“热缓存”,使用固定内存以实现高效的 GPU-CPU 传输
本地存储(例如,本地磁盘、NVMe GDS):为本地 KV 缓存提供了一个大容量层(例如,用于长文档)。
远程存储(例如,Redis、Mooncake、InfiniStore):KV 缓存的持久存储。可靠,但性能不如前面的层。
数据流和操作
当模型在 GPU 上生成新的键值 (KV) 缓存块时,LMCache 可以:
将溢出的 KV 缓存 从 GPU 卸载到 CPU DRAM,释放宝贵的显存
异步写入 KV Cache 从 CPU 到磁盘或远程存储,使用 LRU 逐出策略
按需预取热 KV 缓存 从磁盘/远程存储回到 CPU。
按需重用 缓存段,通过将它们从 CPU 移动回 GPU
这种架构使 LMCache 能够显著减少 Prefill 延迟和显存压力,同时通过智能缓存管理保持高性能。
flowchart TB
subgraph "LLM Engine (with LMCache Integration)"
direction TB
GPU["GPU Memory"]
CPU["CPU DRAM"]
GPU -- "Offload overflow KV" --> CPU
CPU -- "On-demand reuse" --> GPU
end
Disk[(Disk Storage Backend)]
Remote[(Remote Storage Backend)]
CPU -- "Async write (LRU evict)" --> Disk
CPU -- "Async upload" --> Remote
Disk -- "Prefetch hot KV" --> CPU
Remote -- "Fetch on reuse" --> CPU
两种模式#
- 存储模式 (KV Cache 卸载)
LMCache 充当持久化的 KV 存储,优化查询或会话之间的高重用性。它将不常用的 KV 块从显存中卸载,并在会话之间持久化热门缓存,提高“热”内容的缓存命中率。KV 缓存超越单次推理调用,甚至在磁盘或外部存储支持下,能够在进程重启后继续存在。
sequenceDiagram
participant Main as LLM Inference Thread
participant DiskTask as Disk Offload Task
participant RemoteTask as Remote Offload Task
Main->>Main: New KV chunk created (GPU memory)
Main->>Main: Copy KV chunk to CPU buffer
par Disk backend offload
Main--)DiskTask: Spawn async disk write task
DiskTask-->>DiskTask: Compress & save chunk to disk
and Remote backend offload
Main--)RemoteTask: Spawn async remote upload task
RemoteTask-->>RemoteTask: Send chunk to remote store
end
Main-->>Main: Continue with next inference (no blocking)
- 传输模式(Prefill-解码分离)
专注于通过实时路由 KV Cache 数据在节点之间加速分布式推理。实现分离式 Prefill-解码,其中一台服务器为提示计算 KV,并将其传递给另一台服务器进行生成,而无需重计算。使用点对点通道和 NIXL 等通信库进行低延迟、高带宽的传输。
核心组件#
- LLM 推理引擎集成模块 (连接器)
集成到 LLM 引擎 (vLLM) 中,连接器利用分页 KV 内存管理器。在处理提示时,它检查令牌序列是否之前见过:
缓存命中:从 LMCache 中获取预计算的 KV Cache 块,绕过计算
缓存未命中:模型按常规计算 KV,然后连接器将新生成的 KV 数据交给 LMCache 进行存储
- 缓存索引(令牌数据库)
维护一个内部索引,将令牌序列映射到缓存的 KV 条目及其位置。支持跨请求和跨实例的缓存查找,具有可配置的块策略(默认 256 个令牌)和哈希方案。
- 内存对象与分配器
在 LocalCPUBackend 中使用自定义内存分配器将 KV Cache 条目管理为 MemoryObj 实例。确保固定内存以实现快速的 GPU↔CPU 传输,支持 NUMA 感知分配,并与逐出策略(默认使用 LRU)接口。
- 异步卸载
以异步方式卸载/加载 KV Cache 块,以避免阻塞推理线程和 GPU 周期。
- 远程连接器
基于插件的远程后端系统(Redis、Mooncake、NiXL)。使用通用的 RemoteBackend 包装器,将操作委托给连接器实现,支持动态加载自定义后端。
LMCache 控制器#
控制器提供了一个用于运行时缓存操作的管理 API:
查找:查询给定令牌序列及其位置的缓存条目
清除: 完全清除 KV Cache 或特定条目
压缩/解压缩:按需使用 CacheGen 进行压缩或解压缩到全精度
移动:将缓存迁移到指定位置以进行缓存预热或优化
固定/解固定:将缓存条目标记为持久,以防止逐出
健康与完成检查:报告工作者健康状态并确认异步操作的完成
控制器与系统中的所有 LMCache 工作者协调,提供单实例和分布式部署的集中管理。