为什么长上下文推理这么慢?RedKnot如何用1个百分点的质量代价换来2–5倍TTFT加速
【免费下载链接】RedKnotEfficient Long-Context LLM Serving with Head-Aware KV Reuse and SegPagedAttention项目地址: https://gitcode.com/gh_mirrors/re/RedKnot
长上下文推理为什么慢?答案藏在每次请求都要重算的注意力与 FFN 里。开源项目RedKnot是一个模型感知的长上下文 LLM 服务框架(Efficient Long-Context LLM Serving with Head-Aware KV Reuse and SegPagedAttention),基于 SGLang 构建,通过头感知 KV 复用与SegPagedAttention两项核心技术,在质量回退控制在1 个百分点以内的同时,实现2–5 倍热态 TTFT(首 Token 时延)加速,并节省 70–90% 的算术计算开销 🚀
一、长上下文推理慢在哪里?
当输入从几千 token 膨胀到几十万 token 时,瓶颈主要有三处:
| 瓶颈 | 原因 |
|---|---|
| Prefill 注意力 | 注意力计算随上下文长度近似平方级增长,几十万 token 的 prefill 动辄几十秒 |
| FFN / MoE 开销 | 论文指出在 2–8K token 的短上下文场景,FFN 已占 TTFT 的57–62%,长上下文下只会更严重 |
| KV 缓存膨胀 | 全部层、全部注意力头、全部历史 token 都要驻留显存,带宽与容量双重吃紧 |
传统思路是"前缀缓存命中",但 RedKnot 更激进:即使没有任何前缀命中,也能通过复用与稀疏化把重计算砍掉一大块——并且它始终保留一条完整的"全量重算(Recomputed)"参考路径作为对照,所有收益都是对同一模型、同一输入测出来的,而不是靠前缀缓存"作弊"。
二、RedKnot 的三大核心机制
RedKnot 不是一个单点技巧,而是三个可组合的机制,分别作用在头、Token、专家三个层面:
1️⃣ 头分解与聚合(Head-Aware KV Reuse)
注意力头并非"人人平等":RedKnot 把每个(层, 头)离线分类为全局头(对长上下文前缀敏感,必须在线完整计算)或可复用局部头(对前缀鲁棒,可离线预计算后直接复用)。以已发布的 DeepSeek-V4-Flash 策略为例:第 0–2 层与 40–42 层全部在线;第 3–39 层只保留8 个全局头在线,其余56 个局部头离线复用。复用后的投影贡献会合并回模型,不改变模型对外接口,且同一套抽象可映射到 MLA、MHA、GQA 与原生滑动窗口注意力。
2️⃣ 稀疏 FFN 与自适应专家 Top-K
并非每个 Token 都值得跑一遍最昂贵的 FFN/MoE。RedKnot 基于恢复出的注意力信号做Token 级重要性选择:重要 Token 走完整 FFN,其余 Token 走残差恒等通路;MoE 侧则用自适应专家 Top-K——只有路由分布确实需要时才分配更多专家。同时保护边界稠密层与关键查询行,保住"关键路径"。在 MoE 服务中,专家子组的调度与聚合正是这类长上下文推理加速的核心战场:
3️⃣ SegPagedAttention:让不同头"看到"不同长度的上下文
传统 KV 缓存是一刀切的统一布局,RedKnot 的SegPagedAttention则按(层, 头, 段)组织 KV 页:全局头读全量上下文页,局部头物理上只存 sink + 最近窗口的 KV 页。这把"算法上的头稀疏"真正变成了显存与带宽的物理节省,并由免 mask 的 varlen 融合 kernel 执行。
以上机制的运行时实现集中在 python/sglang/srt/layers/attention/redknot/,其中:
- 稀疏 FFN:python/sglang/srt/layers/attention/redknot/sparse_ffn.py
- SegPagedAttention 运行时:python/sglang/srt/layers/attention/redknot/segpaged.py
- 自动头部剖析器:python/sglang/srt/layers/attention/redknot/head_profiler.py
三、2–5 倍 TTFT 加速是怎么测出来的?
RedKnot 提供了可一键复现的 DeepSeek-V4-Flash TP8 发布路径,这是全仓库最严谨的基准:
| 项目 | 发布配置 |
|---|---|
| 模型 | deepseek-ai/DeepSeek-V4-Flash-0731 |
| 硬件 | 8× NVIDIA H200(TP8) |
| 套件 | 冻结的 64K / 128K / 256K / 440K 四档,每档 15 个 RAG 用例(10 短答 + 5 长答) |
| TTFT 协议 | 热态;3 次不计时预热 + 每用例 10 组 Recomputed/RedKnot 配对测量,取 p50/p95 流式首 Token 时延 |
对照逻辑很"较真":Recomputed 参考路径做完整在线 prefill,不用任何 RedKnot 复用;RedKnot 路径只把第一篇文档作为认证前缀物化,对其余文档应用发布版复用 + 行稀疏 + 自适应 Top-K 策略。仓库内保留了真实的逐用例结果,例如 256K 长答案用例中,dense p50 约31.5s→ 复用路径约21.2s(单点加速 1.49×,F1 保持率 94%、EM 持平),完整结果集见 test/srt/redknot/results/deepseek_v4_flash/。
需要说明:70–90% 的计算节省是纯算术账本(不含访存、kernel 启动与 TP 通信),因此它不是对整机能耗或端到端吞吐的承诺;实际加速点取决于模型、上下文长度、GPU 拓扑与冻结策略。
四、如何快速上手 RedKnot?
一键安装与复现:
git clone https://gitcode.com/gh_mirrors/re/RedKnot cd RedKnot/test/srt/redknot # 创建或校验固定环境,然后跑完 64K/128K/256K/440K 全部四档套件 ./run_deepseek_v4_flash_reproduction.sh包装脚本会自动校验硬件档案(H200/B300)与环境锁,避免两个 TP8 实例抢同一组 GPU,详见 test/srt/redknot/run_deepseek_v4_flash_reproduction.sh 与基准入口 test/srt/redknot/benchmark_RedKnot_DeepSeekV4Flash.py。
没有 8 卡 H200 也没关系,仓库提供了轻量 demo 可直接体验:
- RAG 端到端 demo(HotpotQA 风格,对比 dense 基线与 RedKnot 的 F1、TTFT、FLOPs):examples/redknot/rag_redknot_demo.py
- SegPagedAttention 微基准(dense+mask vs 按头 ragged KV + FA-3 varlen 的时延与数值等价性):examples/redknot/segpaged_redknot_demo.py
- demo 用法与输出字段说明:examples/redknot/README.md
此外,仓库还内置 Mistral、Qwen3、Qwen3.5 MoE、Llama 3.3 的模型专属基准入口,均位于 test/srt/redknot/ 目录;昇腾 NPU 适配进展可参考 docs/ASCEND.md。
五、哪些场景值得用?⚡
- RAG / 多文档问答:多篇长文档拼接成超长上下文,局部头复用收益最直接;
- 长上下文热态服务:TTFT 是核心指标的业务(论文称 hot-state 加速 2–5×);
- MoE 模型的长上下文 serving:稀疏 FFN + 自适应 Top-K 专打 FFN 瓶颈。
结语
长上下文慢,慢在"每次都从头算"。RedKnot 的思路是把冗余工作按头、Token、专家三个粒度拆掉:只让真正全局的头看全量上下文,只让重要的 Token 跑昂贵 FFN,再用 SegPagedAttention 把稀疏真正落到显存上。用不到 1 个百分点的质量代价,换来 2–5 倍 TTFT 加速——这正是长上下文服务从"能不能用"走向"用得起"的关键一步 🎯
更多技术细节可查阅仓库主文档 README.md,项目以 Apache-2.0 协议开源,欢迎贡献与讨论。
【免费下载链接】RedKnotEfficient Long-Context LLM Serving with Head-Aware KV Reuse and SegPagedAttention项目地址: https://gitcode.com/gh_mirrors/re/RedKnot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考