Prefix Cache特性介绍

Prefix Cache 即前缀缓存,是一种用于优化大语言模型(LLM)推理性能的技术,主要应用于多轮对话、系统提示等具有大量共同前缀的场景。

原理

LLM 推理计算主要包括 Prefill 阶段(Prompt 计算)和 Decode 阶段。Prefill 阶段为 Decode 阶段准备 KV Cache,通常这些 KV Cache 只为单条推理请求服务,请求结束后会被清除。但在一些场景下,多次请求的 Prompt 可能共享同一个前缀,其 KV Cache 计算结果相同,Prefix Cache 就是将这些相同前缀的 KV Cache 存储起来,供后续请求复用,避免重复计算,从而降低TTFT,提升推理计算性能。

实现方式

  • 基于基数树(Radix Tree):如 vLLM 中的 Prefix Caching 使用 RadixAttention 算法,该算法基于基数树实现。基数树的节点可以是一个变长序列,能动态分裂以满足动态共享前缀的需求。vLLM 中通过 BlockSpaceManagerV1 类管理 block 分配,以 hash 码作为物理 KV Block 的唯一标识,通过 prompt 中的 token_ids 来获取 hash 值,确保不同 prompt 的 cache block 能获取唯一 hash 码,进而实现前缀缓存。
  • 基于前缀树(Trie):KVCache 的存取本质类似键 - 值对数据库,可将 Trie 的每个节点代表一个 token,从根节点到某个节点的路径表示一个 token 序列,以此处理前缀匹配问题。vLLM 会先将 tokens 根据 block_size 进行分块,然后对每块进行哈希,每个 chunk 的哈希值都包含了该 chunk 前缀的信息,以此模拟前缀树的实现。

应用场景

Prefix Cache 适用于 common prefix 较多、prefill 计算占比较大的场景,例如多轮对话、system prompt、代码补全等等。在多轮对话中,每一轮对话依赖历史轮次对话的上下文,若使用 Prefix Cache,可避免历史轮次中生成对话的重复计算,降低首 Token 的耗时。

缓存管理

由于显卡显存有限,当不同的 prefix 请求较多时,之前的 prefix cache 可能会被驱逐。此时可采用 LRU、LFU 等驱逐策略,通常会从后往前驱逐,尽可能复用 prefix cache。部分框架还提供了如 prefix cache offload 功能,在显存 prefix cache 被驱逐时将其转移到 cpu 内存上,命中时再加载回 gpu 中,以加速后续相同 prefix 的请求。

昇腾

当前大语言模型推理系统普遍采用KV Cache缓存机制,但该机制存在以下两个问题:

随着LLM支持的序列长度不断增长,KV Cache所需要的显存资源也急剧增加。
KV Cache只对当前session有效,如果跨session存在重复token序列的情况下无法实现复用。
Prefix Cache通过RadixTree保留session结束后的KV Cache,新的session请求在RadixTree中查找是否存在相同的Token序列,即可复用之前计算好的KV Cache,从而实现跨session的KV Cache复用。

其优势主要包括:

更短的prefill时间:由于跨session的重复token序列对应的KV Cache可以复用,那么就可以减少一部分前缀token的KV Cache计算时间,从而减少prefill的时间。
更高效的显存使用:当正在处理的sessions相互之间存在公共前缀时,公共前缀部分的KV Cache可以共用,不必重复占用多份显存。

限制与约束

  • Atlas 800I A2 推理服务器和Atlas 300I Duo 推理卡硬件支持此特性。

  • 仅Qwen2系列模型支持对接此特性。

  • 当跨session公共前缀token数大于等于Page Attention中的block size,才会进行公共前缀token的KV Cache复用。

  • Prefix Cache支持的量化特性:W8A8量化与稀疏量化,其他量化特性暂不支持。

  • 该特性不能和多机PD分离、Multi-LoRA、Function Call、长序列以及多机推理特性同时使用。

  • 该特性可以和单机PD分离、并行解码和SplitFuse特性同时使用。

  • 开启Prefix Cache特性需要配置补充参数。

效果

Prefix Cache 技术本身主要优化的是首 token 响应时间(TTFT, Time to First Token),但在特定条件下也能间接提升系统的吞吐量(Throughput)。下面从多个角度分析其影响及优化方向:

  1. Prefix Cache 对吞吐量的直接影响
    正面影响
    减少重复计算:当多个请求共享相同前缀时,Prefix Cache 避免了这些前缀的 KV Cache 重复计算,释放了计算资源(如 GPU),使系统能同时处理更多请求。
    降低排队延迟:对于首 token 响应时间敏感的场景(如实时对话),更快的 TTFT 能减少请求在队列中的等待时间,从而提高整体吞吐量。
    负面影响
    缓存占用显存:Prefix Cache 需要额外存储 KV Cache,可能导致系统可同时处理的请求数量减少(因显存被占用)。
    缓存管理开销:维护缓存(如查找、驱逐策略)可能引入额外的计算开销。
  2. 增大吞吐量的其他优化方法
    (1)模型层面优化
    量化(Quantization):如 INT8、INT4 量化减少模型参数量,降低显存占用,提高并发请求数。
    模型并行:将模型分布到多个 GPU 上,提升计算能力。
    FlashAttention:优化注意力计算的内存访问模式,减少显存占用。
    (2)系统层面优化
    批处理(Batching):将多个请求合并为一个批次处理,提高 GPU 利用率。
    连续批处理(Continuous Batching):如 vLLM 的 PagedAttention 技术,动态分配 KV Cache 内存,支持请求动态加入 / 退出批次。
    预取(Prefetching):提前加载热门模型或数据到显存,减少 IO 等待。
    (3)调度策略优化
    优先级调度:对短请求优先处理,减少长尾延迟。
    资源隔离:为不同类型的请求分配专用资源(如 GPU 核心)。
  3. 结合 Prefix Cache 与其他技术的案例
    假设使用 vLLM 框架,可同时启用 Prefix Cache 和 PagedAttention:
