SGLang 推理框架核心組件解析:請求、內存與緩存的協同工作

SGLang 推理框架核心組件解析:請求、內存與緩存的協同工作

在當今大語言模型(LLM)服務的浪潮中,高效的推理框架是決定服務質量與成本的關鍵。SGLang 作為一個高性能的 LLM 推理和部署庫,其內部精巧的設計確保了高吞吐量和低延遲。為了實現這一目標,SGLang 在其核心調度與內存管理機制中,通過一系列緊密協作的對象來處理用戶請求和優化計算資源,特別是對 KV 緩存的管理。在 SGLang 的調度批次(ScheduleBatch)中,reqsreq_to_token_pooltoken_to_kv_pool_allocatortree_cache 這四個關鍵字段,分別代表了從請求到底層緩存管理的不同層面,它們之間的協同關系構成了 SGLang 高效推理的基石。

請求的表示:Req 對象

一切處理始于請求。在 SGLang 中,每一個進入系統的用戶請求都被封裝成一個 Req 對象(位于 managers.schedule_batch.Req)。這個對象是請求在系統內流轉的基本單位,包含了與該請求相關的所有信息,例如請求的唯一標識符(rid)、輸入的文本序列(prompt)、生成的配置參數(如溫度、最大新 token 數)以及請求當前的狀態(如等待中、運行中、已完成)。

ScheduleBatch 中,reqs 字段是一個列表,容納了當前批次中所有正在被處理的 Req 對象。調度器根據一定的策略(如先到先服務、最長前綴匹配等)從等待隊列中挑選 Req 對象,將它們組合成一個 ScheduleBatch 進行統一處理。因此,reqs 字段是整個推理流程的入口,后續所有的內存分配和計算都圍繞著這個列表中的請求展開。

兩級內存池:從請求到物理內存的映射

為了高效管理 GPU 內存,尤其是占用巨大的 KV 緩存,SGLang 采用了一種精巧的兩級內存池機制。req_to_token_pooltoken_to_kv_pool_allocator 正是這一機制的核心體現。

首先是 ReqToTokenPool(請求到 Token 池的映射)。這個組件在 ScheduleBatch 中表現為 req_to_token_pool 字段,其核心作用是建立每個請求(Req)與其包含的 token 在邏輯緩存池中位置的映射關系。它本質上可以理解為一個二維表,第一維由請求的池索引(req_pool_idx)確定,第二維則是該請求內部 token 的序列位置。表中的值是一個邏輯索引(out_cache_loc),指向該 token 在全局 Token 緩存池中的具體位置。通過這種方式,系統無需關心每個請求的具體 token 內容,只需通過索引就能快速定位其緩存信息。

比如下面這個就是一個ScheduleBatch批次有兩個Req請求時的情況(batch_size最大為48,但當前batch_size=2):
req_to_token字段的張量形狀:torch.Size([48, 131076])

{   'size': 48, 'max_context_len': 131076, 'device': 'cuda', 'req_to_token': tensor([[1, 2, 3,  ..., 0, 0, 0],[1, 8, 9,  ..., 0, 0, 0],[0, 0, 0,  ..., 0, 0, 0],...,[0, 0, 0,  ..., 0, 0, 0],[0, 0, 0,  ..., 0, 0, 0],[0, 0, 0,  ..., 0, 0, 0]], device='cuda:0', dtype=torch.int32), 'free_slots': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]}

接下來是 TokenToKVPoolAllocator(Token 到 KV 緩存池的分配器)。req_to_token_pool 提供的僅僅是邏輯位置,而 token_to_kv_pool_allocator 則負責將這個邏輯位置與 GPU 上的物理內存塊對應起來。它管理著一個巨大的、為所有請求共享的物理 KV 緩存池。當一個 token 需要被存儲時,token_to_kv_pool_allocator 會為其分配具體的內存地址。這個物理緩存池通常是三維或四維的結構,維度包括模型層數、注意力頭數量和頭維度等。當 req_to_token_pool 將一個請求的 token 映射到一個邏輯索引后,token_to_kv_pool_allocator 就利用這個索引,在物理池的相應位置存取實際的 Key-Value 向量數據。

比如上面兩個批次的ScheduleBatch對應的TokenToKVPoolAllocator內容如下:
free_slots字段表示未分配的token緩存,形狀為:torch.Size([154788])

ipdb> batch.token_to_kv_pool_allocator.__dict__
{'size': 154801, 'dtype': torch.float16, 'device': 'cuda', 'page_size': 1, 
'free_slots': tensor([    15,     16,     17,  ..., 154800, 154801,      7], device='cuda:0'), 
'is_not_in_free_group': True, 'free_group': [], 
'_kvcache': <sglang.srt.mem_cache.memory_pool.MHATokenToKVPool object at 0x7f3cdde850d0>}
前綴共享的利器:RadixCache

在多用戶、多請求的服務場景中,不同請求的輸入(prompt)往往有重疊的前綴。例如,多個用戶可能都在進行相似主題的問答。如果能復用這些相同前綴的 KV 緩存,將極大減少重復計算,提升系統吞吐量。這正是 RadixCache(基數緩存,在 ScheduleBatch 中體現為 tree_cache 字段)發揮作用的地方。

