新闻详情

新闻详情

首页 / 资讯中心 / 详情

SGLang UnifiedRadixCache 深度解析:面向 Full/SWA/Mamba 混合注意力的一体化前缀缓存框架

发布时间:2026/9/10 9:03:02来源:尧图网络
SGLang UnifiedRadixCache 深度解析:面向 Full/SWA/Mamba 混合注意力的一体化前缀缓存框架
SGLang UnifiedRadixCache 深度解析面向 Full/SWA/Mamba 混合注意力的一体化前缀缓存框架【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglangSGLang 在 python/sglang/srt/mem_cache/unified_cache/components/README.md 中定义了一套组件化、可插拔的前缀缓存框架——Unified Radix Cache。它用一个统一的 radix 树同时管理 Full-attention、Sliding-Window-AttentionSWA和 Mamba/SSM 三类 KV/状态缓存取代了此前彼此独立的SWARadixCache、MambaRadixCache等专用实现。读完本文你将掌握 UnifiedRadixCache 的五大设计目标、Controller/TreeCore/Component 三层架构、match_prefix/insert/evict/inc_lock_ref等公共 API 的算法细节与复杂度以及如何通过TreeComponent钩子接口扩展新的缓存类型。设计目标为什么需要统一缓存树在引入统一框架之前Full-attention、SWA、Mamba 三类缓存各自有独立的 radix 树实现如SWARadixCache、MambaRadixCache彼此无法共享前缀、互不感知对方的内存占用。Unified Radix Cache 提出了五个核心设计目标统一树结构Unified tree structure一棵 radix 树管理所有 KV 缓存类型不再为每种注意力单独实现专用缓存可插拔组件Pluggable components每种注意力/状态类型Full、SWA、Mamba都是一个实现钩子接口的TreeComponent新增缓存类型只需新增一个组件主树代码零改动按组件资源隔离Per-component resource isolation每个组件拥有独立的锁引用计数、可驱逐/受保护大小统计与驱逐驱动器。辅助组件使用各自的 LRU 列表Full 组件使用 device/host 叶子集合带优先级的级联驱逐Cascade eviction with priority当一个组件驱逐某节点时同一节点上优先级更低或相等的组件数据被一并驱逐保证跨组件一致性主树零特判Zero special-casing in the main tree树只操作逻辑键key所有物理资源管理分配、释放、写时复制都通过组件钩子完成。其中第 4、5 点尤其关键树本身不感知任何物理资源细节它只负责键的匹配、分裂与删除真正执行 KV 池操作的是挂在树上的各个组件。这让树核心TreeCore保持纯净也让新增缓存类型例如当前仓库中已扩展出的C128SidecarComponent的成本降到最低。架构总览Controller、TreeCore 与 Component┌───────────────────────────────────────────────┐ │ UnifiedRadixCache │ │ (unified_radix_cache.py) │ │ │ │ controller: executes all pool/host I/O and │ │ drains the trees deferred Cache/Component │ │ Actions (tree decides, cache executes) │ └──────────────────────┬────────────────────────┘ ▼ ┌───────────────────────────────────────────────┐ │ UnifiedTreeCore │ │ (unified_cache/unified_tree_core.py) │ │ │ │ root_node ──► UnifiedTreeNode (radix tree) │ │ components ► {ComponentType → TreeComponent} │ │ lru_lists ─► {ComponentType → UnifiedLRUList}│ └──────────┬───────────┬───────────┬────────────┘ │ │ │ ▼ ▼ ▼ ┌────────────┐ ┌──────────┐ ┌─────────────┐ │ Full │ │ SWA │ │ Mamba │ │ Component │ │Component │ │ Component │ └─────┬──────┘ └────┬─────┘ └──────┬──────┘ │ │ │ └─────────────┼──────────────┘ ▼ ┌──────────────┐ │TreeComponent │ │ (ABC) │ └──────────────┘三层职责非常清晰UnifiedRadixCache控制器层位于 python/sglang/srt/mem_cache/unified_radix_cache.py执行所有 KV 池/主机 I/O并负责排空树产生的延迟CacheAction/ComponentAction。核心理念是树做决策缓存来执行树在遍历过程中只产出动作描述真正的内存释放由控制器统一落盘执行避免在遍历过程中穿插不确定性的内存操作。UnifiedTreeCore树核心层位于 python/sglang/srt/mem_cache/unified_cache/unified_tree_core.py持有root_nodeUnifiedTreeNode、componentsComponentType → TreeComponent映射以及lru_listsComponentType → UnifiedLRUList映射。它不触碰 cache只驱动组件在树层面的钩子。TreeComponent组件层位于 python/sglang/srt/mem_cache/unified_cache/components/tree_component.py是三个具体组件共同实现的抽象基类ABC。从源码可以印证这一分工UnifiedTreeCore的模块 docstring 明确写道the cache builds the component drivers and passes them in; the tree holds them to drive their tree-level hooks. The components hold the cache for cache-level logic, but the TreeCore itself never touches it即 TreeCore 从不反向引用 cache。关键数据结构UnifiedTreeNode—— 每个节点按组件类型独立存储数据。component_data是按ComponentTypeint 枚举 0..N-1索引的列表每个节点上同时可挂多类数据node.component_data[ComponentType.FULL] # FullComponent data node.component_data[ComponentType.SWA] # SWAComponent data node.component_data[ComponentType.MAMBA] # MambaComponent dataUnifiedLRUList—— 每个辅助组件SWA、Mamba一棵独立的双向链表通过同一批树节点上的lru_prev[component_type]/lru_next[component_type]指针串接。Host LRU 使用单独的指针槽位区间保证 device 与 host 链表互不冲突。支持 O(1) 的插入/删除/提升promote以及 O(L) 的驱逐扫描L 跳过的加锁节点数。Full 组件的驱逐不依赖 LRU而是由evictable_device_leaves/evictable_host_leaves叶子集合驱动。ComponentData—— 每个节点上按组件保存的数据结构定义见 tree_component.py字段类型含义valueTensor \| None指向组件内存池的设备索引Full 对应TokenToKVPoolSWA 对应SWAKVPoolMamba 对应MambaPool。None表示墓碑tombstone数据已驱逐但节点结构保留lock_refint正在使用该节点组件数据的活跃请求引用计数lock_ref 0时节点受保护不被驱逐metadatadict组件特定状态如 SWA 用component_uuid记录窗口锁边界host_valueTensor \| NoneHiCache 备份该组件后保存在主机侧的索引host_lock_refint保护主机侧组件数据不被主机驱逐的引用计数文件布局文件内容unified_radix_cache.pyUnifiedRadixCache— 控制器池/主机 I/O、延迟动作排空unified_tree_core.pyUnifiedTreeCore— 树、LRU 与大小计数器UnifiedTreeNode、UnifiedLRUListunified_tree_core_interface.pyUnifiedTreeCoreInterface、NodeId— 树/缓存边界契约cache_action.py树产生的延迟CacheAction/ComponentAction类型tree_component.pyTreeComponentABC、ComponentType、ComponentData、get_and_increase_time_counter、next_component_uuidfull_component.pyFullComponent— 标准全注意力 KV 缓存组件swa_component.pySWAComponent— 滑动窗口注意力组件带墓碑/窗口跟踪mamba_component.pyMambaComponent— Mamba/SSM 状态组件带写时复制copy-on-writehybrid_cache_controller.pyHybridCacheController— HiCache 多池控制器L1 GPU → L2 CPU可选 L3 存储components/init.py重新导出ComponentType、ComponentData、TreeComponent、FullComponent、SWAComponent、MambaComponent公共 API 参考所有公共 API 都位于UnifiedRadixCache上它实现了BasePrefixCache定义见 base_prefix_cache.py。记号约定K 键长度token 数D 树中匹配到的路径深度D ≤ K/PP page_sizeC 组件数量≤ 3视为常数。所有树遍历操作都有两部分成本O(K)的数据操作键比较、tensor 克隆/拼接O(D·C)的组件开销每个节点调 C 次钩子。由于 D ≤ K/P 且 C 为常数整体复杂度为O(K)。match_prefix(params: MatchPrefixParams) → MatchResult为给定的 token 序列查找最长缓存前缀。方面细节目的遍历 radix 树找到所有组件校验器都通过的最长前缀输入params.key: RadixKey— token ID 可选额外键用于命名空间隔离输出MatchResult(device_indices, last_device_node, last_host_node, best_match_node, host_hit_length, mamba_branching_seqlen, ...)副作用更新匹配路径的last_access_time在全部组件 LRU 列表中将匹配节点提升到 MRU若匹配止于节点中间触发_split_node复杂度O(K D·C)算法细节为每个组件调用一次create_match_validator(match_device_only...)返回一个有状态闭包例如 SWA 的闭包会累计窗口长度。在 HiCache 模式下匹配会同时跟踪最佳仅设备节点和最佳设备或主机节点通过RadixKey.match()沿树边行走在每个节点调用所有校验器闭包——只有当所有校验器都返回True时匹配边界才向前推进若匹配止于节点中间调用_split_node进而触发每个组件的redistribute_on_node_split()匹配后处理_match_post_processor以node_has_component_data()为过滤器将匹配路径提升到各组件 LRU 的 MRU 位置沿路径用递减时间戳更新last_access_time父 子保证父节点更旧、优先被驱逐通过torch.cat拼接匹配到的设备索引拼接长度 ≤ K被 O(K) 吸收逐组件调用finalize_match_result_in_tree_core()树侧Full/SWA 的主机命中求和Mamba 记录branching_seqlen随后缓存侧在遍历结束后逐组件路由finalize_match_result_in_cache()Mamba 在此执行写时复制分配新的池槽位并拷贝 SSM 状态。insert(params: InsertParams) → InsertResult将键值对插入树中。方面细节目的插入 token 序列 KV 索引复用已有前缀并释放重复的 KV 槽位输入params.key: RadixKey、params.value: TensorKV 池索引以及组件专属字段mamba_value、swa_evicted_seqlen、prev_prefix_len输出InsertResult(prefix_len, mamba_exist)—prefix_len为复用前缀长度副作用创建新叶子节点更新重叠节点上的组件数据释放重复 KV 索引可能分裂节点更新 LRU 列表与可驱逐大小复杂度O(K D·C)算法细节可恢复插入步骤_insert_walk_step/_insert_commit_step/_insert_tail_step在每个已有节点上调用_touch_node通过node_has_component_data()提升到 MRU若键在节点中途分叉调用_split_node→ 每个组件执行redistribute_on_node_split()对每个重叠节点调用update_component_on_insert_overlap()— 返回consumed_from索引树随后将value[dup_start:consumed_from]作为重复池索引释放Full返回prefix_len不消费默认行为SWA检查重叠节点在 SWA 窗口边界swa_evicted_seqlen内是否为墓碑SWA value None完全在窗口内恢复墓碑— 释放旧full_value、克隆value_slice、翻译为 SWA 索引、插入 SWA LRU返回0 全部消费部分在窗口内在边界处分裂节点在窗口部分恢复 SWA返回start_idx完全在窗口外返回prefix_len不消费Mamba返回prefix_len不消费默认行为通过_add_new_node创建叶子克隆 value tensor、更新 Full 叶子集合跟踪。叶子的存活仅依赖其 Full value因此即使辅助组件在该区间只持有墓碑例如整个叶子在 SWA 窗口外叶子也会被物化在最终目标节点上逐组件调用commit_insert_component_data()SWA 可能触发二次分裂以对齐窗口边界Mamba 设置 mamba 池索引并插入 Mamba LRU。evict(params: EvictParams) → EvictResult驱逐缓存 token 以回收内存。方面细节目的每个组件从自己的 LRU 列表驱动驱逐直到达到目标输入params.num_tokensFull、params.swa_num_tokensSWA、params.mamba_numMamba输出EvictResult(num_tokens_evicted, swa_num_tokens_evicted, mamba_num_evicted)副作用释放池索引从 LRU 列表移除节点从树删除叶子节点级联到低优先级组件沿父链上溯删除墓碑祖先复杂度O(E·H L)— E 驱逐节点数H 墓碑链高度L LRU 扫描中跳过的加锁节点数算法细节通过evict_device_start()/evict_device_next_node()/evict_device_end()驱动每个组件的驱逐游走Full从evictable_device_leaves依据last_access_time驱动驱逐只有设备叶子会被原子驱逐SWA从 SWA LRU 尾部扫描内部节点被墓碑化驱逐 SWA 数据、保留节点叶子节点被完全删除两者都触发级联Mamba从 Mamba LRU 尾部扫描内部节点被墓碑化叶子节点被完全删除两者都触发级联每个节点驱逐后调用_cascade_evict查询每个组件的eviction_priority()驱逐所有优先级 ≤ 触发者的组件数据对被级联的组件调用evict_component()node_has_component_data()对叶子先从父节点移除再由_iteratively_delete_tombstone_leaf沿上溯O(H)个祖先。级联驱逐规则叶子节点所有组件优先级 0 → 驱逐任一组件的叶子都会级联到全部节点被删除内部节点Full(2) SWA(1) Mamba(0)驱逐 Mamba不触发级联驱逐 SWA级联到 Mamba驱逐 Full级联到 SWA Mamba。从源码看这一优先级设计的动机见 tree_component.py 的eviction_prioritydocstring很值得玩味SWA 内部节点数据是路径数据——滑动窗口需要从根到匹配边界的整条连续 SWA 覆盖而Mamba 数据只在匹配边界节点有意义内部节点上的 mamba 对路径没有贡献。所以 SWA 比 Mamba 更值得保留、应更晚被驱逐。inc_lock_ref(node: UnifiedTreeNode) → IncLockRefResult锁定节点以保护它及其祖先不被驱逐。方面细节目的请求开始使用某缓存前缀时调用防止其依赖的节点被驱逐输入node— 最后匹配到的节点最深输出IncLockRefResult(swa_uuid_for_lock)副作用沿路径递增各组件lock_ref将 token 从可驱逐大小计数器移入受保护大小计数器复杂度O(D)— Full节点到根SWA最多到窗口边界 O(min(D, W))MambaO(1)算法细节对每个组件调用acquire_component_lock()组件锁定策略Full路径锁Path-lock从节点走到根每个祖先lock_ref 1。首次加锁lock_ref: 0→1时把 token 从component_evictable_size_移到component_protected_size_SWA窗口锁Window-lock向上走累计 SWA value 长度直到填满sliding_window_size。在边界节点记录component_uuid供dec_lock_ref识别停止位置Mamba单节点锁Single-node lock只在节点本身lock_ref 1mamba 状态按叶子存储不按路径注意源码中 Full 的acquire_component_lock还有一层细节它先跳过底部已驱逐段value is None的节点记入skip_lock_node_ids再对设备在线段device-on segment加锁并维护evictable_device_leaves集合的剔除。dec_lock_ref(node, params?) → DecLockRefResult解锁之前锁定的节点路径。方面细节目的请求结束时调用释放驱逐保护输入node可选params.swa_uuid_for_lockSWA 边界检测输出DecLockRefResult()副作用逐组件递减lock_ref当lock_ref归零时把 token 从受保护移回可驱逐复杂度O(D)— 与inc_lock_ref对称算法细节对每个组件调用release_component_lock()。Full 走到根SWA 向上走到匹配的component_uuid为止Mamba 递减单节点。此外 SWA 还提供了release_window_lock用于解码位置滑出滑动窗口后提前释放 SWA 部分锁、同时保留 Full 锁的场景保证请求前缀仍受保护。cache_finished_req(req: Req, is_insert: bool True, *, kv_len_to_handle: int)将已完成请求的 KV 数据缓存进树。方面细节目的请求结束后将其 token/KV 数据插入树中供后续复用输入req— 已结束请求is_insert— 是否插入True或仅释放锁Falsekv_len_to_handle— 调用方提供的已提交 KV 长度输出None副作用调用组件钩子 →insert→dec_lock_ref→ 组件清理。释放未对齐的尾部 KV 索引is_insertFalse时释放未插入的 KV 索引复杂度O(K D·C)— insert O(K D·C) 锁释放 O(D)化简为O(K)算法细节逐组件调用prepare_for_caching_req()— 设置组件专属插入参数并返回有效缓存长度SWA设置swa_evicted_seqlenMamba从 ping-pong 缓冲区准备mamba_value返回mamba_last_track_seqlen作为截断提示若effective_cache_len len(token_ids)释放多余的池索引转换 token IDEAGLE 时为 bigram、按页对齐键然后调用insert()释放超出页边界的未对齐尾部 KV 索引对之前的req.last_node调用dec_lock_ref()逐组件调用cleanup_after_caching_req()Mamba依据mamba_exist释放分叉的mamba_value处理 ping-pong 缓冲区清理。cache_unfinished_req(req: Req, chunkedFalse)缓存进行中请求的部分 KV 数据chunked prefill。方面细节目的chunked prefill 期间插入部分结果使下一个 chunk 能匹配到该前缀输入req— 进行中的请求输出None副作用插入部分 KV → 重新匹配前缀 → 更新req.prefix_indices、req.kv.cache_protected_len、req.last_node将锁从旧节点转移到新节点复杂度O(K D·C)— 两次树遍历insert O(K D·C) 重新匹配 O(K D·C) 锁转移 O(D)化简为O(K)算法细节逐组件调用prepare_for_caching_req()insert()— 第一次树遍历match_prefix()—第二次树遍历获取更新后的索引将新的前缀索引写回req_to_token_pool对旧req.last_node调用dec_lock_ref()对新匹配节点调用inc_lock_ref()更新req.prefix_indices、req.kv.cache_protected_len、req.last_node逐组件调用cleanup_after_caching_req()。TreeComponent 钩子参考每个组件实现以下钩子ABC 与完整 docstring 见 tree_component.py。这是整个框架可插拔的落点新增缓存类型时只需继承TreeComponent并按阶段实现相应钩子。匹配阶段Match Phase钩子用途调用方默认实现create_match_validator(match_device_onlyFalse)返回每次匹配的有状态谓词决定节点是否为合法匹配边界。Full要求有 Full 设备数据match_device_onlyFalse时也接受主机备份SWA跨设备/主机数据累计窗口长度Mamba要求有 Mamba 设备数据或主机备份_match_prefix_helper抽象finalize_match_result_in_tree_core()匹配游走内的树侧后处理。Full/SWA主机命中求和Mamba记录branching_seqlen与主机命中增量_match_post_processor透传finalize_match_result_in_cache()游走结束后的缓存级收尾接收 params 基于 NodeId 的结果由UnifiedRadixCache.match_prefix分发。Mamba写时复制 — 分配新 mamba 池槽位把 SSM 状态拷入请求池UnifiedRadixCache.match_prefix透传插入阶段Insert Phase钩子用途调用方默认实现update_component_on_insert_overlap()处理插入键与已有节点重叠。返回value_slice内本组件消费接管所有权的池槽位起始索引。Full/Mamba不消费prefix_lenSWA可在滑动窗口边界内恢复被墓碑化的节点_insert_walk_step返回prefix_lenrecover_after_unevict()当_unevict_node_on_insert()用全新 KV 索引恢复 Full 设备值后重建辅助组件数据。SWA 用它重建窗口内 SWA 数据_insert_walk_stepno-opcommit_insert_component_data()插入游走完成后在目标节点上最终确定组件数据。Fullno-op由_add_new_node处理SWA检查窗口边界可能分裂节点 — 父节点变墓碑、子节点获得 SWA 数据Mamba设置 mamba 池索引并插入 Mamba LRU_insert_commit_stepno-op节点分裂Node Split钩子用途调用方默认实现redistribute_on_node_split()节点分裂时在新父节点前缀与子节点后缀间重新分配组件数据。Full把lock_ref复制给父节点SWA切片 SWA value复制lock_ref与component_uuidMamba父节点得到None/lock_ref0mamba 留在叶子_split_node抽象驱逐阶段Eviction Phase钩子用途调用方默认实现evict_component(targetEvictLayer.DEVICE)释放被驱逐节点上该组件的设备、主机或两者资源。内部节点设备驱逐是墓碑化value None主机驱逐清空host_value。返回(device_freed, host_freed)_evict_component_and_detach_lru抽象eviction_priority()返回级联驱逐优先级越高越晚被驱逐。叶子全部 0内部Full(2) SWA(1) Mamba(0)。驱逐时同一节点上所有优先级 ≤ 触发者的组件被级联驱逐_cascade_evict0evict_device_start()/evict_device_next_node()/evict_device_end()由 Controller 驱动的分步设备驱逐游走构建游标/堆、返回下一个可驱逐叶子已释放的值收集给 Controller 排空、清理游走状态。Full叶子集合堆SWA/Mamba组件 LRU内部墓碑化 叶子原子删除UnifiedRadixCache._evict_components抽象drive_host_eviction()驱动该组件的主机驱逐收集已释放值交给 Controller 排空。Full 用主机叶子SWA/Mamba 用主机 LRUevict_hostno-op锁阶段Lock Phase钩子用途调用方默认实现acquire_component_lock(lock_hostFalse)递增设备或主机锁引用首次加锁时把设备 token 从可驱逐移入受保护。Full设备路径锁、主机单节点锁SWA带 UUID 边界的窗口锁Mamba单节点锁inc_lock_ref、inc_host_lock_ref抽象release_component_lock(lock_hostFalse)递减设备或主机锁引用lock_ref归零时把设备 token 从受保护移回可驱逐。Full 路径解锁设备SWA 走到 UUID 边界Mamba 解锁单节点dec_lock_ref、dec_host_lock_ref抽象缓存阶段Caching Phase钩子用途调用方默认实现prepare_for_caching_req()插入前准备组件专属数据、填充InsertParams字段、返回有效缓存长度。Fullno-opSWA设置swa_evicted_seqlenMamba从 ping-pong 缓冲区准备mamba_value、返回mamba_last_track_seqlencache_finished/unfinished_req返回Nonecleanup_after_caching_req()缓存后清理。Full/SWAno-opMamba依据mamba_exist释放分叉的mamba_value、处理 ping-pong 缓冲区的keep_idx、在未完成请求上重置mamba_last_track_seqlencache_finished/unfinished_reqno-op工具钩子Utility钩子用途调用方默认实现build_hicache_transfers()构建组件专属的PoolTransfer描述符D→H、H→D、H→Storage、Storage→HHiCache 路径Nonecommit_hicache_transfer()HiCache 传输完成后提交组件状态HiCache 路径no-opnode_has_component_data(targetEvictLayer.DEVICE)检查节点是否有该组件的设备或主机数据用作 LRU 操作与级联检查的过滤器多处value is not None/host_value is not None除表格中的钩子外基类还提供会话session相关的抽象方法register_session_leaf、release_session、_dec/_advance/_recede_session_coverage等支持会话级 radix 缓存的覆盖追踪以及 HiCache/外部缓存链接器External Cache Linker相关的扩展钩子prepare_load_back、prepare_prefetch、build_external_linker_transfer等。组件行为总结行为FullComponentSWAComponentMambaComponent校验器Full 设备数据或 HiCache 匹配中的主机备份累计窗口长度达到sliding_window_size时为TrueMamba 设备数据或 HiCache 匹配中的主机备份锁策略路径锁根 → 节点窗口锁到窗口边界UUID 标记单节点锁内部驱逐优先级2最后1中间0最先分裂行为复制lock_ref给父节点切片 SWA value 复制 UUID父节点为Nonemamba 留在叶子匹配收尾no-opno-op写时复制分配新 mamba 槽位并拷贝状态驱逐驱动Full 叶子集合 → 级联全部SWA LRU → 内部墓碑化、叶子级联Mamba LRU → 内部墓碑化、叶子级联从源码可以验证各组件对自身行为的落实FullComponent.eviction_priority返回0 if is_leaf else 2full_component.pySWAComponent.eviction_priority返回0 if is_leaf else 1swa_component.pyMamba 的写时复制在finalize_match_result_in_cache中通过req_to_token_pool.mamba_allocator.alloc(1)分配新槽位、记录req.kv.mamba_cow_src_indexmamba_component.py。构造流程从模型类型到组件装配UnifiedRadixCache是默认的树缓存实现由 registry.py 直接构造。注册中心在构造前设置params.tree_components见_create_unified_radix_cache常规全注意力模型 →(ComponentType.FULL,)混合 SWA 模型 →(ComponentType.FULL, ComponentType.SWA)混合 SSM/Mamba 模型 →(ComponentType.FULL, ComponentType.MAMBA)启用分层缓存HiCache时注册中心在构造完成后调用cache.init_hicache(server_args, params)。构造链中还有几个值得注意的实现细节组件注册表UnifiedRadixCache.__init__维护COMPONENT_REGISTRY: dict[ComponentType, type[TreeComponent]]把FULL/MAMBA/SWA分别映射到三个组件类params.component_registry_override允许覆盖默认组件类例如 NPU 上的 DSV4 模型注册了C128SidecarComponent见 unified_radix_cache.py 与 registry.py树核心可插拔UnifiedTreeCore本身也可通过SGLANG_UNIFIED_RADIX_TREE_CORE_BACKEND环境变量在python默认与rust实现间切换见 tree_core_registry.pyRust 后端位于python/sglang/srt/mem_cache/rust_tree_core/组件类型校验SWAComponent构造时断言传入的是SWATokenToKVPoolAllocatorMambaComponent断言传入的是HybridReqToTokenPool从机制上保证组件与其内存池匹配。测试与验证仓库在 test/registered/unit/mem_cache/ 下提供了一系列针对 UnifiedRadixCache 的单元测试可作为理解行为的辅助参考test_unified_radix_lock_ref.py— 请求锁生命周期例如无 last_node 时不插入则跳过锁释放的边界场景直接构造UnifiedRadixCache并用 mock 验证cache_finished_req的行为test_unified_radix_allocation_eviction.py— 分配与驱逐流程test_swa_locked_full_recover_unified.py— SWA 在 Full 被锁定时恢复墓碑节点的场景对应RecoverSWAWithLockedFull动作test_mamba_path_state_cap.py/test_mamba_donated_alloc_ratio.py— Mamba 每路径状态上限与分配比例test_rust_unified_radix_cache_unittest.py/test_rust_tree_core_integration.py/test_tree_core_registry.py— Rust 树核心与后端注册机制test_session_unified_radix_cache.py— 会话级 radix 缓存。小结Unified Radix Cache 的设计核心可以概括为一句话树只做键的决策组件负责物理资源控制器负责执行。通过UnifiedTreeCore纯逻辑树结构 每组件 LRU/大小计数器、TreeComponent按阶段分组的钩子接口与UnifiedRadixCache池 I/O 与延迟动作排空的三层解耦SGLang 得以把 Full、SWA、Mamba 三类缓存统一到一棵树上同时保留每类缓存的专属语义SWA 的窗口墓碑与恢复、Mamba 的叶子状态与写时复制、Full 的路径锁与叶子集合驱逐。若要为新的注意力/状态类型扩展缓存只需参考 tree_component.py 的 ABC实现匹配、插入、分裂、驱逐、锁与缓存六个阶段的钩子并在注册中心登记组件类型即可。【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Simulink仿真生成输电线路故障数据的技术实践 2026/9/10 9:42:08

