如何理解DeepSeek-V3.2-Exp的稀疏注意力機制 | 官方報告里沒提的一些技術細節
果然是假期之前愛“搞事”,還有兩天就國慶了,DeepSeek放出了DeepSeek-V3.2-Exp。相比之前的版本,主要創新是引入了一種稀疏注意力機制DSA(DeepSeek Sparse Attention)。官方的Tech Report比較宏觀,對細節描述不多。好在DeepSeek今天也開源模型推理源代碼,我認真看了一下,做了一點實驗,分享記錄DSA的一些技術原理和細節。
為什么大模型害怕“長篇大論”?
想象一下你走進一個上百人的聚會,為了不錯過任何重要信息,你需要聽清每個人說的話。這會讓你筋疲力盡!大語言模型(LLM)在閱讀長文章時也面臨類似困境。傳統的注意力(Attention)機制,就像那個聚會上的你,要求每個詞(token)都去“關注”文章里的所有其他詞。如果文章長度翻倍,模型的計算量就要翻四倍(即 O(L2) 復雜度),很快就會不堪重負。
為了解決這個“聚會難題”,DeepSeek-V3.2-Exp 提出了一種聰明的方案——DeepSeek Sparse Attention (DSA)。它讓模型不再需要“雨露均沾”,而是學會“重點關注”,從而高效地處理超長文本。
DSA的核心思想:圖書館里的“先查索引,再精讀”
DSA 的工作方式,就像你在一個巨大的圖書館里找資料。你不會一頭扎進去,把每一本書都翻一遍。更聰明的做法是:
- 第一步(快速索引):先去圖書館的電腦上(一個輕量級的“閃電索引器”)搜索關鍵詞。電腦會快速掃描整個圖書館的目錄,給你一個簡短的書單,告訴你哪些書最可能包含你需要的信息。
- 第二步(重點精讀):拿著這份書單,你直接找到那幾本最相關的書,然后仔細閱讀(模型的主注意力機制MLA)。
通過這種方式,你避免了閱讀成千上萬本無關書籍的巨大工作量。DSA 正是采用了這種“先粗篩,后精讀”的策略,將主注意力的計算復雜度從 O(L2) 降低到了 O(L * K),其中 K 是書單上書的數量(通常遠小于 L)。

