如何在GPU資源受限情況下微調超大模型
問題:模型大小超過GPU 容量怎麼辦?
本文的靈感來自Yandex資料分析學院所教授的「高效能深度學習系統」課程。
預備知識:#假設讀者已經了解神經網路的前傳遞和後向傳遞的工作原理,這對理解本文內容至關重要。文中使用PyTorch作為框架。
開始吧!
當試圖使用大型模型(即aka gpt-2-xl),它帶有5億多個參數,而你的GPU 資源受限,無法將它安裝到GPU上運行,或在模型訓練期間無法實現論文中定義的批次大小,此時該怎麼辦?也許可以選擇放棄,使用一個更輕量級版本的模型,或者減少訓練的批次大小,這樣的話,便無法獲得論文中描述的訓練結果。
但是,有一些技巧可以幫助解決上述問題。
下面來討論一些方法,即如何利用這些方法來微調具有15億個參數的GPT-2-XL模型。
問題的核心
#首先,來了解一下將模型載入到GPU中所需GPU記憶體問題的實質。
假設模型有 個FP32(32位元浮點)參數,需要在GPU上訓練這個模型,例如,執行Adam優化器。
透過計算,結果令人震驚。
#假設已有12 GB記憶體的NVIDIA GeForce RTX 3060。首先, 1e9個FP32參數約佔4 GB的GPU記憶體。
同樣,對於梯度,也將保留相同數量的記憶體。所以,總共已經保留了8 GB的內存,由於還沒有開始訓練,也沒有載入優化器,載入優化器也同樣需要一定數量的內存。 Adam優化器需要為每個參數儲存第一備份和第二個備份,即需要8 GB額外記憶體。算下來,必須有大約16 GB的GPU內存,才能正確地將模型加載到GPU上,在本文的例子中,GPU只有12 GB的空閒內存。看起來很不妙,對吧?
然而,可以透過一些方法來嘗試解決這個問題,以下是相關內容:
- 梯度累積/微批量;
- 梯度檢查點;
- #模型並行訓練;
- 管道作業;
- 張量並行化
記憶體卸載;
#優化器8位元量化。
問題:模型比GPU容量大,怎麼辦?
- 簡單模式:無法適配批次大小為1
- 專業模式:參數也沒辦法適應
#概述
#如果模型大於GPU容量,即便將批次大小設為1都不夠,那該怎麼辦呢?有一個解決方案,就是設定梯度檢查點,下面來看看這個概念。對於一個簡單的包含n層的前饋神經網路來說,梯度的計算圖如下:
神經網路層的活化對應於用f標記的節點,在正向傳遞期間,按順序對所有這些節點進行計算。對應於這些層的活化和參數的損失梯度以b標記的節點表示。在反向傳遞期間,所有這些節點都以相反的順序進行計算。 f個節點的計算結果用於計算b個節點,因此所有f個節點在向前傳遞後都保存在記憶體中。只有當反向傳播進展到足以計算出f節點的所有依賴關係時,它才能從記憶體中擦除。這意味著:簡單的反向傳播所需的記憶體隨神經網路層數n的變化呈線性增長。
下面是這些節點的計算順序,紫色陰影圓圈表示在給定時間需要將哪個節點儲存到記憶體之中。
#梯度檢查點
如上所述的簡單反向傳播在運算方面是最優的:它只計算每個節點一次。但是,如果重新計算節點,可能會節省大量記憶體。例如,可以簡單地重新計算每個節點。執行的順序與所使用的記憶體如下圖所示:
這種策略在記憶體方面是最優的。但是,請注意,節點計算的數量進行了n²次縮放,而先前的縮放係數為n:每個n個節點都按n次順序重新計算。由於計算速度較慢,這種方法並不適用於深度學習。
為了在記憶體和運算之間取得平衡,需要提出一個策略,允許重新計算節點,但次數不要太頻繁。在這裡使用這樣一種策略:將神經網路激活的子集標記為檢查點節點。
在本範例中,選取將第sqrt(n)個節點標記為檢查點。這樣,檢查點節點的數量和檢查點之間的節點數量都在sqrt(n)之間,這意味著:所需的記憶體量也按n的順序進行了縮放。此策略所需的額外計算量相當於網路單次前向傳遞所需的計算量。
程式:
梯度累積/微批次
#概述
##深度學習模型正在越變越大,很難在GPU記憶體中安裝這麼大型的神經網路。因此,被迫在訓練時選用較小的批次大小,它可能導致較慢的收斂和較低的準確性。
什麼是梯度累積?在訓練神經網路時,通常會將資料分批量處理,神經網路預測批次標籤,用於計算相對於實際目標的損失。接下來,執行反向傳遞計算出梯度,並更新模型權值。梯度累積對訓練過程的最後一步進行了修正:在繼續下一個小批之前,保存梯度值,並將新的梯度添加到先前保存的梯度中,用這種方法取代更新每個小批的網路權重。只有在模型處理了幾個小批次後,才會更新權重。梯度累積模擬了一個更大的批次大小,如果想在一個小批次中使用64張影像,如果批次大小超過了8,則會報「CUDA記憶體出錯…」。在這種情況下,可以使用8批影像,並在模型處理64/8=8批後更新一次權重。如果你從這8個批次中累積每一個梯度,結果將是(幾乎)相同的,這樣便能夠執行訓練啦!
程式:
#沒有梯度累積的標準訓練環通常為:
在PyTorch中,梯度累積可以很容易完成。模型利用accumulation_steps處理完成小批之後,便可以執行最佳化。也可以利用accumulation_steps根據損失函數的性質來分割運行損失:
#真漂亮,對嗎?當呼叫loss.backward() 時計算梯度,並由PyTorch累積,直到呼叫optimizer.zero_grad()時停止。
重點#某些網路體系結構使用專用的批次運算,如BatchNorm,當使用相同的批次大小時,結果可能會略有不同。
混合精確度訓練
#概述
- ##混合精準度訓練是指將部分或全部FP32參數轉換為更小的格式,如FP16、TF16(浮點張量)或BF16(浮點位元組)。
主要優點
#混合精準度訓練的主要優點是:
減少記憶體使用;
結果,在完成.half()操作之後,模型變小了2倍。將模型轉換為不同的格式(即BF16,TF16)後的縮放損失,將在後續的文章中討論。有些操作在FP16中是無法完成的,例如Softmax。 PyTorch可利用torch.autocast 來處理這些特殊情況。
8位元優化器
#增加模型尺寸是獲得更佳效能的有效方法。然而,訓練大模型時需要儲存模型、梯度和最佳化器的狀態(例如,Adam的指數平滑和及先前梯度的平方和),所有這些都儲存在數量有限的可用記憶體之中。
將32位元優化器降到8位元優化器,將數值的範圍從2³²減少到僅2⁸=256,將對優化器預留的記憶體數量產生巨大的影響。
研究人員提出了一個新的8位元Adam優化器,論文作者在文中這麼說: 「它將32位元的表現維持到部分原始內存中」。
8位元優化器有三個組成部分:(1)區塊級量化,隔離異常值,將誤差均勻分配給每一個位元;(2 )動態量化,高精度地量化小值和大值;(3)穩定的嵌入層,以提高詞嵌入優化模型的穩定性。
有了這些元件,可直接使用8位元狀態執行最佳化。將8位優化器狀態量化為32位,執行更新,然後再將狀態量化為8位元進行儲存。在暫存器中逐元素進行8位到32位的轉換,無需慢速複製到GPU記憶體或額外的臨時記憶體中執行量化和去量化。對GPU來說,這意味著8位元優化器要快於常規的32位元優化器。
來看看使用8位Adam之後,鼓舞人心的結果:
可以看出,使用量化的Adam可以節省大約8.5 GB的GPU內存,看起來相當棒!
了解它的可用性之後,再來看看如何用python實作它。
由Facebook提供的Bitsandbytes 套件是一個圍繞CUDA自訂函數的輕量級包裝器,封裝了8位元優化器和量化函數,利用它可以實現8位Adam的使用。
程式:
#
如上所述,量化優化器的使用非常簡單,結果也不錯。
綜合上述全部方法,對GPU上的GPT-2-XL進行微調。
最後,在掌握了上述方法之後,利用這些方法來解決實際問題,對擁有15億個參數的GPT-2-XL模型進行微調。顯然,無法將它載入到12 GB記憶體的NVIDIA GeForce RTX 3060 GPU之上。列出可以使用的全部方法:
- 梯度檢查點;
- #混合精度訓練(我設了一個技巧:使用相同模型的兩個樣本。首先,用.half將它加載到GPU上,將其命名為gpu_model;其次,在CPU上,將其命名為cpu_model。評估好GPU模型之後,將gpu_model的梯度加載到cpu_model中,運行optimizer. step(),將更新後的參數載入到gpu_model上);
- 使用batch_size=64,minibatch_size=4的梯度累積,需要透過accumulation_steps來縮放損失;
- 8位元Adam優化器。
把上述方法全部利用起來,看看程式碼:
利用上述所有方法之後,在GPU上實現了對16GB的GPT-2-XL模型微調,絕了!
結論
在本博中,給出了高效能使用記憶體的關鍵概念,它適用於多種艱鉅的任務,如上所述。將在後續的文章中討論其他概念。衷心感謝,撥冗閱讀本文!
以上是如何在GPU資源受限情況下微調超大模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

