大模型中的KV Cache

1. KV Cache的定義與核心原理

KV Cache(Key-Value Cache)是一種在Transformer架構的大模型推理階段使用的優化技術,通過緩存自注意力機制中的鍵(Key)和值(Value)矩陣,避免重復計算,從而顯著提升推理效率。

原理:

  • 自注意力機制:在Transformer中,注意力計算基于公式:
    Attention ( Q , K , V ) = softmax ( Q K ? d k ) V = ∑ i = 1 n w i v i (加權求和形式) \begin{split} \text{Attention}(Q, K, V) &= \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right) V \\ &= \sum_{i=1}^n w_i v_i \quad \text{(加權求和形式)} \end{split} Attention(Q,K,V)?=softmax(dk? ?QK??)V=i=1n?wi?vi?(加權求和形式)?
    其中,Q(Query)、K(Key)、V(Value)由輸入序列線性變換得到。

  • 緩存機制:在生成式任務(如文本生成)中,模型以自回歸方式逐個生成token。首次推理時,計算所有輸入token的K和V并緩存;后續生成時,僅需為新token計算Q,并從緩存中讀取歷史K和V進行注意力計算。

  • 復雜度優化:傳統方法的計算復雜度為O(n2),而KV Cache將后續生成的復雜度降為O(n),避免重復計算歷史token的K和V。

2. KV Cache的核心作用

  • 加速推理:通過復用緩存的K和V,減少矩陣計算量,提升生成速度。例如,某聊天機器人應用響應時間從0.5秒縮短至0.2秒。

  • 降低資源消耗:顯存占用減少約30%-50%(例如移動端模型從1GB降至0.6GB),支持在資源受限設備上部署大模型。

  • 支持長文本生成:緩存機制使推理耗時不再隨文本長度線性增長,可穩定處理長序列(如1024 token以上)。

  • 保持模型性能:僅優化計算流程,不影響輸出質量。

3. 技術實現與優化策略

實現方式:
  • 數據結構

    1. KV Cache以張量形式存儲,Key Cache和Value Cache的形狀分別為(batch_size, num_heads, seq_len, k_dim)(batch_size, num_heads, seq_len, v_dim)
  • 兩階段推理:

    1. 初始化階段:計算初始輸入的所有K和V,存入緩存。
    2. 迭代階段:僅計算新token的Q,結合緩存中的K和V生成輸出,并更新緩存。
      ? 代碼示例(Hugging Face Transformers):設置model.generate(use_cache=True)即可啟用KV Cache。

優化策略:

  • 稀疏化(Sparse):僅緩存部分重要K和V,減少顯存占用。

  • 量化(Quantization):將K和V矩陣從FP32轉為INT8/INT4,降低存儲需求。

共享機制(MQA/GQA):

  • Multi-Query Attention (MQA):所有注意力頭共享同一組K和V,顯存占用降低至1/頭數。

  • Grouped-Query Attention (GQA):將頭分組,組內共享K和V,平衡性能和顯存。

4. 挑戰與局限性

  • 顯存壓力:隨著序列長度增加,緩存占用顯存線性增長(如1024 token占用約1GB顯存),可能引發OOM(內存溢出)。

  • 冷啟動問題:首次推理仍需完整計算K和V,無法完全避免初始延遲。

5、python實現

