【DeepSeek原理學習2】MLA 多頭隱變量注意力

解決的問題

Multi-Head Latent Attention,MLA——解決的問題:KV cache帶來的計算效率低和內存需求大以及上下文長度擴展問題。

MLA原理

MLA原理:其核心思想是將鍵(Key)和值(Value)矩陣壓縮到一個低維的"潛在"空間中,從而顯著減少KV緩存的內存占用。與傳統MHA相比,MLA不直接存儲完整的鍵值矩陣,而是存儲一個維度更小的壓縮向量。在需要進行注意力計算時,再通過解壓縮重構出所需的鍵和值(減少了權重矩陣要學習的參數量)。這種壓縮-解壓縮機制使得模型可以在顯著減少內存占用的同時,保持甚至提升性能。DeepSeek-V2的技術報告顯示,MLA使KV緩存減少了93.3%,訓練成本節省了42.5%,生成吞吐量提高了5.76倍。在8個H800 GPU上實際部署時,實現了超過50,000令牌每秒的生成速度,這一數據充分證明了MLA的高效性。

步驟

首先壓縮Q即公式(37)。

從5120先降維再升維,好處是相比直接使用大小為 [5120, 24576] 的矩陣# [5120, 1536] * [1536, 24576] 這樣的低秩分解在存儲空間和計算量上都大幅度降低維降到1536維?。也就是(37)-(40)模型所要學習的矩陣。

 # 對隱藏狀態進行線性投影和歸一化,生成查詢張量q = self.q_b_proj(self.q_a_layernorm(self.q_a_proj(hidden_states)))  # 調整查詢張量的形狀q = q.view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2) 

?解壓縮C并拆分,即(38)、(39)和(40)

