news 2026/9/2 22:15:14

SGLang 前缀缓存(RadixAttention)如何避免重复 Prefill:完整讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SGLang 前缀缓存(RadixAttention)如何避免重复 Prefill:完整讲解

SGLang 前缀缓存(RadixAttention)如何避免重复 Prefill:完整讲解

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

做客服机器人时你会发现,一天几万个请求几乎都从同一段 2000 token 的系统提示词开头。不做前缀复用,每个请求都要老老实实把这 2000 个 token 的注意力 prefill 跑一遍,算力消耗随 QPS 线性上涨。SGLang 的前缀缓存(RadixAttention)就是针对这种浪费:首个请求把计算结果写进缓存,后续同前缀请求直接复用现成的 KV,只补算自己多出来的尾巴。

一句话原理:给公共前缀建一份"预制品"

可以把它类比成中央厨房的半成品:第一单客人点菜时,厨师把前奏部分(系统提示词)做熟装进保鲜盒;后面凡是同款前奏的订单,直接开盒接着炒自己的配菜,不用再从生料做起。SGLang 里这份"保鲜盒"就是挂在基数树(radix tree,一种按前缀共享组织的树结构)上的 KV cache(键值缓存)索引,实现位于 python/sglang/srt/mem_cache/radix_cache.py。省下的时间不是来自更快的算子,而是来自"这部分根本不用算"。

SGLang 处理一次请求的流程:命中是怎么发生的

把视角放在"一个请求从进来到离开",整个过程分四步:

  1. 匹配(match):请求 tokenize 后,从树根开始逐段比对,找到当前序列已缓存的最长前缀。若匹配终点落在某个节点段中间,会自动执行节点分裂(split node),把边界切干净——这不复制数据,只是重排结构。
  2. 只算增量:模型前向只处理没命中的那部分 token。命中 80% 的请求,prefill 计算量就只剩 20%。
  3. 写回(insert):新算出的 KV 索引挂到树上对应位置,供下一个同前缀请求命中。
  4. 释放与回收:每个节点带lock_ref引用计数,请求在飞期间前缀被"锁住"不受淘汰影响;请求结束后锁释放,节点回到可淘汰(evictable)集合。内存吃紧时,淘汰器用堆按策略(默认 LRU)弹出最老的叶子释放,被锁节点自动跳过。

匹配用页(page)做对齐:当page_size > 1时,命中长度会向下取整到页的整数倍,这同时是内存对齐和碎片控制的抓手。

启用 SGLang 前缀缓存的 3 个常用启动参数

前缀缓存默认开启,什么都不用改就已经在工作。下面 3 个参数覆盖了大多数调优场景:

python -m sglang.launch_server \ --model-path <模型路径> \ --page-size 16 \ --radix-eviction-policy lru # 对比实验时可显式关闭缓存 python -m sglang.launch_server --model-path <模型路径> --disable-radix-cache
参数默认值作用
--disable-radix-cacheFalse布尔开关,关掉前缀缓存做 A/B 对比
--page-size视后端而定页大小,匹配/插入/淘汰的对齐粒度,建议 16 这类 2 的幂
--radix-eviction-policylru淘汰策略,可选lru/lfu/slru/priority

命中率不用翻日志:服务加--enable-metrics后,指标接口会暴露缓存命中率、evictable_size(可回收量)与protected_size(被锁保护量)等,直接接 Prometheus 即可,实现见 python/sglang/srt/observability/metrics_collector.py。

性能数据:前缀缓存能省多少

场景基线(无复用)RadixAttention变化幅度
多轮对话1.0x3.2x+220%
批量提示工程1.0x4.8x+380%
代码补全1.0x2.7x+170%
文档摘要1.0x5.1x+410%

数据口径说明:以上为参考文章复述的对比数据,以"无缓存 prefill 耗时"为基线做相对加速比,实际数值取决于模型、序列长度与前缀重叠率;规律是共享前缀占比越高,收益越大,四舍五入后量级约为 5 倍封顶。

进阶速览:分块前缀缓存与 HiCache 分层

分块前缀缓存(Chunked Prefix Cache):长序列请求被切成多个 chunk 分块 prefill,普通模式下整条前缀要等第一个请求算完才可共享。该特性让"边算边共享"成为可能,目前面向 DeepSeek 等长序列模型;短序列场景若觉得有额外开销,可用--disable-chunked-prefix-cache关闭,相关阈值由环境变量SGLANG_CHUNKED_PREFIX_CACHE_THRESHOLD控制。

HiCache 混合缓存:把 KV 从 GPU 显存扩展到主机内存,形成"设备端 + 主机端"两级。设备端未命中时会先去主机端捞,而不是直接重算。关键参数是--hicache-ratio(主机池/设备池比值,cache 模式默认 2.0)和--hicache-write-policy(可选write_back/write_through/write_through_selective)。对"前缀很长、复现间隔长到会被 LRU 淘汰"的负载,这一层是命中率兜底。

避坑与调优:命中率、锁和命名空间隔离

