大模型的全參數微調對資源要求非常高,當前業界更傾向于采用LoRA,Parallel Adapter等參數高效微調(PEFT)方法,通過添加只占用LLMs全部參數很小部分(例如,0.1%)的可訓練模塊,損失小部分精度以換取低資源高效率的微調。
但對于問答(QA)等知識密集型任務來說,當可訓練參數受限時,性能下降較爲顯著。如下圖所示,相比全參數微調,其他PEFT方法下降10%左右。
![](http://image.uc.cn/s/wemedia/s/upload/2024/c010ff9a949aac32fbc370809e7be61e.jpg)
但我們也從中發現,在Parallel Adapter中隨著適配器參數數量的增加,答案准確率呈現出明顯的上升趨勢。大約需要更新10%的參數,可以達到全量微調的性能。但這一方案需要遠超24G的GPU內存支持,這在實際應用中仍然面臨較高的資源成本。
3.5研究測試:hujiaoai.cn4研究測試:askmanyai.cnClaude-3研究測試:hiclaude3.com
今天我們介紹一篇來自山東大學的研究,在可訓練參數增加的同時顯著降低了GPU內存使用,可實現僅需1塊3090(24G)訓練7B大模型。並且在保持相近性能的同時,相比其他PEFT方法,內存占用率下降了50%。
論文標題:MEFT: Memory-Efficient Fine-Tuning through Sparse Adapter
論文鏈接:https://arxiv.org/pdf/2406.04984
前置知識:Parallel Adapter本文是在Parallel Adapter基礎上開展的研究,因此需要先簡單了解一下該方法。
在Transformer中,FFN(前饋神經網絡)起著關鍵值記憶的作用,其中每個鍵對應一種文本模式,每個值則指導輸出詞彙的分布。基于這一發現,Parallel Adapter通過爲下遊任務定制特定的知識記憶來擴展原始FFN。Parallel Adapter將adapter與FFN並行放置,adapter由兩個線性變換矩陣和以及ReLU非線性激活函數組成。其計算過程可以表述爲:
![](http://image.uc.cn/s/wemedia/s/upload/2024/fbd1865723e21aab02bdb13ed0dcaa91.jpg)
Parallel Adapter中並不是每一個神經元都有作用,即存在稀疏性。作者在Natural Questions數據集上訓練了一個瓶頸大小爲4096的並行適配器模型。然後在測試集(包含4000個tokens)上提取了適配器的FFNs層的激活,並計算了平均激活值與累積激活值。如下圖所示:
![](http://image.uc.cn/s/wemedia/s/upload/2024/34c46ee26c89a78efd1e8e4d33d3af25.jpg)
可以看到,適配器中的激活非常稀疏,即只有部分神經元對模型預測有重大貢獻,而大部分神經元未被激活。根據這一觀察,本文考慮在訓練時僅複制這些重要參數,從而減少CPU-GPU通信量和內存使用。
接下來,我們來看看作者是如何激活重要參數的。
方法![](http://image.uc.cn/s/wemedia/s/upload/2024/9c15522933ad1b0b475f3b4a35fe3cd2.jpg)
總的來說,本文提出的MEFT方法如上圖所示。虛線將參數分成兩部分,左側爲GPU,右側爲CPU。大多數可訓練的參數將分配給CPU。在前向傳播階段,注意力塊的輸出將被高效地傳遞給CPU,使用類似于moe的結構來檢索與當前環境高度相關的神經元,將激活神經元將傳輸到GPU。在反向傳播期間,將梯度傳輸到CPU並更新設置CPU參數。
1. 稀疏激活FFN塊內因ReLU或GELU激活函數存在上下文稀疏性,進一步導致了稀疏梯度。因此本文探索了稀疏Adapter訓練,僅更新高激活神經元。在前向計算中,FFN層基于與中個最相似鍵進行激活:
![](http://image.uc.cn/s/wemedia/s/upload/2024/be08297ee172c03a5e11c78be9a9b1dd.jpg)
其中, 表示所選鍵的索引,然後在CPU上使用相關的索引構建和W_B^K
W[·]表示從矩陣W中提取相應值的索引操作。目標是從W_A和W_B中分別提取相關的鍵和值。接著將W_A^K和W_B^K$ 移動到GPU作爲複制適配器,然後作爲加寬的FFNs進行計算。
![](http://image.uc.cn/s/wemedia/s/upload/2024/4dc8e8fd7c632c5555d2f8880b9a13d9.jpg)
在反向傳播中,僅更新激活神經元的梯度,因爲未激活神經元不參與FFNPA的計算。通過保留大部分Parallel Adapter參數在CPU內存中,並在每次FFN計算前僅將激活神經元臨時複制到GPU內存。由于K遠小于總神經元數r,且激活比例通常低于5%,這一策略非常高效,可以顯著節省GPU資源。
2. Key-Experts機制在稀疏激活中,檢索最相似權重的TopK操作在CPU上。考慮到當r較大時,給CPU較低的TFLOPs可能成爲計算速度的瓶頸。作者進一步提出Key-Experts機制,提高計算效率。
該機制基于MoE的思想,權重和被劃分爲個專家,並使用一個路由器將輸入導向特定的專家。每個專家是一個包含和的FFN。對于輸入的token,路由器計算每個專家被選中的分數:
![](http://image.uc.cn/s/wemedia/s/upload/2024/a246c96c2edec535409a76c4d3ef5501.jpg)
然後選擇得分最高的K位專家,將這些選定專家的權重連接到和上:
![](http://image.uc.cn/s/wemedia/s/upload/2024/417f9deed16707ec296469368d87a39a.jpg)
選取前k個鍵值對,得到,,按照下列算法所示計算FFNPA(h)。
![](http://image.uc.cn/s/wemedia/s/upload/2024/247a0065c2514c6e033bf68fc3aa01f9.jpg)
雖然該方法通過僅將激活的神經元部分放置在GPU上,可以減少GPU內存使用,但CPU與GPU之間的通信以及CPU計算可能會導致GPU等待。作者分析了該方法的通信量和計算複雜度。
通信量CPU與GPU之間的參數通信分爲前向傳播和反向傳播兩部分。
前向傳播。對于每一層,隱藏狀態h需要從GPU傳輸到CPU,這導致了B×l×d的通信開銷。在參數選擇後,大小爲2×d×β×K的激活參數會從CPU傳輸到GPU。這裏,B表示批次大小,l表示批次中序列的長度,β是一個與l相關的稀疏因子。反向傳播。對于每一層,GPU上計算得到的激活參數的梯度被移動到CPU,用于更新CPU端的對應參數。因此,通信量大小等于激活參數的大小,即 2 × d × β ×K。因此,模型訓練的總通信開銷爲:
![](http://image.uc.cn/s/wemedia/s/upload/2024/421a8982a2cf42d1301397f506dd4095.jpg)
在CPU上的額外計算包括路由器上的計算和TopK操作。根據提出的Key-Experts機制,CPU上的複雜度爲 。因此,當 N 接近時,能達到最優計算複雜度 , 顯著降低了計算量,非常適合在CPU上執行。
實證結果當使用LLaMA-7B作爲基礎模型,配置爲6144的鍵值對大小、批量大小爲2、序列長度爲256時,每批的雙向通信量約爲0.56M次(M代表LLaMA-7B的總可訓練參數數)。相比之下,采用deepspeed-offload的Parallel Adapter在相同規模下,每次叠代需要2M的通信量。因此,本文方法在GPU-CPU通信上減少了3.57倍。
在訓練效率方面,本文方法相比排除額外通信和CPU計算時間的基線,實證結果顯示至少提高了63%的效率。
主要實驗結果下表列出了主要結果。在知識密集型任務(如NQ、SQuAD和Tool)中,MEFT方法在24GB GPU內存限制下顯著優于其他PEFT方法。這一提升得益于在有限GPU容量內有效利用了更高的可訓練參數比例(即10%)
此外,MEFT在性能上與其他同樣包含10%可訓練參數的PEFT方法相當,但僅消耗50%的GPU內存,甚至可與全參數模型微調媲美,顯著提高了資源利用效率。對于非知識密集型任務如GSM8k,MEFT的稀疏訓練策略也展現出不減損性能的穩健性。
![](http://image.uc.cn/s/wemedia/s/upload/2024/14c58c2e0bfa04ee9a42d205b1f2d76b.jpg)
▲VRAM代表訓練所需的GPU內存。Param顯示模型中可訓練參數的百分比。Base Model表示原始模型在任務上的zero-shot性能。
稀疏激活機制是否真的有用?爲了減輕CPU的計算負擔,本文中使用類似MoE機制。但實驗結果表明,這種機制並不是性能提升的主要原因。如下圖所示:
![](http://image.uc.cn/s/wemedia/s/upload/2024/9be4721c66ad81bc29421d4ddd5cca9d.jpg)
參數對知識密集型任務影響甚微,甚至在SQuAD和ToolBench上提高了性能。brutal offload指的是CPU和GPU之間參數的直接交換。然而,在邏輯成分較強的GSM8k任務上,性能略有下降。這表明邏輯任務可能並不需要大量的參數。
效率分析下圖展示了在RTX 3090 GPU和32核CPU(支持AVX)的服務器上每批次訓練的延遲。
![](http://image.uc.cn/s/wemedia/s/upload/2024/e40624f8f7e6464dd9a45b54a919e645.jpg)
圖中通過消融研究比較了數據傳輸、CPU計算和GPU計算的訓練時間。其中,“"MEFT w/o both”代表將所有可訓練參數移至CPU計算,導致了最高延遲;“MEFT w/o Sparse”移除了稀疏激活,但通過PCIe優化傳輸必要神經元,降低了數據傳輸時間,提高了GPU效率;“MEFT w/o KE”采用MoE方法管理參數,減少計算負載但涉及完整參數傳輸;而“Parallel Adapter”則在GPU上執行所有操作,實現最低延遲。
超參數選擇由于下遊任務的性能可能受到衆多參數的影響,本文在模型上測試了各種超參數設置。
額外鍵值對的數量前文面對知識密集型任務時,通常需要增加額外的參數數量。作者SQuAD和ToolBench數據集上測試了Parallel Adapter的性能,如下表所示,結果顯示不同數據集對額外參數的需求存在差異。
![](http://image.uc.cn/s/wemedia/s/upload/2024/6ee175c7d9bb4c468a67e311d2296bb5.jpg)
在SQuAD上,隨著參數數量的增加,性能穩步提升;然而,在NQ上,每層添加3072個鍵值對時性能最佳,而ToolBench的最佳性能則出現在每層僅添加1024個鍵值對時。
激活的鍵值對數量。作者研究了限制token可以激活的鍵值對的數量對模型最終性能的影響。如下圖所示:
![](http://image.uc.cn/s/wemedia/s/upload/2024/cc6dcd720e5c5c4919d9210fb64ba0b4.jpg)
當選擇適當的 K 值時,訓練過程中人爲添加稀疏約束並未顯著影響模型性能。而且,當單個token激活的參數比例低于3%時,顯示出合格的性能。
Key-Experts的數量這裏指的是的分區。當每層的Key-Experts數量等于額外的鍵值對數量時,每個神經元屬于獨立的專家,相當于不使用MoE分區。
下圖所示的結果與這一理論相符:專家數量越多(即分區越多),結果越好。
![](http://image.uc.cn/s/wemedia/s/upload/2024/ba1d392eda01ff20626f96cf1beccd0c.jpg)
同時,我們發現即使專家數量較少也能獲得良好的結果。例如,當專家數量爲1時,檢索相關神經元的過程可以看作是與路由器的第一次點乘。此時,所有的神經元都處于專家狀態E0,在某種程度上相當于有r個分區。
結論本文發現隨著參數的增加,Parallel Adapter可以提升在知識密集型任務上的性能,但伴隨著較高資源消耗。爲了節約資源,本文提出一種利用稀疏激活和MoE的內存高效訓練方法,顯著降低了對GPU內存的需求,並減輕其計算壓力。這一創新不僅降低了訓練成本,也爲大模型的高效微調提供了新的可能性。
![](http://image.uc.cn/s/wemedia/s/upload/2024/70a87c63d4ef209645ed4d8cf0c6c2d9.png)