昇騰のPrefix Cache

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…