想像一下,一個人工智慧模型,不僅擁有超越傳統運算的能力,還能以更低的成本實現更有效率的效能。這不是科幻,DeepSeek-V2[1],全球最強開源MoE模型來了。 DeepSeek-V2是一個強大的專家混合(MoE)語言模型,具有訓練經濟、推理高效的特點。它由236B個參數組成,其中21B個參數用於啟動每個標記。與DeepSeek67B相比,DeepSeek-V2效能更強,同時節省了42.5%的訓練成本,減少了93.3%的KV緩存,最大生成吞吐量提高到5.76倍。 DeepSeek是一家探索通用人工智

波士頓動力Atlas,正式進入電動機器人時代!昨天,液壓Atlas剛「含淚」退出歷史舞台,今天波士頓動力就宣布:電動Atlas上崗。看來,在商用人形機器人領域,波士頓動力是下定決心要跟特斯拉硬剛一把了。新影片放出後,短短十幾小時內,就已經有一百多萬觀看。舊人離去,新角色登場,這是歷史的必然。毫無疑問,今年是人形機器人的爆發年。網友銳評:機器人的進步,讓今年看起來像人類的開幕式動作、自由度遠超人類,但這真不是恐怖片?影片一開始,Atlas平靜地躺在地上,看起來應該是仰面朝天。接下來,讓人驚掉下巴

