KV Cache大模型推理加速功能

KV Cache

KV Cache是大模型標配的推理加速功能,也是推理過程中,顯存資源巨大開銷的元兇之一。在模型推理時,KV Cache在顯存占用量可達30%以上。

目前大部分針對KV Cache的優化工作,主要集中在工程上。比如著名的VLLM,基于paged Attention,最大限度地利用碎片化顯存空間,從而提升了空間利用率。

但是這些方案并沒有從根本上改變KV Cache占用空間巨大的問題。

我們先來看看KV Cache的基本原理,然后在文章后面詳細介紹DeepSeek MLA機制時,再來看DeepSeek-V2是怎么解決這個問題的。
KV Cache基本原理

如果不熟悉Transformer的生成過程,這部分推薦看看國外博主Jay Alammar的這篇文章:https://jalammar.github.io/illustrated-gpt2/

我們先回到Transformer計算Attention的公式,

大模型的推理是一個自回歸的過程,即一個從頭到尾逐步生成的過程。下一步的輸出,取決于上一步。

假如我們需要輸出Robot must obey orders這四個字。

模型生成第一步Robot時,會接收一個特殊字符,作為第一步的輸入,然后輸出Robot。接著將“ Robot”作為第二步的輸入,生成must,以此類推,直到模型輸出遇到最大長度限制,或者輸出了停止字符,則停止輸出過程。

我們來模擬一個輸出過程中每一步全局的Masked Attention的計算過程。這里公式中忽略了

以便展示。

每一行代表一個查詢向量與所有鍵向量的點積,但由于掩碼的存在,每個查詢只能訪問它自己和之前的鍵(因果關系)。畢竟在生成的過程中,是不能看到后續的值的。

最后輸出的softmax結果大概如下:

然后再將這個softmax結果,和對應的V值進行計算。在這個過程中,上面的矩陣計算,四行的Attention拆解下來如下,

我們可以發現這么一些規律:

每一個

的計算,只取決于當前步的,不需要以前的

。
之前的K和V,在后面會被重復利用。

那么這里就很清楚了,隨著生成序列的增加,計算Attention的增多,前面步驟的K和V都需要參與后續的計算。

所以我們如果將之前的K和V都存儲下來,就不用在當前這一步,再重新生成計算一次以前生成過的K和V。這就是KV Cache。一種空間換時間的做法。

所以可以看出,隨著序列增長,需要存儲的K和V逐漸增多,因此推理中產生的開銷也會越大。
MOE架構

MOE層替代的是傳統Transformer架構中FFN這一層。就是圖中框紅圈的Feed Forward層。

之前有寫過一篇介紹大模型推理加速的文章,
隊長:大模型推理加速,從逮蝦戶說起34 贊同 · 0 評論文章

闡述了FFN層

的幾個問題,

第一,是FFN層參數量巨大,大概占了整個模型參數量的三分之二左右。

第二,FFN層的激活存在較大的稀疏性,也就是針對某些問題的輸入,FFN層只有部分的參數是有用的。

MOE架構主要針對第二個問題進行了較大的改進。簡而言之就是將一個完整的FFN,替換成由多個“專家網絡

”組成的神經網絡,這個神經網絡可以是簡單的FFN,或者其它結構。從而在推理或者訓練時,能夠針對不同的數據進行解耦,增加效率。

從上圖的結構可以看出,MOE架構包含兩個部分:

一個是之前說的多個專家網絡組成的稀疏MOE層。
另一個是門控網絡,決定了模型的輸入,需要由哪個專家網絡進行處理。

這么做的好處在推理中體現如下,

首先,提升了模型的拓展性,MoE的每個專家都負責處理一部分數據。這意味著整個模型可以包含大量的專家(和相應的參數),而每次只有少部分專家被激活處理特定的數據。這樣,我們可以擴展模型的能力而不必擔心處理速度變慢。

只有被門控機制選中的專家才會參與到當前輸入的處理中。這不僅使模型在處理單個任務時更為高效,而且大大減少了不必要的計算,每個專家只計算與其專長相關的數據。