q_nope, q_pe = torch.split(# 將查詢張量拆分為不包含位置嵌入的部分和包含位置嵌入的部分q, [self.qk_nope_head_dim, self.qk_rope_head_dim], dim=-1  )

?對KV張量的降維、分裂K、拆分KV且升維

具體的代碼涉及公式(41) kv_a_proj_with_mqa 和 公式(42)kv_b_proj 兩個參數矩陣。?

升維之后計算注意力?

?給q_pe, k_pe給加上rope且合并,然后做標準注意力計算。

這一部分也涉及一個權重矩陣:?o_proj,大小 [num_heads * v_head_dim, hidden_size] = [128*128, 5120]

?將查詢和鍵張量 `q_pe` 和 `k_pe` 進行旋轉

 # 計算旋轉位置嵌入的余弦和正弦值cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len)  # 應用旋轉位置嵌入q_pe, k_pe = apply_rotary_pos_emb(q_pe, k_pe, cos, sin, position_ids)

?接著,方法創建新的查詢狀態張量 `query_states` ,然后將旋轉后的部分和不包含位置嵌入的部分合并便可得到最終的Q向量

# 創建新的查詢狀態張量query_states = k_pe.new_empty(bsz, self.num_heads, q_len, self.q_head_dim)# 將不包含位置嵌入的部分賦值給查詢狀態張量query_states[:, :, :, : self.qk_nope_head_dim] = q_nope# 將包含位置嵌入的部分賦值給查詢狀態張量query_states[:, :, :, self.qk_nope_head_dim :] = q_pe

?K相似操作。

關于矩陣吸收十倍提速

這里不用展開計算的意思我理解為就是不需要再單獨升維計算,UK矩陣被吸收后直接與降維壓縮的K相乘即可。?這樣減少了中間變量的存儲,提高了計算效率。

 # 以下和原本實現相同bsz, q_len, _ = hidden_states_q.size()q = self.q_b_proj(self.q_a_layernorm(self.q_a_proj(hidden_states_q)))q = q.view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2)q_nope, q_pe = torch.split(q, [self.qk_nope_head_dim, self.qk_rope_head_dim], dim=-1)kv_seq_len = compressed_kv.size(1)compressed_kv, k_pe = torch.split(compressed_kv, [self.kv_lora_rank, self.qk_rope_head_dim], dim=-1)k_pe = k_pe.view(bsz, 1, kv_seq_len, self.qk_rope_head_dim)# 從 kv_b_proj 中分離的 W^{UK} 和 W^{UV} 兩部分,他們要分別在不同的地方吸收kv_b_proj = self.kv_b_proj.weight.view(self.num_heads, -1, self.kv_lora_rank)q_absorb = kv_b_proj[:, :self.qk_nope_head_dim,:]#W^{UK}out_absorb = kv_b_proj[:, self.qk_nope_head_dim:, :]#W^{UV}cos, sin = self.rotary_emb(q_pe)q_pe = apply_rotary_pos_emb(q_pe, cos, sin, q_position_ids)# !!! 關鍵點,W^{UK} 即 q_absorb 被 q_nope(W^{UQ}) 吸收q_nope = torch.einsum('hdc,bhqd->bhqc', q_absorb, q_nope) # 吸收后 attn_weights 直接基于 compressed_kv 計算不用展開。attn_weights = torch.matmul(q_pe, k_pe.transpose(2, 3)) + torch.einsum('bhqc,blc->bhql', q_nope, compressed_kv)attn_weights *= self.softmax_scale

?

#原始順序
v_t = einsum('hdc,blc->blhd', W_UV, c_t_KV) # (1)
o   = einsum('bqhl,blhd->bqhd', attn_weights, v_t)     # (2)
u   = einsum('hdD,bhqd->bhD', W_o, o)       # (3)# 將上述三式合并,得到總的計算過程
u   = einsum('hdc,blc,bqhl,hdD->bhD', W_UV, c_t_KV, attn_weights, W_o)
#改變順序
# 利用結合律改變計算順序
o_  = einsum('bhql,blc->bhqc', attn_weights, c_t_KV) # (4)#將注意力權重attn_weights與壓縮的鍵-值矩陣c_t_KV相乘,直接得到一個更緊湊的中間結果o_。
o   = einsum('bhqc,hdc->bhqd', o_, W_UV)  # (5)#將中間結果o_與權重矩陣W_UV相乘,得到o
u   = einsum('hdD,bhqd->bqD', W_o, o)     # (6)#將權重矩陣W_o與o相乘,得到最終輸出u

總結

MLA不直接存儲完整的鍵值矩陣,而是存儲一個維度更小的壓縮向量。在需要進行注意力計算時,再通過解壓縮重構出所需的鍵和值

1.減少了權重矩陣要學習的參數量。2.通過矩陣吸收減少了中間需要解壓后的K和V的矩陣,減少了中間存儲數據量提高了計算效率。

與其他注意力機制的比較

參考說明

[1]????????[深度剖析Deepseek 多頭潛在注意力(MLA) - 知乎

[2]MLA實現及其推理上的十倍提速——逐行解讀DeepSeek V2中多頭潛在注意力MLA的源碼(圖、公式、代碼逐一對應)_mla加速 csdn-CSDN博客

[3]DeepSeek-V2 高性能推理 (1):通過矩陣吸收十倍提速 MLA 算子 - 知乎

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

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

相關文章

LabVIEW 開發如何降本增效

在 LabVIEW 開發領域,如何在確保項目質量的同時降低開發成本,是眾多企業和開發者共同關注的焦點。這不僅關乎資源的高效利用,更影響項目的投資回報率和市場競爭力。下面,我們將從多個維度深入剖析降本策略,并結合具體案…

原理圖輸出網表及調入

一、輸出網表操作步驟 (1)選中.dsn文件,選者N或進入tools下拉列表選擇Creat Netlists (2)導出網表后的文件 二、網表的導入 (1)執行菜單命令“File-Import-Logic/netlist”,將原理…

MyBatis 分頁插件使用教程

MyBatis 分頁插件使用教程 MyBatis 是一款優秀的持久層框架,但原生的 MyBatis 并不支持分頁查詢。為了簡化分頁操作,MyBatis 官方和第三方提供了多種分頁插件,最常用的就是 MyBatis-Plus 的分頁插件。本文詳細介紹 MyBatis-Plus 分頁插件的使…

目錄穿越 + pickle反序列化 -- xyctf Signin WP

源代碼 # -*- encoding: utf-8 -*-File : main.py Time : 2025/03/28 22:20:49 Author : LamentXUflag in /flag_{uuid4}from bottle import Bottle, request, response, redirect, static_file, run, route secret aapp Bottle() route(/) def index():return…

區塊鏈技術:重塑供應鏈管理的未來

在當今全球化的商業環境中,供應鏈管理的復雜性和重要性日益凸顯。從原材料采購到產品交付,供應鏈的每一個環節都可能影響企業的運營效率和客戶滿意度。隨著區塊鏈技術的興起,供應鏈管理迎來了新的變革機遇。本文將深入探討區塊鏈技術在供應鏈…

ragflow本地部署(WSL下Ubuntu)

本地docker及 docker-compose版本 安裝參考: 實踐筆記-docker安裝及配置鏡像源實踐筆記-docker-compose安裝 1.下載源碼 git clone https://github.com/infiniflow/ragflow.git2.運行docker-compose拉取鏡像 cd ragflow/docker docker-compose up -d3.啟動報錯…

LTSPICE仿真電路:(二十六)跨阻放大器簡單仿真

1.前言 由于有個機會剛好了解了下跨阻,簡單做個這個仿真,實際上跨阻放大器應該要復雜的多,由于跨阻放大器實際上是將電流轉換為電壓,最需要注意的參數肯定是運放的偏置電流 2.跨阻放大器仿真 這篇是純記錄 這是一個將0-50uA電流…

androd的XML頁面 跳轉 Compose Activity 卡頓問題

解決 XML 點擊跳轉到 Compose Activity 卡頓問題 當從 XML 布局的 Activity 跳轉到 Compose Activity 時出現卡頓現象,這通常是由以下幾個原因導致的: 可能的原因及解決方案 1. Compose 首次初始化開銷 問題:Compose 框架首次初始化需要時…

基于Python的二手房數據挖掘與可視化深度分析

一、技術框架與數據概況 1.1 技術棧構成 import pandas as pd # 數據操作(v1.3.5) import numpy as np # 數值計算(v1.21.6) from pyecharts.charts import * # 交互式可視化(v1.9.1) from sklearn.preprocessing import StandardScaler # 數據標準化(可選擴展) …

從數據到成果:R 語言在氣象水文全流程中的關鍵技術應用

R語言在氣象、水文中數據處理及結果分析、繪圖實踐技術應用 R 語言是一門由統計學家開發的用于統計計算和作圖的語言(a Statistic Language developed for Statistic by Statistician),由 S 語言發展而來,以統計分析功能見長。R …

2025最快解決root密碼忘記問題或重置root密碼root密碼忘記了怎么辦?如何最方便的找回或者重置root密碼?

root密碼忘記了怎么辦?如何最方便的找回或者重置root密碼? 1、完全不需要按照網絡上的那么麻煩的操作 2、看看我們機房的物理服務器有沒有默認的管理地址,如果有的話我們就把自己的電腦調整跟服務器一樣的網段,用瀏覽器訪問該服務…

面試題匯總06-場景題線上問題排查難點亮點

面試題匯總06-場景題&線上問題排查&難點亮點 【一】場景題【1】訂單到期關閉如何實現【2】每天100w次登錄請求,4C8G機器如何做JVM調優?(1)問題描述和分析(2)堆內存設置(3)垃圾收集器選擇(4)各區大小設置(5)添加必要的日志【3】如果你的業務量突然提升100倍…

C和C++有什么區別?

C和C是兩種不同的編程語言,雖然它們有許多相似之處,但也存在一些關鍵的區別。 C是一種過程化編程語言,專注于函數和流程控制,非常適合系統級編程。而 C是一種面向對象編程語言,支持類、對象和封裝、繼承、多態等特性。…

動態規劃-楊輝三角

118.楊輝三角 給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。輸入&#xff1a;int 輸出&#xff1a;二元列表 思路&#xff1a; 面向結果編程&#xff01;&#xff01;&#xff01; class Solution {public List<List<Integer>> genera…

powershell綁定按鈕事件的兩種方式

寫一個powershell的簡單GUI做本地任務&#xff0c;試驗出2個方法&#xff1a; 方法1&#xff1a; function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2&#xff1a; $btn2_click {write-host $…

C++語言的并查集

并查集&#xff08;Union-Find&#xff09;在C中的實現與應用 引言 并查集&#xff08;Union-Find&#xff09;&#xff0c;又稱為不相交集合&#xff08;Disjoint Set&#xff09;&#xff0c;是一種用于處理動態連通性問題的數據結構。它的主要功能包括合并兩個集合&#x…

基于大模型的病態竇房結綜合征預測及治療方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 二、病態竇房結綜合征概述 2.1 定義與病因 2.2 臨床表現與分型 2.3 診斷方法 三、大模型在病態竇房結綜合征預測中的應用 3.1 大模型介紹 3.2 數據收集與預處理 3.3 模型訓練與優化 四、術前預測與準備 4.1 風險預…

2026考研數學張宇武忠祥復習視頻課,高數基礎班+講義PDF

2026考研數學武忠祥老師課&#xff08;網盤&#xff09;&#xff1a;點擊下方鏈接 2026考研數學武忠祥網課&#xff08;最新網盤&#xff09; 一、基礎階段&#xff08;3-5個月&#xff09; 目標&#xff1a;搭建知識框架掌握基礎題型 教材使用&#xff1a; 高數&#xff1a;…

linux命令二

1.將windows文件上傳到linux 將文件傳到光驅里&#xff0c;再將光驅進行掛載&#xff0c;mount 2.linux安裝的文件存儲 普通執行 程序 bin 配置文件 /etc 日志文件 /var/log 3.rpm 主查詢 命令&#xff1a;rpm -q 包名 查詢已安裝的軟件包 通過軟件 -qa 查詢所有已安裝的軟件包…

k8s的StorageClass存儲類和pv、pvc、provisioner、物理存儲的鏈路

k8s的StorageClass存儲類和pv、pvc、provisioner、物理存儲的鏈路 StorageClass能自動創建pv 在控制器中&#xff0c;直接聲明storageClassName&#xff0c;不僅能自動創建pvc&#xff0c;也能自動創建pv stoageclass來自于provisioner&#xff0c;provisioner來自于pod&#x…