RadixCache 采用樹狀結構(Trie Tree 或稱前綴樹)來組織和存儲所有處理過的 token 的 KV 緩存。樹的每條邊代表一個 token ID,從根節點到任意節點的路徑就構成了一個 token 序列(即前綴)。每個節點則存儲著對應 token 的 KV 緩存的邏輯索引(out_cache_loc)。

當一個新的請求進入系統時,SGLang 會利用 RadixCache 查找其輸入序列的最長公共前綴。一旦找到匹配的前綴,該前綴對應的所有 token 的 KV 緩存就可以被直接復用,無需重新計算。系統只需從前綴結束的位置開始進行新的計算。這個過程涉及到與 ReqToTokenPoolTokenToKVPoolAllocator 的緊密交互:RadixCache 負責找到可復用的 token 及其邏輯索引,然后更新 req_to_token_pool,將當前請求的相應 token 位置指向這些已存在的邏輯索引。TokenToKVPoolAllocator 則根據這些邏輯索引提供對底層物理內存的訪問。

對于新生成的 token,RadixCache 也會將其插入到樹中,并由 TokenToKVPoolAllocator 為其分配新的緩存空間,從而不斷擴充可供復用的緩存池。

協同工作的流程

這四個組件在 ScheduleBatch 中的關系可以總結為一個清晰的流程:

  1. 請求聚合:調度器將多個 Req 對象收集到 ScheduleBatchreqs 字段中。
  2. 前綴匹配與復用:系統利用 tree_cache (RadixCache) 對 reqs 列表中的每個請求進行前綴匹配。對于匹配到的公共前綴,直接復用其在 RadixCache 中已有的 KV 緩存信息。
  3. 邏輯映射建立tree_cache 將找到的或新創建的 token 的邏輯緩存索引(out_cache_loc)填充到 req_to_token_pool 中,從而建立了每個請求與其 token 邏輯緩存位置的映射。
  4. 物理內存分配與訪問:當模型需要進行注意力計算時,它會通過 req_to_token_pool 獲取到所需 token 的邏輯索引,再由 token_to_kv_pool_allocator 將這些邏輯索引轉換為 GPU 上的物理內存地址,最終讀取或寫入實際的 Key-Value 數據。

通過 Req 對象對請求進行封裝,再經由 RadixCache 實現高效的前綴共享,最后通過 ReqToTokenPoolTokenToKVPoolAllocator 這兩級內存池完成從邏輯請求到物理內存的精確映射與管理,SGLang 構建了一個強大而高效的推理引擎。這四個組件環環相扣,共同確保了 GPU 資源的最大化利用和推理服務的高性能表現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React學習筆記——Day2打卡

1、React表單控制 1.1 受控綁定 概念&#xff1a;使用React組件的狀態&#xff08;useState&#xff09;控制表單的狀態 完整示例&#xff1a; function App(){/* 1. 準備一個React狀態值 */ const [value, setValue] useState()return (/* 2. 通過value屬性綁定狀態&#x…

用例測試方法5,6:狀態遷移圖和因果圖

狀態遷移圖通過描繪系統的狀態及引起狀態轉換的事件&#xff0c;來表示系統的行為例如&#xff1a;訂機票l向航空公司打電話預定機票—>此時機票信息處于“完成”狀態顧客支付了機票費用后—>機票信息就變為“已支付”狀態旅行當天到達機場后&#xff0c;拿到機票后—>…

linux 腳本解釋

if [ $? -ne 0 ]; thenecho "錯誤: 無法關閉現有 Tomcat 實例&#xff0c;終止啟動流程!" >&2exit 1fi$? 是shell中的特殊變量&#xff0c;表示上一個命令的退出狀態碼-ne 0 表示"不等于0"(在Unix/Linux中&#xff0c;0通常表示成功&#xff0c;非…

Glary Utilities(系統優化工具) v6.20.0.24 專業便攜版

GlaryUtilities 允許你清理系統垃圾文件&#xff0c;無效的注冊表&#xff0c;上網記錄&#xff0c;刪除插件&#xff0c;查找重復文件&#xff0c;優化內存&#xff0c;修理或刪除快捷方式&#xff0c;管理windows啟動程序&#xff0c;卸載軟件&#xff0c;安全刪除文件&#…

VScode鏈接服務器一直卡在下載vscode服務器/scp上傳服務器,無法連接成功

終極方案&#xff08;強力推薦&#xff0c;親測有效&#xff0c;鏈接只需5秒鐘&#xff09;&#xff1a;本地下載復制到mkdir -p ~/.vscode-server/bin/<commit_hash>里面 <commit_hash>可以從幫助->關于里面找到&#xff0c;如下所示 版本: 1.96.2 提交: fa…

基于Spring Boot的農村農產品銷售系統設計與實現