import torch
import torch.nn as nn# 超參數
d_model = 4
n_heads = 1
seq_len = 3
batch_size = 3# 初始化參數(兼容多頭形式)
Wq = nn.Linear(d_model, d_model, bias=False)
Wk = nn.Linear(d_model, d_model, bias=False)
Wv = nn.Linear(d_model, d_model, bias=False)# 生成模擬輸入(整個序列一次性輸入)
input_sequence = torch.randn(batch_size, seq_len, d_model)  # [B, L, D]# 初始化 KV 緩存(兼容多頭格式)
kv_cache = {"keys": torch.empty(batch_size, 0, n_heads, d_model // n_heads),  # [B, T, H, D/H]"values": torch.empty(batch_size, 0, n_heads, d_model // n_heads) 
}# 因果掩碼預先生成(覆蓋最大序列長度)
causal_mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()  # [L, L]'''
本循環是將整句話中的token一個一個輸入,并更新KV緩存;
所以無需顯示的因果掩碼,因為因果掩碼只用于計算注意力權重時,而計算注意力權重時,KV緩存中的key和value已經包含了因果掩碼的信息。'''for step in range(seq_len):# 1. 獲取當前時間步的輸入(整個批次)current_token = input_sequence[:, step, :]  # [B, 1, D]# 2. 計算當前時間步的 Q/K/V(保持三維結構)q = Wq(current_token)  # [B, 1, D]k = Wk(current_token)  # [B, 1, D]v = Wv(current_token)  # [B, 1, D]# 3. 調整維度以兼容多頭格式(關鍵修改點)def reshape_for_multihead(x):return x.view(batch_size, 1, n_heads, d_model // n_heads).transpose(1, 2)  # [B, H, 1, D/H]# 4. 更新 KV 緩存(增加時間步維度)kv_cache["keys"] = torch.cat([kv_cache["keys"], reshape_for_multihead(k).transpose(1, 2)  # [B, T+1, H, D/H]], dim=1)kv_cache["values"] = torch.cat([kv_cache["values"],reshape_for_multihead(v).transpose(1, 2)  # [B, T+1, H, D/H]], dim=1)# 5. 多頭注意力計算(支持批量處理)q_multi = reshape_for_multihead(q)  # [B, H, 1, D/H]k_multi = kv_cache["keys"].transpose(1, 2)  # [B, H, T+1, D/H]print("q_multi shape:", q_multi.shape)print("k_multi shape:", k_multi.shape)# 6. 計算注意力分數(帶因果掩碼)attn_scores = torch.matmul(q_multi, k_multi.transpose(-2, -1)) / (d_model ** 0.5)print("attn_scores shape:", attn_scores.shape)# attn_scores = attn_scores.masked_fill(causal_mask[:step+1, :step+1], float('-inf'))# print("attn_scores shape:", attn_scores.shape)# 7. 注意力權重計算attn_weights = torch.softmax(attn_scores, dim=-1)  # [B, H, 1, T+1]# 8. 加權求和output = torch.matmul(attn_weights, kv_cache["values"].transpose(1, 2))  # [B, H, 1, D/H]# 9. 合并多頭輸出output = output.contiguous().view(batch_size, 1, d_model)  # [B, 1, D]print(f"Step {step} 輸出:", output.shape)

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

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

相關文章

Maven 公司內部私服中央倉庫搭建 局域網倉庫 資源共享 依賴包構建共享

介紹 公司內部私服搭建通常是為了更好地管理公司內部的依賴包和構建過程,避免直接使用外部 Maven 中央倉庫。通過搭建私服,團隊能夠控制依賴的版本、提高構建速度并增強安全性。公司開發的一些公共工具庫更換的提供給內部使用。 私服是一種特殊的遠程倉…

文檔外發安全:企業數據防護的最后一道防線

在當今數字化時代,數據已成為企業最寶貴的資產之一。隨著網絡安全威脅日益增多,企業安裝專業加密軟件已從"可選"變為"必選"。本文將全面分析企業部署華途加密解決方案后獲得的各項戰略優勢。 一、數據安全防護升級 核心數據全面保護…

【ArcGIS】根據shp范圍生成系列等距點:范圍外等距點+漁網點(Python全代碼)

【ArcGIS】根據shp范圍生成系列等距點 目標1:生成邊界外一定范圍、并且等間距分布的點📁 所需數據:操作步驟-ArcGIS代碼處理-Python 目標2:生成等距漁網點📁 所需數據:代碼處理-Python 參考 目標1&#xff…

Docker 環境安裝(2025最新版)

Docker在主流的操作系統和云平臺上都可以使用,包括Linux操作 系統(如Ubuntu、 Debian、Rocky、Redhat等)、MacOS操作系統和 Windows操作系統,以及AWS等云平 臺。 Docker官網: https://docs.docker.com/ 配置宿主機網…

Java并發編程-線程池(二)

文章目錄 線程池的實現原理execute(Runnable command)**1. 階段一:嘗試創建核心線程****2. 階段二:嘗試將任務加入隊列****3. 階段三:嘗試創建非核心線程或拒絕任務****關鍵機制與設計思想** 線程池的實現原理 當向線程池提交一個任務之后&a…

清華大學開源軟件鏡像站地址

清華大學開源軟件鏡像站: https://mirrors.tuna.tsinghua.edu.cn/

腦機接口技術:開啟人類與機器融合的新時代

摘要 腦機接口(BCI)技術作為一項前沿科技,正在逐步打破人類與機器之間的溝通障礙,為醫療、娛樂、教育等多個領域帶來前所未有的變革。本文將詳細介紹腦機接口技術的基本原理、發展現狀、應用場景以及面臨的挑戰和未來發展趨勢&…

2025前端面試遇到的問題(vue+uniapp+js+css)

Vue相關面試題 vue2和vue3的區別 一、核心架構差異 特性Vue2Vue3響應式系統基于Object.defineProperty基于Proxy(支持動態新增/刪除屬性)代碼組織方式Options API(data/methods分塊)Composition API(邏輯按功能聚合&am…

Matlab基于SSA-MVMD麻雀算法優化多元變分模態分解

Matlab基于SSA-MVMD麻雀算法優化多元變分模態分解 目錄 Matlab基于SSA-MVMD麻雀算法優化多元變分模態分解效果一覽基本介紹程序設計參考資料效果一覽 基本介紹 Matlab基于SSA-MVMD麻雀算法優化多元變分模態分解 可直接運行 分解效果好 適合作為創新點(Matlab完整源碼和數據),…

Gatsby知識框架

一、Gatsby 基礎概念 1. 核心特性 基于React的靜態站點生成器:使用React構建,輸出靜態HTML/CSS/JS GraphQL數據層:統一的數據查詢接口 豐富的插件系統:超過2000個官方和社區插件 高性能優化:自動代碼分割、預加載、…

【論信息系統項目的資源管理】

論信息系統項目的資源管理 前言一、規劃好資源管理,為保證項目完成做好人員規劃二、估算活動資源,為制訂項目進度計劃提供資源需求三、獲取項目資源,組建一個完備的項目團隊四、建設項目團隊,提高工作能力,促進團隊成員…

idea Maven 打包SpringBoot可執行的jar包

背景&#xff1a;當我們需要坐聯調測試的時候&#xff0c;需要對接前端同事&#xff0c;則需要打包成jar包直接運行啟動服務 需要將項目中的pom文件增加如下代碼配置&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</gr…

VScode 的插件本地更改后怎么生效

首先 vscode 的插件安裝地址為 C:\Users\%USERNAME%\.vscode\extensions 找到你的插件包進行更改 想要打印日志&#xff0c;用下面方法 vscode.window.showErrorMessage(console.log "${name}" exists.); 打印結果 找到插件&#xff0c;點擊卸載 然后點擊重新啟動 …

Python訓練營打卡——DAY24(2025.5.13)

目錄 一、元組 1. 通俗解釋 2. 元組的特點 3. 元組的創建 4. 元組的常見用法 二、可迭代對象 1. 定義 2. 示例 3. 通俗解釋 三、OS 模塊 1. 通俗解釋 2. 目錄樹 四、作業 1. 準備工作 2. 實戰代碼示例? 3. 重要概念解析 一、元組 是什么??&#xff1a;一種…

初入OpenCV

OpenCV簡介 OpenCV是一個開源的跨平臺計算機視覺庫&#xff0c;它實現了圖像處理和計算機視覺方面的很多通用算法。 應用場景&#xff1a; 目標識別&#xff1a;人臉、車輛、車牌、動物&#xff1b; 自動駕駛&#xff1b;醫學影像分析&#xff1b; 視頻內容理解分析&#xff…

訊聯云庫項目開發日志(一)

1、設計數據庫 2、寫基本框架 entity、controller、service、exception、utils、mapper mapper層&#xff1a; 生成了一系列的CRUD方法 工具類&#xff1a;線程安全的日期工具類、 ??參數校驗工具類? 線程安全的日期工具類??&#xff1a;主要用于 ??日期格式化&…

langchain學習

無門檻免費申請OpenAI ChatGPT API搭建自己的ChatGPT聊天工具 https://nuowa.net/872 基本概念 LangChain 能解決大模型的兩個痛點&#xff0c;包括模型接口復雜、輸入長度受限離不開自己精心設計的模塊。根據LangChain 的最新文檔&#xff0c;目前在 LangChain 中一共有六大…

Protobuf工具

#region 知識點一 什么是 Protobuf //Protobuf 全稱是 protocol - buffers&#xff08;協議緩沖區&#xff09; // 是谷歌提供給開發者的一個開源的協議生成工具 // 它的主要工作原理和我們之前做的自定義協議工具類似 // 只不過它更加的完善&…

zst-2001 上午題-歷年真題 軟件工程(38個內容)

CMM 軟件工程 - 第1題 b 軟件工程 - 第2題 c 軟件工程 - 第3題 c 軟件工程 - 第4題 b 軟件工程 - 第5題 b CMMI 軟件工程 - 第6題 0.未完成&#xff1a;未執行未得到目標。1.已執行&#xff1a;輸入-輸出實現支持2.已管理&#xff1a;過程制度化&#x…

軟考架構師考試-UML圖總結

考點 選擇題 2-4分 案例分析0~1題和面向對象結合考察&#xff0c;前幾年固定一題。近3次考試沒有出現。但還是有可能考。 UML圖概述 1.用例圖&#xff1a;描述系統功能需求和用戶&#xff08;參與者&#xff09;與系統之間的交互關系&#xff0c;聚焦于“做什么”。 2.類圖&…