不過,也有隨之而來的問題,最主要的問題是,需要設計一個高效和公平的門控機制,即負載均衡問題。它需要確保正確的專家被激活,同時避免某些專家被過度使用而其他專家則幾乎閑置。

此外,還得確保每個專家都能得到足夠的訓練,以避免過擬合或欠擬合的問題,否則輸出的穩定性會受到極大影響。
DeepSeek-V2詳解

說完了背景知識,KV Cache和MOE,以及它們存在的一些問題。

我們可以來看看DeepSeek-V2對上述兩個核心部分到底做了哪些改進。
Multiple Latent Attention

MLA是對傳統多頭注意力做的改進,其目的有兩個:

降低推理過程中的KV Cache資源開銷。
緩解MQA、MGA對性能的損耗。

首先來說第一點,之前介紹KV Cache中,提到每一步都需要將K和V緩存下來。假設單個Attention Block塊中的多頭注意力,有n個頭,每個k和v的維度為d,則每一步需要緩存的參數量為

,l為block的塊數。

因此,MLA立足于在推理中,降低

。對Key和Value進行了一個低秩聯合壓縮。

簡單理解就是,假設有個矩陣的維度是
,那么可以將其分解為兩個的矩陣相乘,而

。這樣就降低了存儲量。

具體來看看DeepSeek中的具體實現公式:

是對Key和Value壓縮后的隱向量,通過一個降維映射矩陣和模型輸入得到。的維度,遠小于多頭key和value的原始維度

得到這個
后,具體的key和value,由兩個對應的升維矩陣和

還原。

在推理的過程中,只需要緩存每一步的
,然后再計算還原回原始的K和V即可。由于的維度遠小于K、V。因此每一步token的推理產生的緩存由之前的,變成

另外,之前提到KV Cache中,Q的作用只發生在當下,但是在模型訓練的過程中,每個輸入的token會通過多頭注意力機制生成對應的query、key和value。這些中間數據的維度往往非常高,因此占用的內存量也相應很大。所以論文中也提到,為了降低訓練過程中的激活內存activation memory,DeepSeek-V2還對queries進行低秩壓縮,即便這并不能降低KV Cache。

對Q的壓縮方式和K、V一致。

至此,架構圖中紅圈部分已解釋完畢。
位置編碼解耦

從架構圖中發現,DeepSeek-V2的q和k各自都有2個部分。1個部分是剛剛解釋過的壓縮部分,而另外的1個部分,加上了RoPE位置編碼

。做了一個位置編碼的解耦。

在RoPE的實現中,如果我們要讓Q、K帶上位置信息,會分別乘以相應的位置編碼矩陣。

如果計算

時,就變成了

DeepSeek-V2對Q和K都進行了壓縮,則整個過程變成:

這里,
和 分別是用于從低秩表示恢復到原始維度的解壓縮矩陣。問題在于,由于低秩表示已經是壓縮了的狀態,直接在 和 上應用 和

不再等價于在完整的Q和K上應用位置編碼。這是因為壓縮操作可能已經丟失了某些信息,使得位置編碼不能直接和有效地反映原始Q和K的位置關系。

為了解決這個問題,Deepseek-V2設計了兩個pe結尾的變量用于儲存旋轉位置編碼的信息,將信息存儲和旋轉編碼解耦開。

最后將這四個變量分別拼接起來,形成帶信息壓縮的Q、K,以及帶位置信息的Q、K,進行最后的計算。

最終,單個Token產生的緩存包含了兩個部分,即

同時,與GQA和MQA相比,不同于MQA和GQA可能因合并或分組而丟失細節信息,MLA的壓縮是基于保持盡可能多的原始信息的前提下進行的。這使得模型在執行注意力操作時,能夠利用到更精確的信息,從而提高整體的性能。
DeepSeek MOE

DeepSeekMoE引入了兩個主要策略:

