70%大小,100%準確!完美壓縮LLM效能0損失,推理速度最高飆升39倍

MLNLP社群是國內外知名的機器學習與自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
社群的願景是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流和進步,特別是初學者同學們的進步。
來源 | 新智元
編輯 | 犀牛 好睏
人人都想有一個自己的DeepSeek,但並不是人人都有「一打」96GB視訊記憶體的H20。
雖然量化可以極大地降低模型對於視訊記憶體的需求,但它本質上是一種有失真壓縮技術。
換句話說就是,量化模型的輸出分佈不可避免地會受到影響,進而降低LLM的準確性和可靠性。
為此,來自萊斯大學等機構的研究人員提出了一種全新的無失真壓縮框架——動態長度浮點數(DFloat11),它能夠將LLM的大小減少30%,同時確保輸出結果與原始模型逐位相同。
論文地址:https://arxiv.org/abs/2504.11651
為了支援使用動態長度編碼進行高效推理,團隊專門開發了一個定製的GPU核心,用於實現快速的線上解壓縮:
1. 將記憶體密集型的查詢表 (LUT) 分解為更緊湊的LUT,使其能夠完全放入GPU的SRAM中;
2. 一個雙階段核心,利用輕量級的輔助變數來協調執行緒的讀寫位置;
3. Transformer Block級的解壓縮,從而最大限度地降低延遲。
在Llama-3.1、Qwen-2.5、Gemma-3等SOTA模型上的實驗表明, DFloat11除了能有效壓縮模型的大小之外,同時還能保持完全一致的輸出結果。
與將模型的部分資料解除安裝到CPU的方案相比,DFloat11在Token生成任務中實現了1.9到38.8倍的吞吐量提升。
在GPU視訊記憶體固定的情況下,DFloat11能夠支援比未壓縮模型長5.3到13.17倍的上下文長度。
特別值得一提的是,DFloat11成功地實現了Llama-3.1-405B(810GB)在單節點上(8塊80GB GPU)的無損推理。
Llama-3.1-405B擁有4050億引數,採用16位Brain Float(BFloat16)格式,需要約810GB記憶體才能實現完整推理,超過了典型GPU伺服器的容量(如配備8×80GB GPU的DGX A100/H100)。
本文一作Tianyi Zhang,是萊斯大學計算機科學專業的博士生,之前在滑鐵盧大學獲得計算機科學學士學位。

為什麼要對LLM進行無失真壓縮?

在目前的有損量化技術中,模型通常被壓縮到更低的位寬度(如8位或4位)。

雖然部分基準測試表明,8位量化是一種相對「安全」的壓縮方案,但在實際體驗時終究不如無損的模型。
例如,LLM Arena上的人工評估顯示,Llama-3.1-405B-Instruct及其8位版本(Llama-3.1-405B-Instruct-FP8)之間的效能存在顯著下降,尤其是在編碼和長查詢任務中。
類似的,將DeepSeek-R1-Distill-Llama-70B從16位量化到8位會導致GPQA上的效能下降23.7%(從9.51%降至7.25%)。
此外,推理作為現代LLM的核心能力,似乎對壓縮損失特別敏感。
一些基準測試表明,使用8位SmoothQuant(用於權重、注意力和KV快取)量化的DeepSeek-R1-Distill-Qwen-1.5B,會在AIME、MATH-500、GPQA-Diamond和LiveCodeBench等資料集上的推理效能,平均下降9.09%(從48.82%降至44.29%)。
有失真壓縮降低質量,無失真壓縮缺乏效率
相比之下,無失真壓縮技術在有效減小大規模LLM大小的同時,能夠保留其精確的原始權重,確保模型的輸出分佈與未壓縮表示(例如BFloat16)的輸出分佈完全一致。
然而,現有的無失真壓縮方法主要側重於提高LLM的儲存效率,例如縮小模型檢查點,或者最佳化諸如FPGA等專用硬體的效能。
這些方法雖然有利於訓練過程中的高效檢查點回滾,或者從Hugging Face等模型倉庫加速下載,但其優勢通常難以有效地擴充套件到基於GPU的LLM推理。

實驗方法