from vllm import LLM, SamplingParams# 初始化LLM时启用PagedAttention
llm = LLM(model="deepseek-ai/deepseek-llm-7b-chat", gpu_memory_utilization=0.9)# 对于多轮对话,系统提示会被缓存
system_prompt = "You are a helpful, creative, accurate, and harmless AI assistant."
user_prompt1 = "What is machine learning?"
user_prompt2 = "Explain deep learning in simple terms."# 首次请求(包含system_prompt)会计算并缓存前缀
sampling_params = SamplingParams(temperature=0.7)
response1 = llm.generate(f"{system_prompt}\nUser: {user_prompt1}", sampling_params)# 第二次请求共享相同前缀,直接复用缓存
response2 = llm.generate(f"{system_prompt}\nUser: {user_prompt2}", sampling_params)

通过上述代码,系统提示部分的 KV Cache 会被复用,减少了重复计算。同时,PagedAttention 技术允许高效管理 KV Cache 内存,进一步提升吞吐量。
4. 性能测试与调优建议

  • 测试工具:使用框架提供的性能分析工具(如 vLLM 的 benchmark 脚本)或自定义负载测试。
  • 关键指标:监控 TTFT、吞吐量(requests/second)、GPU 利用率、显存占用。
  • 调优方向:
    增大缓存命中率:通过调整缓存大小、驱逐策略(如 LRU)提高缓存复用率。
    平衡缓存与并发:根据模型大小和显存容量,调整可缓存的最大前缀长度。
    异步处理:使用异步 API(如 vLLM 的async_generate)实现非阻塞请求处理。

总结

Prefix Cache 能通过减少重复计算间接提升吞吐量,但需结合其他优化技术(如量化、批处理、高效内存管理)才能实现最大性能提升。在实际部署中,建议根据具体场景(如请求模式、模型大小)进行性能测试和参数调优。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86682.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86682.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86682.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12-C#的list数据使用

C#的list数据使用 1.实例化 List<double> lst1 new List<double>();2.数据清除 lst1 .Clear();3.数据清除

SQL数据迁移利器:INSERT INTO SELECT语句详解

引言 在数据库操作中&#xff0c;我们经常需要将一个表中的数据迁移或复制到另一个表中。这时候&#xff0c;INSERT INTO SELECT语句就成为了一个极其有用的工具。今天我们就来深入探讨这个强大的SQL语句。 基本语法 INSERT INTO 目标表(字段1, 字段2, ...) SELECT 字段1, 字…

elementUI轮播图组件el-carousel适配移动端大小(图片加载好后根据大小适配)

获取img实例&#xff0c;动态设置el-carousel高度 <template><div class"content main"><el-carousel arrow"always" :height"bannerHeight px"><el-carousel-item v-for"(item, index) in banners" :key"…

AI歌手Yuri出道:GenAI,透露着新的AI产业机遇?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、AI歌手Yuri横空出世1. 爆红的原生MV《SURREAL》2. 背后的创作团队 二、AI歌手背…

常见的自动化测试工具,好学吗?

自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。它通常涉及预设测试用例&#xff0c;并通过自动化工具或脚本来执行这些用例&#xff0c;最后比较实际结果与期望结果来评估软件的正确性。 常见的自动化测试工具包括Selenium、Appium、JMeter、LoadRunner、Post…

JavaEE初阶第四期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(二)

专栏&#xff1a;JavaEE初阶起飞计划 个人主页&#xff1a;手握风云 目录 一、Thread类及常用方法 2.1. Thread的常见构造方法 2.2. Thread的常见属性 2.3. 启动一个线程 2.4. 中断一个线程 2.5. 等待一个线程 2.6. 休眠当前线程 一、Thread类及常用方法 2.1. Thread的…

elk+filebeat收集springboot项目日志

目录 步骤 1: 安装和配置Elasticsearch 步骤 2: 安装和配置Logstash&#xff08;可选&#xff09; 步骤 3: 安装和配置Filebeat 步骤 4: 安装和配置Kibana 要使用ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;堆栈和Filebeat来收集Spring Boot项目的日志&am…

