單個 GPU,隻花一天時間,能把 BERT 訓練成什麼樣?
現在,終于有研究人員做這件事了,在有限的計算條件之下看看語言模型的真實性能如何。
要知道在以往,大多數專業人員的關注點都在極端計算的條件下的語言模型性能。
但這樣的語言訓練模型環境,對很多研究人員和從業人員是不可能存在的。
因此這個單天單個 GPU 的挑戰,就有網友稱是一個最希望看到的基準。
連 ViT 作者,谷歌大腦研究員 Lucas Beyer 都發文推薦,稱這是一個令人耳目一新的轉變。
具體的過程和結果如何,一起來看看~
挑戰過程
這次研究的目标也很明确,就是反其道行之:縮小語言訓練模型的算力,在有限的計算量的情況下如何達到 BERT 的性能水平。
既然要縮小計算量,那第一步肯定是對模型作出一些限定。
這也還是之前提到的,限定時間和 GPU 個數:單天單個 GPU。
關于 GPU,研究人員分别選取了 3 個進行測試,即 rtx2080ti、rtxa4000 和 rtxa6000,每個單元有 4 個 CPU 核和 32GB 内存。
在限定計算量之後,就要對模型的其他參數進行一些調整,以進一步對 BERT 的實際适用性進行評估。
這些調整包括初始數據設置、模型架構、訓練以及數據集的改進。
并且在調整的過程中,整體基調都是圍繞 " 實際使用 " 進行的,避免跳轉到專業的設置,為此,研究人員将所有内容都保持在 PyTorch 框架的實現級别上。
先來說說初始數據設置,這部分可以簡單概括為以下幾點:
将标記化的數據打包成長度為 128 的随機序列,不相關的片段用
分割;
删除 < cls > 标記,因為在訓練前訓練中加入它并沒有對性能産生多大影響;
将序列長度為 64 到 96 微小批量累積到大批量再處理。
然後是對架構的修改,下圖顯示了不同模型在随着 token 數量的增加 MLM 任務損失的變化。
結果很顯然,一個模型損失的衰減很大程度地取決于模型的大小,而不是模型的類型。
并且,因為每個 token 的性能與模型大小之間的關系緊密耦合,若想通過改變 Transformer 模型的大小和類型來獲得巨大性能增益是不太可能的。
不過對于同大小的所有模型,每個梯度效率是幾乎保持不變的,因此可以在保證模型大小不變的情況下,選擇能夠通過快速搜索加速計算的架構。
具體的優化和其他調整如下:
減少注意力頭的數量來降低梯度成本:禁用所有 QKV 偏差;
禁用所有線性層偏差,通過加速梯度計算,不會對模型大小産生明顯影響;
實現比例正弦位置嵌入,相較于學習或非比例正弦嵌入有增量收益;
LN 的預标準化比後 LN 更有益;
去除非線性頭部并無影響。
接下來便要對訓練進行設置,具體也就不再贅述,直接來看相關調整:
優化器依舊是 Adam;
設定 Learning Rate 計劃和批量大小;
丢掉 Dropout 環節。(因為 Dropout 會導緻每秒更新的淨減少)
而在數據集方面,研究團隊采用了兩種基于數據的途徑來更好地縮小規模,分别是以各種方式過濾、處理或排序現有的數據和交換數據源,具體可以看下表。
性能接近最初的 BERT
在調整完各種參數後,這個單卡一天的 BERT 性能到底如何?直接看看最終的數據!
在下遊性能評估時是通過 GLUE 來進行的,下表能夠看到在 3 個不同顯卡上的得分,非常接近最初的 BERT。
而當模型訓練計算量為 16 倍時,即(2 天,在 8 個 GPU),依舊是一樣的數據和設置,最終得到的結果比最初的 BERT 提高了很多,達到了 RoBERTa 的性能水平。
如果想了解更多,可以點擊下面鍊接查看論文原文~
論文原文:
https://arxiv.org/abs/2212.14034
參考鍊接:
https://twitter.com/giffmana/status/1608568387583737856