細粒度專家分割(Fine-Grained Expert Segmentation):通過將每個FFN專家進一步細分,這允許模型在保持參數總數不變的情況下,激活更多的、更細粒度的專家。這種策略使得各個專家能夠專注于更細致的知識領域,提高了專家的專業化程度。
共享專家隔離(Shared Expert Isolation):設置一部分專家作為“共享專家”,這些專家總是被激活,用于捕捉和整合常見的跨上下文知識。這樣可以減少路由專家之間的知識冗余,每個路由專家可以更專注于獨特的知識領域。

上圖摘取自DeepSeek MOE的技術報告,從左到右分別是傳統的MOE,細粒度專家分割,細粒度專家分割+共享專家隔離。

這兩個策略是對緩解傳統MoE的缺陷進行的改進,

知識雜糅(Knowledge Hybridity):傳統的MoE模型中,每個專家往往需要處理多種類型的知識,這使得專家難以形成專門化的知識結構。
知識冗余(Knowledge Redundancy):不同的專家在處理不同的輸入時可能需要相同的知識,導致多個專家中存在重復的知識,浪費了模型參數。

針對上面的缺陷,業界其實有挺多人做過實驗,例如這篇文章,

作者對Mixtral-8x7B進行了實驗,想知道模型中不同的專家是否貢獻相同。于是作者逐一去掉了網絡中的專家,再對模型進行測試。最后發現expert 3的貢獻遠大于其它專家。

呈現出了一人干活,旁人看戲的特點。

顯然,Mixtral-8x7B可能負載均衡沒做好,導致了這個問題。

那么Deepseek MoE是否也有類似的問題呢?

從技術報告的說明來看,似乎是沒有,因為報告里專門寫了一下,當只有4個路由專家被激活時,DeepSeekMoE 的表現(Pile 損失)也與基于GShard架構的同等參數量模型相當。

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

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

相關文章

Windows 圖形顯示驅動開發-WDDM 2.0功能_上下文監視

功能概述 上下文監視機制是GPU與CPU協同計算的核心同步技術,通過受監視圍欄(Monitored Fence)實現跨硬件單元的高效協調。其核心目標是解決以下場景的同步需求: GPU引擎間同步:例如在多渲染管線中,后處理…