(官方報告中的DSA架構圖,綠色部分就是我們的“圖書館電腦”——閃電索引器)
第一階段:“閃電索引器”快如閃電的三大秘訣
這個“圖書館電腦”為什么能那么快地掃描海量信息呢?因為它有三個“秘密武器”:
1. 結構簡化:用“卡丁車”替代“F1賽車”索引器本身就是一個簡化版的“迷你”注意力模型。從 ??model.py??? 的 ???Indexer??? 類定義可以看出,它的頭數(???index_n_heads=64???)和維度(???index_head_dim=128???)都相對較小。這就像用一輛輕便的卡丁車來完成偵察任務,而不是動用昂貴笨重的F1賽車。雖然沒那么強勁,但勝在靈活、快速、成本低。
2. 激進量化:用“黑白簡筆畫”替代“高清彩照”這是提速的核心。索引器在計算時,把所有數據都從高精度的格式(如 BF16)壓縮成了一種叫 FP8 的超低精度格式。
可以把 FP8 理解成一張“黑白簡筆畫”。它雖然丟失了高清彩照的很多細節,但核心輪廓和信息都在,足以讓你辨認出是什么。計算機處理這種“簡筆畫”的速度要比處理“高清彩照”快得多,內存占用也減半。???kernel.py??? 中的 ???act_quant??? 函數就負責這個“壓縮”過程。
3. 定制硬件指令:為“卡丁車”裝上“專用引擎”為了把 FP8 的速度優勢發揮到極致,DeepSeek 沒有使用通用的計算代碼,而是用一種叫 ??TileLang??? 的語言編寫了專屬的 CUDA 核函數 ???fp8_index???。
這相當于為這輛“卡丁車”量身打造了一臺專用引擎。這臺引擎只為一件事而生——以最快速度完成索引器特定的計算任務,從而在硬件層面實現了極致的加速。
小結: 閃電索引器通過 “輕量模型 + 低精度計算 + 定制代碼” 這三板斧,實現了名副其實的“閃電”速度,為后續的精讀環節提供了高效指引。
第二階段:給主注意力戴上“特制眼罩”
索引器給出了“書單”(Top-K 相關的詞)之后,主注意力模塊 MLA (Multi-Head Latent Attention) 如何利用這份清單呢?
答案是:給它戴上一副只留了幾個小孔的“眼罩” (Masking) 。
我們來看 ???model.py??? 中 ???MLA.forward??? 方法的簡化邏輯:
# model.py -> class MLA
def forward(self, x, ...):
# ... (主注意力計算自己的 Q, K, V)
# 1. 問索引器要“書單”
topk_indices = self.indexer(x, ...)
# 2. 制作“眼罩”
# - 先拿一塊完全不透光的布(一個填滿 -inf 的張量)
index_mask = torch.full(..., float("-inf"), ...)
# - 在“書單”上對應的位置,戳幾個小孔(把值設為 0)
index_mask.scatter_(-1, topk_indices, 0)
# ... (主注意力計算原始的相關度分數 scores)
scores = torch.einsum(...)
# 3. 戴上“眼罩”
# - 把“眼罩”蓋在分數上,沒開孔的地方分數會變得極低
scores += index_mask.unsqueeze(2)
# 4. 最終計算
# - 經過 Softmax 后,被遮住的地方概率幾乎為0,模型只會關注“小孔”里的內容
scores = scores.softmax(...)
x = torch.einsum(...)
return x整個過程非常直觀:
- 獲取清單:索引器返回一份列表,告訴我們當前這個詞最應該關注哪 K 個歷史詞。
- 制作眼罩:我們創建一個“眼罩”(?
?index_mask???),默認遮住所有東西。然后,只在清單上指定的位置開幾個“觀察孔”。這里的技術實現是用一個極大的負數 ???-inf??? 代表“遮住”,用 ???0??? 代表“開孔”。 - 戴上眼罩:在主注意力計算出它對所有詞的初步“好感度”(?
?scores??)后,我們把這個眼罩蓋上去。被遮住的地方,好感度瞬間變成負無窮。 - 聚焦計算:經過 ?
?softmax?? 函數處理后,那些好感度為負無窮的位置,其最終權重會趨近于零,被徹底忽略。模型的所有“精力”都將集中在從那幾個小孔里看到的詞上。
這樣,強大的主注意力模塊就被強制只在最有價值的一小部分信息上進行深度計算,既保證了效果,又實現了驚人的效率提升。
DSA 的智慧所在
DeepSeek Sparse Attention (DSA) 并非一個全新的復雜算法,而是一種非常聰明的工程思想,體現了“分工與協作”的智慧:
- 閃電索引器 (偵察兵):一個速度極快、成本極低的偵察兵,負責快速掃描整個戰場,并帶回一份“高價值目標”的簡報。
- 主注意力 (主戰部隊):一支裝備精良、戰力強大的主戰部隊。它根據偵察兵的簡報,通過“眼罩”機制,將火力精準地傾瀉在少數關鍵目標上,不做任何浪費。
這種“偵察兵 + 主戰部隊”的協同作戰模式,讓 DeepSeek-V3.2-Exp 在處理長文本時,既能看得遠(全局索引),又能看得清(局部精讀),最終實現了效率與性能的高效平衡。
Appendix
- DeepSeek-V3.2-Exp模型推理源代碼,上面說的model.py, kernel.py都在這兒: https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp/tree/main/inference
- DeepSeek-V3.2-Exp Tech Report: https://github.com/deepseek-ai/DeepSeek-V3.2-Exp/blob/main/DeepSeek_V3_2.pdf
本文轉載自?????后向傳播?????,作者: 張發恩

