现象原因处理
KV 池紧张但缓存迟迟不释放在飞请求持有lock_ref,被锁节点计入protected_size,淘汰器会跳过先查 protected 占比;缩短单请求上下文或降低并发;热前缀多时换slru/priority策略保活
长序列首个请求耗时内缓存迟迟不可复用chunked prefill 下 KV 分块写入,整条前缀写完才完整可共享长序列场景依赖分块前缀缓存特性;短序列负载用--disable-chunked-prefix-cache省掉开销
换了 LoRA 或采样 salt 后命中率骤降RadixKey支持extra_key命名空间,不同命名空间的 token 序列故意不共享节点这是设计特性而非 bug:想共享就保持命名空间一致,想隔离(不同 adapter、不同 RAG 上下文)则正该这样用

高频疑问

前缀缓存是默认开启的吗?

是。disable_radix_cache默认 False,起服务即生效。想关闭只需要加--disable-radix-cache

命中率怎么查?

--enable-metrics启动后拉/metrics,关注前缀缓存命中率以及evictable_sizeprotected_size两个量。命中率长期偏低且 evictable 接近 0,通常说明缓存容量小于工作集,考虑扩显存预算或上 HiCache。

淘汰策略怎么选?

默认lru对多轮对话够用;请求模式高度重复(少数超热前缀)可试lfu;想给关键租户的前缀更高存活率,用priority按优先级淘汰。

节点分裂会不会造成 KV 重复拷贝?

不会。分裂只调整树上节点的边界与指针,KV 索引按段切分引用,不重复搬运显存数据。

写在最后

SGLang 的前缀缓存把"重复 prefill 同一前缀"从默认行为变成了可感知、可度量、可淘汰的一等公民:基数树负责找前缀,引用锁负责保安全,页对齐负责控碎片,策略化淘汰负责省显存。理解了这条链路,你就有了在真实负载下调命中率和内存水位的全部抓手。接下来值得关注的是跨实例的缓存共享与量化格式 KV 的落地,前缀复用正从单服务内优化走向集群级基础设施。

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:06:48

基于ASP+Access的图片专题站开发实战与部署指南

简介&#xff1a;一套基于ASP的图片专题图库网站源码体验版&#xff0c;用于快速搭建轻量级图片展示站点&#xff0c;适合ASP学习者、站长和二次开发者。程序带自动更新机制&#xff0c;URL采用伪静态&#xff0c;利于搜索引擎收录。压缩包共77个文件&#xff0c;以ASP程序与GI…

作者头像 李华
网站建设 2026/9/2 22:06:10

系外行星发现方式与类地候选分析(基于2025年更新的5,986颗确认行星:可视化、无监督聚类与时间留出分类)

1. 研究背景系外行星是太阳系之外环绕恒星运行的行星。由于行星本身相对暗弱&#xff0c;研究者通常通过恒星亮度周期性下降、恒星光谱的往复位移、引力透镜增亮或直接成像等间接证据确认它们。不同方法对行星半径、质量、轨道周期、宿主亮度与观测几何的敏感度不同&#xff0c…

作者头像 李华
网站建设 2026/9/2 22:05:07

用DeepSeek API构建字幕翻译工作流:从SRT解析到批量翻译

字幕翻译是个很典型的场景&#xff1a;人工翻译整集速度太慢&#xff0c;直接丢给通用翻译工具又容易翻译腔。这次我们以《恶魔君 1989》第28集为例&#xff0c;讲一条可以直接落地的英转中字幕流水线&#xff0c;核心工具是 DeepSeek 的 API。这个需求的本质不复杂&#xff1a…

作者头像 李华
网站建设 2026/9/2 22:04:28

软件测试转岗嵌入式机器人芯片测试:15天实战路线

开头先说明一下&#xff1a;这不是一篇职业鸡汤&#xff0c;也不是教你“躺平 15 天翻身”的速成神话。而是想结合一个很现实的场景——软件测试岗位收缩、部分测试同学面临转岗或重新择业——来聊聊嵌入式、机器人、芯片测试方向到底需要什么基础&#xff0c;以及如何在短时间…

作者头像 李华
网站建设 2026/9/2 22:02:52

在网上买的流量卡靠谱吗?

网上买流量卡的话&#xff0c;不要只贪图低月租、大流量的这类套餐了&#xff0c;例如9块或19块 流量300G之类的&#xff0c;这类几乎就是假的。保号8块&#xff0c;9块的卡就是1块买300G流量&#xff0c;你觉得可能吗&#xff1f;即使有19块的一般时间也不会长&#xff0c;29块…

作者头像 李华
网站建设 2026/9/2 22:02:41

用天气数据与Python构建防蚊预警提醒工具

看到“因天气恶劣&#xff0c;蚊虫滋生&#xff0c;各位猎人们出门记得防蚊”这句话时&#xff0c;我所在的玩家社群里&#xff0c;正被连续几天的暴雨和高温轮流折腾。大家前一秒还在讨论配装和任务路线&#xff0c;下一秒就开始抱怨小区楼下的蚊子多得有点夸张。两件事在夏天…

作者头像 李华