基于YOLOv8的機場跑道異物檢測識別系統:提升航空安全的新一代解決方案(主頁有源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 1. 機場跑道異物檢測領域概述 機場跑道異物(Foreign Object Debris, FOD)是指存在于機場跑道、滑行道等關…

網絡協議學習

最近在適配ESP32的網絡驅動,借此機會先學習一下網絡通信協議。 以太網幀、IP包及TCP與UDP的報文格式一文讀懂網絡報問中的檢驗和(checksum)—— 原理舉例代碼 提問騰訊元寶提示詞: TCP窗口是干什么的擁塞窗口是什么的

fit 轉 gpx

新增 fit 轉 gpx 功能 https://fittools.cc/home/fit2gpx

C++ I/O 性能優化指南

在高性能計算和大規模數據處理中,I/O 性能優化是提升系統整體效率的關鍵環節。C 作為一種高性能編程語言,提供了豐富的工具和機制來優化 I/O 操作。本文將詳細介紹在 Linux 環境下,如何通過代碼層面的優化、系統調用的選擇以及多線程技術等手…

Python中內置的數據結構類型詳析(內置數據容器)

目錄 1. 元組(Tuple)??2. 列表(List)?3. 字典(Dict)4. 集合(Set)??5. 字符串(Str)6. 隊列(Queue)與棧(Stack&#xf…

Socket多路復用網絡編程應用總結

Socket多路復用網絡編程應用總結 概述 ? 傳統I/O模型的局限性:傳統阻塞式I/O模型每次僅在一個文件描述符(File Descriptor, FD)上執行I/O操作,導致程序需等待單個操作完成,無法高效處理多連接場景(如高并…

安卓開發提示Android Gradle plugin錯誤

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模塊級 build.gradle(如果有獨立配置):…

【C++初階】--- vector容器功能模擬實現

1.什么是vector? 在 C 里,std::vector 是標準模板庫(STL)提供的一個非常實用的容器類,它可以看作是動態數組 2.成員變量 iterator _start;:指向 vector 中第一個元素的指針。 iterator _finish;&#x…

分布式鎖在秒殺場景中的Python實現與CAP權衡

目錄 一、分布式鎖的前世今生 二、秒殺系統的 “硬核” 挑戰 三、Python 實現分布式鎖的 “實戰演練” Redis 實現:快準狠 ZooKeeper 實現:穩如老狗 數據庫實現:老實本分 四、CAP 理論的 “三角戀” 五、性能優化的 “錦囊妙計” 鎖粒度控制:粗細有道 超時機制:別…

企業級開發SpringBoost玩轉Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模塊,可以方便地集成 Elasticsearch。 下面我們將詳細講解如何在 Spring Boot 中使用 Elasticsearch 8,并提供示例代碼。 1. 添加依賴: 首先,需要在 pom.xml 文件中添加 spring-data-e…

磐石云智能語音客服系統——技術革新引領服務新體驗

在人工智能技術飛速發展的今天,企業對于智能化客戶服務的需求日益增長。磐石云智能語音客服系統憑借其前沿技術架構與深度場景適配能力,正在重新定義人機交互的邊界。本文將深入解析該系統如何通過技術創新實現服務效率與體驗的雙重突破。 一、意圖識別…

OpenGL學習筆記(assimp封裝、深度測試、模板測試)

目錄 模型加載Assimp網格模型及導入 深度測試深度值精度深度緩沖的可視化深度沖突 模板測試物體輪廓 GitHub主頁:https://github.com/sdpyy1 OpenGL學習倉庫:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppL…

通過AWS EKS 生成并部署容器化應用

今天給大家分享一個實戰例子,如何在EKS上創建容器化應用并通過ALB來發布。先介紹一下幾個基本概念: IAM, OpenID Connect (OIDC) 2014 年,AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的聯合身份支持。此功能允許…

入侵檢測snort功能概述

1. 數據包嗅探與日志記錄 網絡流量監控:實時捕獲和分析網絡數據包(支持以太網、無線等)。 日志記錄:將數據包以二進制格式(pcap)或文本格式存儲,供后續分析。 2. 協議分析與解碼 深度協議解析…

【Easylive】定時任務-每日數據統計和臨時文件清理

【Easylive】項目常見問題解答(自用&持續更新中…) 匯總版 這個定時任務系統主要包含兩個核心功能:每日數據統計和臨時文件清理。下面我將詳細解析這兩個定時任務的實現邏輯和技術要點: Component Slf4j public class SysTas…

藍橋杯 15g

班級活動 問題描述 小明的老師準備組織一次班級活動。班上一共有 nn 名 (nn 為偶數) 同學,老師想把所有的同學進行分組,每兩名同學一組。為了公平,老師給每名同學隨機分配了一個 nn 以內的正整數作為 idid,第 ii 名同學的 idid 為…

如何使用AI輔助開發R語言

R語言是一種用于統計計算和圖形生成的編程語言和軟件環境,很多學術研究和數據分析的科學家和統計學家更青睞于它。但對與沒有編程基礎的初學者而言,R語言也是有一定使用難度的。不過現在有了通義靈碼輔助編寫R語言代碼,我們完全可以用自然語言…

CISCO組建RIP V2路由網絡

1.實驗準備: 2.具體配置: 2.1根據分配好的IP地址配置靜態IP: 2.1.1PC配置: PC0: PC1: PC2: 2.1.2路由器配置: R0: Router>en Router#conf t Enter configuration…

React + TipTap 富文本編輯器 實現消息列表展示,類似Slack,Deepseek等對話框功能

經過幾天折騰再折騰,弄出來了,弄出來了!!! 消息展示 在位編輯功能。 兩個tiptap實例1個用來展示 消息列表,一個用來在位編輯消息。 tiptap靈活富文本編輯器,拓展性太好了!!! !!! 關鍵點&#x…