DeepSeek 在發布 DeepSeek-V3 時,開源 README 總參數 671B、每個 token 啟用 37B 的混合專家(MoE)架構(“We present DeepSeek-V3, a strong Mixture-of-Experts (MoE) language model with 671B total parameters with 37B activated for each token.")。關於總參數量與啟動參數的差別,可以參考之前寫的相關文章:7B、70B 是什麼意思?看懂模型名字裡的參數量。在這樣的大規模模型下,除了訓練成本之外,實際部署時更直接的負擔其實落在推論階段的顯存容量。
為了提升推論效率,官方說明他們採用了 Multi-head Latent Attention(MLA)架構(“To achieve efficient inference and cost-effective training, DeepSeek-V3 adopts Multi-head Latent Attention (MLA) and DeepSeekMoE architectures, which were thoroughly validated in DeepSeek-V2.")。這項設計的核心目標,在於緩解自回歸生成時持續膨脹的鍵值快取(KV cache)記憶體佔用。
KV 快取的記憶體瓶頸
大型語言模型在自回歸生成文字的過程中,每計算一個新 token,注意力機制都需要回頭查詢先前所有 token 的 Key 與 Value。為了避免重複運算,推論系統會把先前步驟產生的鍵值向量暫存在顯存當中,也就是常見的 KV 快取。
在標準的多頭注意力(Multi-Head Attention,MHA)當中,每個注意力頭都各自擁有一組 Key 與 Value 向量。當模型層數增加、上下文長度拉長,或是同時處理多個請求時,快取所消耗的顯存容量會迅速累積,變成限制批次大小和序列長度的主要瓶頸(來自 V2 論文)。常見的分組查詢注意力(GQA)透過讓多個 Query 頭共用同一組 Key 與 Value 來縮減體積,不過每一組存的仍然是完整的 Key 與 Value,這類做法雖然讓快取變小,效果卻比不上 MHA(來自 V2 論文)。
壓縮至低維潛在向量
但是 MLA 採取了不同的處理方式,不再只是減少 Key 與 Value 的組數,而是引入低秩壓縮機制。在計算注意力之前,模型先透過投影矩陣,將隱藏狀態壓縮成維度小得多的低維潛在向量(latent vector)。
到了自回歸生成階段,顯存中不必再為每個注意力頭保留完整的 Key 與 Value,而是只需要儲存這個緊湊的潛在向量,另外再加上一小段帶有位置資訊、所有頭共用的 Key。當新的 token 需要計算注意力分數時,直覺的做法是把潛在向量還原成每個頭的 Key 與 Value。不過 V2 的論文則說明,還原用的矩陣可以事先併進 Query 和輸出的矩陣裡,所以推論時其實不必把 Key 和 Value 重新算出來,也就省下了這段重複的計算。
實際推論時的影響
這種結構大幅減輕了長文本生成時的記憶體壓力。當每個 token 佔用的快取空間縮小,相同的顯存容量就能支撐更長的文件輸入,或是提高系統並行處理的吞吐量。
而且這是從架構層面縮小快取,並不和數值量化衝突,DeepSeek 在 V2 就兩個一起用(KV 快取平均量化到 6 bits)。至於效果,V3 的報告則說明能和標準的 MHA 維持相近的表現。最後說明,這篇是根據 DeepSeek-V3 公布的架構資料整理而成,提供給想了解大型模型推論優化方向的朋友參考。
