單GPU實現LLM多LoRA微調
論文標題:ASPEN: High-Throughput LoRA Fine-Tuning of Large Language Models with a Single GPU
論文地址:??https://arxiv.org/abs/2312.02515??
論文翻譯https://arxivtools.blob.core.windows.net/xueshuxiangzipaperhtml/2023_12_6/2312.02515.pdf
參考代碼:https://github.com/TUDB-Labs/multi-lora-fine-tune
摘要
基于transformer的LLM在不同領域表現出出色的性能,特別是針對特定領域進行微調時。微調LLM所需的資源可以通過低秩自適應(LoRA)等高效參數微調方法來節省。雖然LoRA有效減少了計算負擔和資源需求,但它目前僅支持單作業微調。
本文提出了ASPEN,一個高吞吐量的LLM微調框架,其利用共享的預訓練模型和自適應調度,使用LoRA在單個GPU上有效地訓練多個作業。實驗表明,ASPEN在NVIDIA A100 80 GB GPU上訓練多個LLaMA7B模型時,可節省53%的GPU顯存,在不同GPU上訓練各種預訓練模型時,吞吐量比現有方法提高約17%。自適應調度算法將周轉時間減少24%,端到端訓練延遲減少12%,對作業進行優先排序并防止內存不足問題。
1. 引言
LoRA不僅廣泛用于LLM中的微調任務,而且還實現了與全參微調相當的精度。基于LoRA微調的極輕量級性質進一步允許在單個GPU上訓練多個LoRA模塊。直觀地說,在多個LoRA模塊之間共享預訓練的模型訓練應該會帶來相同的好處,例如減少GPU內存使用和提高計算效率。然而,直接的共享方法-例如,在訓練多個LoRA作業時,僅切入/切出LoRA模塊,同時將預訓練的模型保留在GPU內存中-可能會引入額外的開銷,這可能是次優的。此外,當前基于LoRA的微調系統,如AlpacaLoRA,主要集中在優化單作業微調,并沒有徹底研究微調多個作業的有效策略。
圖2
本文提出了ASPEN,一個高吞吐量的微調框架,旨在在單個GPU上訓練多個LoRA微調作業。其基于BatchFusion-一種新型并行微調方法,該方法通過將多個輸入批次融合到單個批次中,實現了多個LoRA微調作業的并發訓練和預訓練模型的共享。為多個作業有效地分配系統資源是一項復雜的任務。因此,ASPEN結合了一個細粒度的,高效的作業級調度器來處理多個LoRA作業,成功地解決了以下關鍵問題:
BatchFusion過程中,當訓練數據長度變化時,對齊是必要的,并通過填充token來匹配迭代中最長數據的長度來實現。圖2(a)為批次融合的示例,其中填充令牌占了很大比例,導致整體吞吐量效率較低。雖然這些填充令牌不會直接影響模型性能,但會導致計包含它們會導致算效率低下。ASPEN的一個關鍵目標是通過設計有效的填充策略來提高有效吞吐量,從而減輕可變數據長度引起的計算效率低下。
在資源有限的單個GPU上訓練多個LoRA微調作業需要有效的資源管理。如圖1(左)所示,根據損失或準確率趨勢,應提前終止J2和J3,因為繼續運行這些作業獲得的收益最小,同時消耗寶貴的計算資源,而不會帶來顯著的收益。此外,最大化資源使用還需要限制訓練錯誤。例如,并發運行太多作業可以最大限度地利用資源,但存在內存不足風險,為每個作業動態分配資源(如GPU內存)至關重要,但在調度期間預測確切的內存需求具有挑戰性。ASPEN通過開發精細的模型來克服這些挑戰,1)預測作業何時不太可能提前終止,2)估計運行作業的內存需求,避免內存不足錯誤。
了評估ASPEN,我們微調了幾個LLM,包括LLaMA-7B/13B ,ChatGLM2 - 6B 和LLaMA2 7B/13B 。實驗結果肯定了ASPEN在優化GPU利用率、GPU內存使用率和單個GPU訓練吞吐量方面的效率。當與Huggingface的PEFT(AlpacaLoRA ,QLoRA 等采用的領先的參數高效微調庫)相比時,吞吐量顯著增加,提升高達17%。本文貢獻如下:
- 引入了Multi-LoRA Trainer,在LLM的微調過程中,通過BatchFusion方法實現了預訓練模型權重的高效共享。
- 提出了自適應作業調度算法,該算法從作業中收集各種度量,能夠準確估計模型的性能和資源利用率,最大限度地提高系統效率。
- 與最先進的LoRA訓練系統相比,ASPEN有效地利用了計算資源,從而提高了訓練吞吐量并減少了訓練延遲。在NVIDIA 100 80 GB GPU上訓練多個LLaMA-7B模型時,節省53%的GPU內存,并在不同GPU上使用各種預訓練模型進行訓練時,與現有方法相比,吞吐量提高約17%。
2. 背景和動機
圖3
- 微調預訓練模型需要大量資源
- 作為最先進的PEFT技術之一,LoRA 通過完全凍結預訓練模型并通過可訓練的低秩分解矩陣引入權重修改來實現有效的微調
- 機會:共享預訓練模型。當使用相同的預訓練模型訓練多個LoRA微調作業時,在所有作業之間共享預訓練模型似乎可以直觀地節省保存GPU內存。實現這一點的一種簡單方法是只交換每個作業的低秩矩陣A和B,同時將預訓練的模型保留在GPU內存中。通過這種方式,多個作業被單獨和順序地訓練,同時共享相同的預訓練模型。盡管簡單,但按順序訓練多個LoRA作業在資源利用率和訓練性能方面可能不是最有效的方法。我們注意到,每個矩陣乘法和加法運算產生的內核啟動成本在整個訓練執行時間中起著重要作用。此外,我們觀察到,如果可以并行訓練多個LoRA作業,如圖3(b)所示,通過在將其與共享的預訓練模型權重相乘之前將各個作業的訓練數據“合并”到一個大矩陣中,可以顯著減少矩陣乘法的數量(即降低啟動成本)。受這些啟發,我們提出BatchFusion。
- 挑戰:最大限度地利用資源。雖然訓練多個LoRA作業可以更有效地使用計算資源并減少訓練開銷,但在內存資源有限的情況下,同時運行所有作業通常是不可能的。如何調度作業的運行順序,以最大限度地利用計算資源,提高系統的性能,是一個挑戰。與其他作業調度算法不同,在基于lora的場景下 使用多個作業進行調優,可以提前估計每個作業的內存使用情況。此外,早停預測模型使作業的運行時間可預測。這就需要一種更適合管理LoRA微調作業調度的調度。
3. 系統概述
圖4
如圖4所示,ASPEN由三個主要組件組成:
- 1個可以處理多個LoRA微調作業的自監督語言模型訓練器,稱為Multi-LoRA Trainer
- 1個分析器,收集正在運行作業的各種指標,并為這些指標生成估計結果
- 1個作業調度程序,可以根據分析器的估計結果和用戶需求選擇調度策略
ASPEN的微調工作流程:
- 如圖4所示,用戶向ASPEN發起請求,提供超參數配置、訓練數據和調度目標,其中包括最小化等待時間、減少周轉時間、最大化吞吐量等,如§5所述。隨后,ASPEN基于此信息生成多個候選作業,并在系統初始化期間在Profiler中為每個作業配置預估的基本參數。
- 系統初始化后,Scheduler從候選人中選擇一個作業子集,將其與用戶定義的調度目標相匹配,并將其提交給MultiLoRA Trainer進行并發訓練。Multi-LoRA Trainer 向Profiler提供訓練作業的性能指標以進行估計。這些步驟的迭代構成了一個訓練周期,重復直到所有候選作業都完成訓練。
- 如果在訓練過程中出現新的請求,ASPEN會根據請求中提供的信息異步生成候選作業。隨后,Profiler為每個作業配置估計的基本參數。然后在下一次迭代開始之前更新候選作業集,確保訓練過程無縫地包含最新的輸入。
4. Multi-LoRA Trainer
4.1 Batch Fusion
本文提出了一種新的BatchFusion技術,用于在訓練多個LoRA微調作業時更有效地共享預訓練模型,如圖3(b)所示。BatchFusion在每次訓練迭代之前將來自多個微調作業的訓練數據融合到一個批次中;因此,多個LoRA模塊可以共享相同的預訓練模型,并在每次迭代中并行參與訓練(而不是順序或單獨訓練)。這樣有2個好處:1)它通過避免微調作業之間的頻繁交換和減輕模型切換開銷來并行化微調過程。2)它通過降低內核啟動成本,進一步優化GPU資源的使用,從而提升整體計算效率。
具體來說,Multi-LoRA Trainer有助于在同一GPU上并行執行多個微調作業。在形式上,設Fusion表示BatchFusion過程,其中,Concat表示矩陣的拼接操作,該操作與矩陣拼接類似,但是我們添加了額外的填充標記來確保維度對齊,以及額外的信息來識別輸入數據屬于哪個LoRA模塊。
給定輸入作業的第i個作業 ,輸出是?. 批次融合矩陣為 = (1,...,),它將與預訓練的權重和所有LoRA模塊權重相乘,然后將各個結果相加以產生最終輸出.
4.2 成本分析
- GPU內存成本:并行運行時,BatchFusion減少了為每個作業復制預訓練模型權重的需要。比如訓練k個作業, 預訓練模型大小 nGB,可以節省(k-1) nGB
- GPU計算成本:在GPU計算中,在每個操作之前,需要啟動內核以執行矩陣乘法和加法,并且與此內核啟動相關聯的開銷可能是很大的。將多個小內核融合到一個大內核中,可以通過節省內核啟動成本來降低整體計算成本;它可以有效地降低大約30% - 50%的理論內核啟動成本
4.3 數據對齊和填充
如圖2(a),其中描述了四個微調作業,每個作業的批大小為2,總共有六個訓練數據點。這些數據點的長度各不相同,最長的是六個單位。為了對齊數據長度,將填充標記附加到較短的數據點。因此,這導致計算資源的使用效率較低。
形式上,我們引入了填充比的概念,表示為,表示一個批次中填充token的比例。對于共享相同輸入訓練數據的微調作業,例如超參數搜索場景,每個作業的訓練輸入數據都是相同的,因此,不需要引入填充標記,該值為0;另一方面,在涉及解決不同領域問題的微調作業的場景中,每個作業將使用不同的訓練集,這些數據集可能具有不同的長度分布,每次迭代中訓練數據的長度會有所不同,導致更高的填充比,我們的目標是在提高有效吞吐量的同時,降低填充比。
我們引入了OptimalBatch算法來最小化訓練數據集中的填充比。最優批處理算法在訓練過程的每次迭代中執行以下關鍵步驟:首先,它根據訓練數據的長度對每個作業進行排序。接下來,它從每個作業中選擇最短或最長的訓練數據。最后,它使用BatchFusion操作(如第4.1節所述)來組合這些選定的訓練數據。然后,這些融合數據將被送入Multi-LoRA Trainer進行處理。
圖5
然而,這種方法面臨兩個主要挑戰:1)使用排序數據訓練模型可能導致模型性能收斂問題。如圖5所示,可以觀察到兩條不同的損失曲線。左邊的異常曲線表現出波動行為,沒有顯示出明顯的收斂趨勢,與右邊的穩定和收斂曲線形成對比。2)實現此方法需要將所有作業存儲在GPU內存中,以確定最佳的GPU解決方案。在內存受限的環境中,尤其是在管理大量作業時,可能導致內存不足。
改進方案:
圖6
圖6顯示了一個示例,其中只能容納兩個作業。雖然 FIFO 是一種常見的調度方法 ,但它在融合批次中會產生四個填充標記。相比之下,MinPad算法 ( 本文方法)將其簡化為只有一個。觀察:在處理大量候選作業時,為同一批次選擇數據長度分布相似的作業可以降低填充率,從而提高有效吞吐量。
基于此,我們提出了MinPad 算法,以解決 BatchFusion 引起的填充問題:它首先確定可以同時訓練的最大作業數M 。在每次迭代之前,它會查看每個作業的數據, 并選擇 M個填充令牌最少的訓練數據。MinPad執行順序與訓練數據長度的分布相關聯,保證了最小填充率,最大化有效吞吐量,避免了排序導致的訓練過程的不收斂,但不考慮作業的優先級、周轉時間和等待時間。FIFO算法通常用于管理作業優先級 ,但這種方法不考慮訓練數據長度的分布,可能會增加填充率并降低吞吐量。
5 作業調度器
5.1 優化訓練吞吐量
見4.3
5.2 早停和吞吐量建模
在模型訓練過程中,如果模型的性能變差或保持不變, 可以采用提前停止來提前終止訓練 。這種方法避免 等待完成所有訓練數據,從而減少了不必要的計算成本。如圖1 所示,左下角顯示了訓練期間四個作業的性能。在計算 J2 的損失值時,會發生NaN錯誤。如果繼續訓練,該錯誤將再次出現,導致模型性能異常,浪費計算資源。J3 和 J4使用各種指標來決定何時提前停止。每次迭代后,都會使用測試集評估其準確性。J3的準確率在訓練過程中穩步下降,表明進一步的訓練不會提高性能,只會浪費資源。因此,可以提前停止。
5.3 微調內存使用情況建模
圖7
如圖2(b)所示,在模型訓練過程中,數據分布不均勻,不同的輸入數據長度會導致不同的 GPU 內存要求。圖7的左列顯示,我們將每個作業的批處理大小固定為 24, 然后調整輸入數據長度,以確定在 48GB GPU 上可以運行而不會遇到內存不足的最大作業數。因此,假設我們知道作業在每個步驟中使用的資源量, 就可以動態調整可以并發運行的作業數。
5.4 自適應作業調度
- SJF-最短工作優先算法
6 評估
- 本文建立了常用的單任務LoRA微調系統,即Alpaca-LoRA ,作為基線方法。AlpacaSeq:在單個GPU上依次訓練模型;Alpaca-Parallel:在單個GPU上同時訓練多個模型。
- 在端到端性能實驗中,本文使用相同的數據集來訓練四個具有不同學習率的LoRA模型,監控每秒訓練的token和填充token的數量,并計算有效吞吐量和無效吞吐量。
圖8(灰色-無效吞吐量:a-不同模型;b-不同參數;c-不同硬件)
圖9
圖11
- 我們比較了四種不同的調度策略對系統的影響:
- MinPad算法-M3;FIFO算法-M1;優先級調度算法-M2;自適應調度算法- 4
- 感覺整體思路是不錯的,如果模型占用顯存小,利用率低的話可以同時多lora訓練 或者用不同lora配置來搜索合適的超參;作者應該是實踐其中的一部分,不同數據集不同lora實驗沒有,同一數據集不同lora的實現見 - https://github.com/TUDB-Labs/multi-lora-fine-tune
本文轉自 AI生成未來 ,作者:龜殼
原文鏈接:??https://mp.weixin.qq.com/s/zGRlay0-V88iIOKk5xkdBw??