為了推動LLM權重的無失真壓縮,團隊分析了最新LLM權重中BFloat16各個組成部分(符號、指數和尾數)的可壓縮性。
具體來說,團隊使用夏農熵來量化LLM線性投影矩陣中引數的資訊量。夏農熵H(·)定義如下:
其中X是一個離散隨機變數,其所有可能取值的集合為χ,p:χ→[0,1]表示其機率質量函式。
如圖1所示,符號和尾數部分的熵值與其對應的位寬接近,說明它們的可壓縮空間不大。相比之下,指數部分的熵值明顯較低,只有約2.6位,但其分配的位數為8位,這意味著無失真壓縮存在很大的機會。
無損LLM壓縮框架,實現高效GPU推理
為了解決LLM權重在BFloat16表示中存在的巨大資訊冗餘問題,團隊提出了一種利用熵編碼來對浮點引數進行編碼的無失真壓縮框架——DFloat。
首先,基於LLM線性投影矩陣中所有BFloat16權重的指數分佈構建一個Huffman樹。
然後,使Huffman編碼壓縮指數部分,同時保留原始的符號位和尾數。
指數被編碼後,緊密地打包到EncodedExponent位元組陣列中,而符號位和尾數則保持未壓縮狀態,儲存在另一個PackedSignMantissa位元組陣列中。
動態長度浮點數格式可以緊湊地表示浮點模型引數
使用緊湊LUT實現高效解碼
由於Huffman編碼可以透過機遇查詢表(Lookup Table,LUT)的方法有效地解碼,於是團隊構建了一個大小為2^L的LUT,其中L是碼本中任何Huffman編碼的最大位長度。
為了進行解碼,團隊從編碼的位流中讀取接下來的L位,並將它們作為LUT的索引來獲取下一個解碼後的符號。
為了解碼DFloat11格式的指數,限制每個模型的最大程式碼長度L為32位。
對於那些L大於32的模型,團隊透過將最不常見的指數的頻率降低到1並重新構建Huffman樹來強制滿足長度約束。
如此,便會在Huffman樹的尾部產生一個更加平衡的結構,為最稀有的指數分配相同長度的程式碼,並將最大程式碼長度縮減到3位。
然而,當L=32時,直接使用查詢表將需要232≈42.9億個條目,這將消耗巨大的記憶體。
為了解決這個問題,團隊提出將這個龐大的LUT分割成四個互不相交且節省記憶體的查詢表——LUT1、LUT2、LUT3和LUT4
這樣一來,記憶體佔用就可以完全放在GPU SRAM中,從而實現快速訪問。
兩階段Kernel和輕量級輔助變數
為了能夠對DFloat11格式中經過熵編碼的指數進行大規模並行解碼,團隊為每個執行緒分配一段固定長度的、來自編碼序列的位元組來進行處理。
然而,這種方法會帶來兩個主要的挑戰:
1. 由於Huffman編碼的位寬是可變的,並且編碼後的資料是被緊密地打包在一起的,因此每個執行緒開始解碼的起始位位置並不明確。
2. 除了第一個執行緒之外,其他執行緒所要解碼的元素的索引是未知的,這導致難以確定用於儲存解碼結果的正確輸出位置。
為了解決第一個問題,團隊使用一個間隙陣列來確定每個執行緒的起始位位置。
這個間隙陣列Gaps為每個執行緒包含一個條目,每個條目都指定了相對於該執行緒所分配的起始位元組,第一個有效Huffman編碼的位偏移量。由於最大程式碼長度為32位,因此每個偏移量的值都在[0,31]範圍內。為了保證記憶體效率,團隊使用5個位來編碼每個條目。
為了解決第二個問題,最直接的方法是維護一個數組,用於儲存每個執行緒所解碼的第一個元素的輸出位置。然而,這種方法會帶來巨大的儲存開銷。
為了減少儲存開銷,團隊只儲存每個執行緒塊中第一個元素的輸出位置,而不是儲存每個執行緒的輸出位置。
為了能夠使用塊級的輸出位置資訊進行解碼,團隊採用了一種兩階段的Kernel設計。
在第一階段,一個執行緒塊內的所有執行緒並行地解碼分配給它們的那部分編碼序列,但是並不將任何輸出結果寫入到全域性記憶體中。取而代之的是,每個執行緒會計算它將要解碼的元素的數量。
完成這一步之後,團隊同步同一個執行緒塊內的所有執行緒,並透過計算字首和來確定每個執行緒的輸出位置,計算字首和的起始位置是該執行緒塊的已知輸出位置。
在第二階段,每個執行緒會重新解碼相同的那部分編碼序列,這一次會將解碼後的結果寫入到HBM中正確的輸出位置。
為了避免在這兩個階段中重複訪問HBM,團隊將編碼後的指數資料載入到SRAM中。
兩階段Kernel的虛擬碼
Transformer Block級解壓縮
至此,就有了一套完整的方法,可以對經過熵編碼的指數進行大規模並行解壓縮。
LLM的權重以DFloat11格式儲存,同時還包含輕量級的輔助資料:執行緒級的間隙偏移量以及塊級的輸出位置,這些資料用於確定每個執行緒的讀取和寫入位置。
在推理過程中,壓縮後的權重資料和這些輔助變數都完全駐留在GPU上。
當需要使用某個權重矩陣進行矩陣乘法運算時,該矩陣會被動態地解壓縮為原始的BFloat16格式。一旦矩陣乘法運算完成,這個BFloat16格式的矩陣會立即被丟棄,以節省GPU視訊記憶體。
在實際應用中,由於單個權重矩陣的尺寸通常相對較小,因此單獨解壓縮一個權重矩陣往往無法充分利用GPU資源。
在DFloat11解壓縮Kernel中,將每個執行緒處理的位元組數設定為n=8,每個執行緒塊中的執行緒數設定為T=256,執行緒塊的數量設定為B=⌈|EncodedExponent|/(nT)⌉,其中|EncodedExponent|表示編碼後的指數資料所佔的總位元組數。
隨著DFloat11格式的權重資料尺寸的增加,會有更多的執行緒塊被利用起來,從而可以提高整體的解壓縮吞吐量。
圖6展示了這種現象,它表明解壓縮的吞吐量會隨著矩陣尺寸的增加而顯著提升。為了充分利用這一特性,研究團隊建議將多個矩陣的解壓縮操作進行批處理,以此來提高吞吐量並隱藏延遲。
更具體地說,可以將單個Transformer Block內的所有DFloat11格式的權重矩陣的解壓縮操作進行批處理。
在Transformer Block中執行任何計算操作之前,團隊首先解壓縮與其相關聯的所有權重資料。這種方法能夠顯著降低解壓縮的延遲,並提高整體的推理效率。
圖5展示了在不同的批處理大小下,使用DFloat11壓縮的Llama-3.1-8B-Instruct模型的延遲細分情況。