隨著現代農業的快速發展,傳統農產品的銷售模式逐漸暴露出信息閉塞、流通效率低和中間環節多等問題。為了打破這些瓶頸,我基于Spring Boot框架開發了一套農產品銷售系統,旨在構建一座連接農民與消費者之間的數字橋梁,讓優質農產品更高效地直達用戶餐桌。 一、項目背景與目標…

Mysql默認存儲引擎InnoDB和底層數據結構

在黑馬點評項目實戰中&#xff1a;談到了為什么不推薦使用mysql的字段自增作為訂單id傳遞給客戶端&#xff0c;讓我想到了Mysql的??存儲引擎??和??底層數據結構??究竟是什么&#xff1f;它是如何實現自增的&#xff1f;本文主要是深度解析 MySQL 默認存儲引擎 InnoDB 與…

原點安全簽約金網絡數科,共建一體化數據安全防護體系

金網絡正式攜手原點安全&#xff0c;基于原點安全一體化數據安全平臺&#xff08;uDSP&#xff09;&#xff0c;啟動企業數據安全平臺建設項目&#xff0c;圍繞數據資產盤點、敏感數據識別與分類分級、數據訪問權限管控、數據動態脫敏、數據安全審計與風險監測等關鍵能力建設&a…

mix-blend-mode的了解使用

mix-blend-mode 是 CSS 的一個屬性&#xff0c;用于控制元素的內容&#xff08;如文本、圖像、背景等&#xff09;如何與其 父元素 或 背景 進行混合。它類似于圖形設計軟件&#xff08;如 Photoshop&#xff09;中的圖層混合模式&#xff0c;可以實現各種視覺效果&#xff1b;…

vue自定義指令bug

問題描述&#xff1a;頁面加載時&#xff0c;報已下錯誤。同時&#xff0c;頁面數據不顯示環境介紹&#xff1a;已經添加了vue自定義指令permission&#xff0c;實現如下&#xff0c;用以控制元素顯示權限app.directive(permission, (el, binding) > {if (!store.hasPermiss…

Vue3 + WebSocket

Vue3與WebSocket結合能夠很好地滿足實時通訊的需求。通過合理設計和管理WebSocket連接的生命周期&#xff0c;以及實現必要的重連邏輯和心跳檢測機制&#xff0c;可以構建出響應迅速且穩定的實時應用。WebSocketWebSocket允許服務端主動向客戶端發送數據&#xff0c;無需客戶端…

IPSec和HTTPS對比(一)

IPSec&#xff08;Internet Protocol Security&#xff09;是網絡層&#xff08;OSI第3層&#xff09;的加密協議&#xff0c;其核心機制和與HTTPS的區別如下&#xff1a;&#x1f512; ?一、IPSec的核心機制解析??1. 安全封裝結構?┌──────────┬───────…

關于 c、c#、c++ 三者區別

1. 起源與定位語言起源時間開發者定位/特點C1972年Dennis Ritchie面向過程的編程語言&#xff0c;強調底層控制與高效性能C1983年Bjarne Stroustrup在 C 的基礎上加入 面向對象編程&#xff08;OOP&#xff09;C#2000年微軟&#xff08;Microsoft&#xff09;類似 Java&#xf…

項目總體框架(servlet+axios+Mybatis)

項目總體框架 先暫時這樣子&#xff08;后續發現錯誤的話就改&#xff09; com.hope-tieba/ ← 項目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

RestTemplate 實現后端 HTTP 調用詳解

1. 方法簽名解析方法名和返回類型說明了這個方法的業務意圖和數據結構。Override 表示實現接口方法&#xff0c;利于規范開發和自動檢查。Override public List<RobotInfo> listRobots() {這里 RobotInfo 是假設的業務數據結構&#xff0c;實際項目中按你的類名即可。2. …

Python單例模式詳解:從原理到實戰的完整指南

引言 單例模式是軟件設計中最常用的模式之一&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。在Python中&#xff0c;實現單例模式有多種優雅的方式&#xff0c;本文將詳細講解6種主流實現方法&#xff0c;包含完整代碼示例和注釋。 一、模塊級單例&#x…

拼團系統中的冪等性防護 , 前置性查詢,Redis 庫存預判

這段內容涉及兩個關鍵點&#xff1a;冪等性防護 和 拼團目標量判斷&#xff0c;下面我將分別解釋這兩個問題&#xff0c;并重點說明&#xff1a; “如果沒有攔截&#xff0c;最終訪問數據&#xff0c;也會有數量判斷攔截。” 這句話的意思。 ? 1. 查詢外部交易 outTradeNo 是…

【Python】LEGB作用域 + re模塊 + 正則表達式

文章目錄一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;預覽1. re.match() —— 從字符串開頭匹配2. re.search() —— 搜索整個字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替換匹配的字…

JavaSE -- 數據操作流

6. 數據操作流在執行文件存儲一個對象的時候&#xff0c;如果該對象只有少量屬性需要存儲&#xff0c;并且這些屬性的類型都是基本數據類型&#xff0c;此時則不需要對象序列化技術。使用數據操作流既可以實現。 DataOutputStreamDataInputStream 注意&#xff1a; 讀取數據的時…

GI6E 加密GRID電碼通信SHELLCODE載入

GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…