Simulink仿真生成输电线路故障数据的技术实践

1. 项目背景与核心价值在电力系统运行维护中,输电线路故障数据的获取与分析一直是行业痛点。传统方式依赖现场实测,不仅成本高昂,且难以覆盖所有故障类型。这个项目通过Simulink仿真批量生成六类典型故障数据(单相接地、两相接地、…

阅读更多 →
arXiv学术信息流操作系统:结构化切片+技术谱系树 2026/9/10 9:42:08

arXiv学术信息流操作系统:结构化切片+技术谱系树

1. 这不是“爬虫教程”,而是一份可落地的学术信息流操作系统你有没有过这种体验:每天早上打开arXiv,面对3000篇新提交论文,像站在瀑布前接水——手忙脚乱,接满一杯,下一秒又被冲走;收藏夹里躺着…

阅读更多 →
Arduino ESP32 开发环境搭建:四层拆解,首次烧录一次跑通 2026/9/10 9:42:08

Arduino ESP32 开发环境搭建:四层拆解,首次烧录一次跑通

Arduino ESP32 开发环境搭建:四层拆解,首次烧录一次跑通 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 搭 Arduino ESP32 开发环境时最常见的卡点…

阅读更多 →
DeepSeek Harness 通用设置与 Agent 预设实战:从零配置你的智能助手 2026/9/10 9:42:08

DeepSeek Harness 通用设置与 Agent 预设实战:从零配置你的智能助手

上一篇把 DeepSeek Harness 装好之后,很多人问得最多的其实不是“怎么让它跑起来”,而是“装完以后到底应该先动哪些设置,才能让这个 Agent 真的听我指挥”。这一篇就把通用设置和 Agent 预设这两块掰开揉碎讲清楚。我自己刚开始用的时候&…

阅读更多 →
AutoHedge:基于Python与Solana的轻量级AI智能体协同框架 2026/9/10 9:42:08

AutoHedge:基于Python与Solana的轻量级AI智能体协同框架

1. 项目概述:AutoHedge 不是“自动对冲”,而是智能体协同决策的底层范式重构 AutoHedge 这个名字乍看像金融领域的自动对冲工具,但结合 swarm intelligence(群体智能)、AI agents(AI智能体)、So…

阅读更多 →
开源具身智能数据采集平台选型指南:从遥操作到模仿学习 2026/9/10 9:39:07

开源具身智能数据采集平台选型指南:从遥操作到模仿学习

这两年做具身智能方向,尤其在实验室里,我感受最深的一件事是:数据采集平台的选型,比很多人想象中更容易卡住项目进度。机器人本体买了、训练算法定了,结果发现“怎么稳定地录一批高质量演示数据”成了最费人的环节。有…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