基于Python实现(控制台)UDP传输协议的可靠文件传输工具

LFTP Design 简介 LFTP是一个采用python3实现的基于UDP传输协议的可靠文件传输工具 特点 基于UDP 采用python3编程语言&#xff0c;socket的类型均为socket(AF_INET,SOCK_DGRAM)实现 实现100%可靠性传输 使用SR&#xff08;选择重传&#xff09;协议保证所有报文都正确接收…

【Go-7】面向对象编程

7. 面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;通过将数据和行为封装在对象中&#xff0c;以提高代码的可重用性、可维护性和扩展性。虽然Go语言不像传统的OOP语言&#xff08;如Java、C&am…

PHP语法基础篇(六):数组

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化&#xff1b;它可以被视为数组、列表&#xff08;向量&#xff09;、哈希表&#xff08;映射的实现&#xff09;、字典、集合、堆栈、队列等等。本篇文章将记录数…

GitHub Actions 的深度解析与概念介绍

GitHub Actions 核心定义 Git Actions 是 GitHub 原生提供的 自动化工作流引擎&#xff0c;允许开发者在代码仓库中直接创建、测试、部署代码。其本质是通过事件驱动&#xff08;Event-Driven&#xff09;的自动化管道&#xff0c;将软件开发中的重复任务抽象为可编排的流程。…

TestCafe 全解析:免费开源的 E2E 测试解决方案实战指南

在2025年的数字化浪潮中&#xff0c;Web应用的稳定性和用户体验成为企业竞争的关键&#xff0c;而端到端&#xff08;E2E&#xff09;测试则是确保质量的“守护者”&#xff01;想象一下&#xff0c;您的电商平台因表单错误导致用户流失&#xff0c;或者支付流程因浏览器兼容性…

[CVPR 2025] 高效无监督Prompt与偏好对齐驱动的半监督医学分割

CVPR 2025 | 优化SAM&#xff1a;高效无监督Prompt与偏好对齐驱动的半监督医学分割 论文信息 标题&#xff1a;Enhancing SAM with Efficient Prompting and Preference Optimization for Semi-supervised Medical Image Segmentation作者&#xff1a;Aishik Konwer, Zhijian…

【C++】责任链模式

目录 一、模式核心概念与结构二、C++ 实现示例:员工请假审批系统三、责任链模式的关键特性四、应用场景五、责任链模式与其他设计模式的关系六、C++ 标准库中的责任链模式应用七、优缺点分析八、实战案例:Web 请求过滤器链九、实现注意事项如果这篇文章对你有所帮助,渴望获得…

dp进阶,树形背包(dfs+01)

顾名思义&#xff0c;就是在对树进行搜索的时候&#xff0c;由于限制了子节点选根节点必选和节点数限制&#xff0c;所以需要额外利用背包来维护最大值 假设根节点就是0&#xff0c;我们很容易 发现&#xff0c;这就是一个正常的树求和&#xff0c;但是限制了节点数量&#xf…

微信小程序安卓手机输入框文字飘出输入框

最近在开发微信小程序遇到一个问题&#xff0c;安卓手机输入框文字飘出输入框&#xff0c;但是ios系统的手机则正常。 使用情景&#xff1a;做了一个弹窗&#xff0c;弹窗内是表单&#xff0c;需要填写一些信息&#xff0c;但是在填写信息时光标不显示&#xff0c;输入的内容飘…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——3.后缀数组(Suffix Array)在大模型数据去重中的原理与实战

后缀数组&#xff08;Suffix Array&#xff09;在大模型数据去重中的原理与实战 一、后缀数组的核心原理与数据结构二、后缀数组去重的核心流程1. **文档预处理与合并**2. **构建后缀数组**3. **计算最长公共前缀&#xff08;LCP&#xff09;数组**4. **基于LCP检测重复文档** …

数据库外连接详解:方式、差异与关键注意事项

&#x1f504; 数据库外连接详解&#xff1a;方式、差异与关键注意事项 外连接用于保留至少一个表的全部行&#xff0c;即使另一表无匹配记录。以下是三种外连接方式的深度解析&#xff1a; &#x1f50d; 一、外连接的三种类型 1. 左外连接 (LEFT OUTER JOIN) 作用&#xf…

vscode把less文件生成css文件配置,设置生成自定义文件名称和路径

1.下载less插件 在插件市场搜索 less 2.设置生成配置 3.修改out属性 "less.compile": {"compress": false, // 是否删除多余空白字符 一行显示[压缩]"sourceMap": false, // 是否创建文件目录树&#xff0c;true的话会自动生成一个 .css.map …

探索相机成像的奥秘 - 齐次坐标、径向失真和图像传感器倾斜

引言 大家好&#xff01;今天我们将一起探索相机成像背后的一些关键技术概念&#xff1a;齐次坐标、径向失真和图像传感器倾斜。这些概念对于理解相机如何捕捉和处理图像至关重要。我们将通过简单易懂的语言和严谨的公式来详细解释这些概念。 齐次坐标&#xff08;Homogeneou…