本月初,來自MIT等機構的研究者提出了一種非常有潛力的MLP替代方法—KAN。 KAN在準確性和可解釋性方面表現優於MLP。而且它能以非常少的參數量勝過以更大參數量運行的MLP。例如,作者表示,他們用KAN以更小的網路和更高的自動化程度重現了DeepMind的結果。具體來說,DeepMind的MLP有大約300,000個參數,而KAN只有約200個參數。 KAN與MLP一樣具有強大的數學基礎,MLP基於通用逼近定理,而KAN基於Kolmogorov-Arnold表示定理。如下圖所示,KAN在邊上具

在iPhone上面臨滯後,緩慢的行動數據連線?通常,手機上蜂窩互聯網的強度取決於幾個因素,例如區域、蜂窩網絡類型、漫遊類型等。您可以採取一些措施來獲得更快、更可靠的蜂窩網路連線。修復1–強制重啟iPhone有時,強制重啟設備只會重置許多內容,包括蜂窩網路連線。步驟1–只需按一次音量調高鍵並放開即可。接下來,按降低音量鍵並再次釋放它。步驟2–過程的下一部分是按住右側的按鈕。讓iPhone完成重啟。啟用蜂窩數據並檢查網路速度。再次檢查修復2–更改資料模式雖然5G提供了更好的網路速度,但在訊號較弱

特斯拉機器人Optimus最新影片出爐,已經可以在工廠裡打工了。正常速度下,它分揀電池(特斯拉的4680電池)是這樣的:官方還放出了20倍速下的樣子——在小小的「工位」上,揀啊揀啊揀:這次放出的影片亮點之一在於Optimus在廠子裡完成這項工作,是完全自主的,全程沒有人為的干預。而且在Optimus的視角之下,它還可以把放歪了的電池重新撿起來放置,主打一個自動糾錯:對於Optimus的手,英偉達科學家JimFan給出了高度的評價:Optimus的手是全球五指機器人裡最靈巧的之一。它的手不僅有觸覺

目標偵測在自動駕駛系統當中是一個比較成熟的問題,其中行人偵測是最早得以部署演算法之一。在多數論文當中已經進行了非常全面的研究。然而,利用魚眼相機進行環視的距離感知相對來說研究較少。由於徑向畸變大,標準的邊界框表示在魚眼相機當中很難實施。為了緩解上述描述,我們探索了擴展邊界框、橢圓、通用多邊形設計為極座標/角度表示,並定義一個實例分割mIOU度量來分析這些表示。所提出的具有多邊形形狀的模型fisheyeDetNet優於其他模型,並同時在用於自動駕駛的Valeo魚眼相機資料集上實現了49.5%的mAP

哭死啊,全球狂煉大模型,一網路的資料不夠用,根本不夠用。訓練模型搞得跟《飢餓遊戲》似的,全球AI研究者,都在苦惱怎麼才能餵飽這群資料大胃王。尤其在多模態任務中,這問題尤其突出。一籌莫展之際,來自人大系的初創團隊,用自家的新模型,率先在國內把「模型生成數據自己餵自己」變成了現實。而且還是理解側和生成側雙管齊下,兩側都能產生高品質、多模態的新數據,對模型本身進行數據反哺。模型是啥?中關村論壇上剛露面的多模態大模型Awaker1.0。團隊是誰?智子引擎。由人大高瓴人工智慧學院博士生高一鑷創立,高

寫在前面項目連結:https://nianticlabs.github.io/mickey/給定兩張圖片,可以透過建立圖片之間的對應關係來估計它們之間的相機姿態。通常,這些對應關係是二維到二維的,而我們估計的姿態在尺度上是不確定的。一些應用,例如隨時隨地實現即時增強現實,需要尺度度量的姿態估計,因此它們依賴外部的深度估計器來恢復尺度。本文提出了MicKey,這是一個關鍵點匹配流程,能夠夠預測三維相機空間中的度量對應關係。透過學習跨影像的三維座標匹配,我們能夠在沒有深度測試的情況下推斷度量相對