實驗結果

DF11將LLM壓縮至70%大小
表2展示了DF11對多種最新LLM的壓縮比率。
壓縮的模型包括LLaMA3/3.1/3.3、Qwen2.5、QwQ、Mistral Nemo/Small/Codestral、Gemma2/3以及DeepSeek-R1-Distilled。
實驗結果顯示,DF11對所有模型的壓縮比約為70%,相當於大約11位的有效位寬。
DF11壓縮完全無損
研究團隊透過一系列標準基準測試驗證了DF11壓縮的無損特性。
評估使用lm_evaluation_harness工具進行,報告了MMLU和TruthfulQA的準確率,以及WikiText和C4的詞級困惑度。
如表3所示,壓縮模型的準確率和困惑度與原始BF16模型完全一致。
為了進一步驗證無損特性,他們將DF11解壓後的BF16權重矩陣與表2中各模型的原始權重矩陣進行比較,確認兩者在位元級上完全相同。
DF11在推理效率上超越CPU解除安裝
研究團隊比較了DF11和BF16模型在不同硬體平臺上的推理效率。
未壓縮的BF16模型通常會超出單個GPU的視訊記憶體限制,而無失真壓縮的DF11模型則不會超出。
對於BF16模型,團隊將模型的大部分內容和計算保留在GPU上,同時將部分元件及其相關計算解除安裝到CPU上。
如圖3所示,DF11模型始終優於採用CPU解除安裝的BF16模型,延遲降低了1.85至38.83倍或吞吐量更高。
DF11支援更長的生成長度
DF11壓縮帶來的視訊記憶體節省不僅減少了推理所需的GPU數量,還支援更長的生成長度。
在推理過程中,KV快取會隨著解碼token數量的增加而線性增長,很快成為GPU視訊記憶體的瓶頸。
圖4展示了在批大小為1時,DF11和BF16模型在推理過程中隨著解碼token數量增加的GPU視訊記憶體消耗情況。
如圖所示,DF11壓縮顯著延長了token生成長度,與BF16模型相比,在達到GPU視訊記憶體限制前能解碼5.33至13.17倍的token數量。

結論

在這項工作中,研究人員提出了動態長度浮點(DFloat)作為一種針對LLM權重的無失真壓縮資料格式。DFloat是目前唯一一種既能減少視訊記憶體佔用又相容高效GPU推理的資料格式。
具體來說,他們使用11位的DFloat格式(DF11)評估了多個熱門LLM,併為此格式開發了定製的GPU核心。
實驗結果表明,基於DF11的壓縮顯著降低了服務LLM的硬體需求,而且在大多數實際應用場景下,它所增加的額外計算負擔也是可以接受的。
參考資料:
https://arxiv.org/abs/2504.11651

技術交流群邀請函

△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群

關於我們

MLNLP 社群是由國內外機器學習與自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名的機器學習與自然語言處理社群,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。


相關文章