盤古大模型參與者解讀盤古β大模型

摘要:盤古NLP大模型有兩個,α和β。α已經開源gitee鏈接,它是基於GPT-3結構的網絡,主打生成類任務。β是基於Transformer結構的網絡,更擅長理解類任務。

本文分享自華爲雲社區《千億模型訓練—盤古β大模型》,原文作者:泰坦 。

在4月25日的華爲HDC大會上, 餘總和田奇老師發佈了盤古AI大模型,作爲參與了盤古項目的開發人員,也來湊個熱鬧,簡單介紹一下盤古項目,如下圖:

NLP大模型其實有兩個,α和β。α已經開源gitee鏈接,它是基於GPT-3結構的網絡,主打生成類任務。β是基於Transformer結構的網絡,更擅長理解類任務,田其老師臺上互動的就是β,CLUE打榜的也是β。

什麼是大模型

  • 網絡參數大

千億參數: 100000000000*4(float32)/1024^3=381.5GB

在盤古β中, 實際參數量約爲400G, 使用Adam優化器, 總參數量約爲1.2T, 在2048卡訓練下, 因爲有一些冗餘信息, 保存的ckpt實際大小爲830M。

  • 訓練資源大

使用數千張昇騰910訓練1月以上。

  • 訓練數據大

原始數據40T, 處理後數據600G。實際上最重要的是要有鈔能力。

如何訓練大模型

大模型的困難,實際難在工程。我們使用華爲雲機器學習平臺ModelArts + 機器學習框架Mindspore + AI處理器昇騰910進行開發。爲了支撐大模型項目,Mindspore的小夥伴開發了非常多的新特性,如優化器模型並行,管道並行等,具體信息可以查看我們總架金雪鋒的答案。

下面借鑑一下立交橋跳水冠軍的帖子,簡單介紹一下並行技術,及盤古β如何運用它們的。

數據並行

數據並行(DP)是應用最廣的並行策略,對在多個設備上部署深度學習模型非常有用。但該方法存在缺陷,如隨着訓練設備數量不斷增加,通信開銷不斷增長,模型統計效率出現損失等。如下圖所示,數據並行中每個分佈式節點存儲相同的參數(parameters),input的數據不一樣。由於盤古β使用了Adam優化器,會佔用非常多的靜態內存,所以batch size開不大。使用數據並行,相當於擴大了batch size。

模型並行

單卡無法容納全量參數, 需要把模型參數切分到每個不同的卡上。分佈式節點儲存不同的參數,但是他們的input往往是相同的。

在盤古β中,所有參數爲1.2T,每張910卡實際可用HBM爲31G,理論算出最少需要40張卡。由於HCCL等限制,實際最少需要64卡進行訓練。可以選擇32模型並行,2數據並行,或者64模型並行。

管道並行

大規模分佈式訓練, 計算通信耗時長. 使用管道並行, 加速訓練(X2)。

前面的模型並行,只是對模型的參數進行了切分,管道並行是對網絡進行切分,每張卡只創建一個子網絡,再通過流水線的方式組合起來。

以上圖爲例,4個節點將5層的網絡進行了切分,每個節點只創建一個子網絡。節點的執行序如下圖所示:

每個節點接收前一個節點的輸出,計算完成後再把輸出傳遞給下一個節點。當最後一個stage完成計算後,便開始計算反向,grads由最後一個節點一層層傳遞到第一個節點,最後完成參數更新,再進行下一個step。

盤古β由encoder+decoder結構組成,兩者共用一個Embedding層。在管道並行下,需要把Embedding層從第一個stage一直傳遞到第一個Decoder所在的stage,在此stage對target_ids計算嵌入,再送入Decoder中進行計算。而所有Decoder都會用到Encoder的輸出來計算cross attention,所以我們對Decoder做了改造,使其接收Encoder輸出的同時,再把此Encoder的輸出傳遞給下一層Decoder。

在盤古β中,我們把整個模型切分成了16個stage,最後執行速度比非管道並行快1倍。

其他小功能

容災

由於採用大集羣進行訓練,難免會發生硬件,軟件方面的問題,造成訓練終止。我們開發了容災功能,會把每張卡使用的參數保存成ckpt,上傳到ModelArts的NAS硬盤上。繼續訓練時每張卡只需要下載對應的ckpt加載,便可以繼續訓練了。在盤古β中,從任務創建後,每臺機器都需要下載完整數據集到本地,每張卡的訓練進程都需要下載一個ckpt進行加載,再進行圖編譯,最後真正訓練跑起來需要2小時左右。

彈性訓練

由於資源較爲緊張,項目開始僅有1024卡進行訓練,當剩餘資源到位後,我們調整了並行策略,然後手動拆分ckpt,再進行繼續訓練。

當預訓練完成後,finetuen會使用128或256卡進行訓練,此時又需要手動合併ckpt,再進行訓練。

拆分合並ckpt需要理解Tensor在不同並行策略下的排布,及策略改變後如何變換Tensor,保證每一張卡獲取到對應的Tensor切片。

訓練技巧

無監督預訓練

盤古β採用了Masked Language Model方法進行預訓練,即在輸入句子中隨機mask掉15%的詞,模型預測mask掉的token。

下游任務(CLUE)finetune

使用multi_task方法(無監督數據集,CLUE數據集無監督數據集,CLUE數據有監督數據集)進行第一次finetune。這裏使用的是CLUE所有下游任務的數據集。如無監督數據集A條,CLUE數據集無監督數據集B條,CLUE數據有監督數據集C條。

當第一次finetune的loss達到預期後,再針對單獨的下游任務,使用有監督數據集進行finetuen。

PET(Pattern-Exploiting Training)

任務轉換:不再直接對label進行預測,而是預測其label description,即將其轉換爲完形填空形式的任務,來預測不同label description的概率,例如:

​ 一個樣本爲“context:’「天天特價房」華庭仁和國際 3室2廳2衛僅售65萬’, label: ‘房產’”

轉換爲如下形式:

​ “以下是一則 房產 相關新聞標題: 「天天特價房」華庭仁和國際 3室2廳2衛僅售65萬"

分佈式推理

在大部分CLUE任務中,decoder只需要推理1步,但一些生成任務會推理多步。由於圖編譯會把decoder的循環部分完全展開,故我們在這裏進行了改造,把整個網絡拆分成了Encoder+Decoder兩個網絡,decoder的多步推理放在python層進行。

管道並行推理比較複雜,訓練時使用上千張卡,推理時僅使用32卡。訓練時整個網絡分成了16個stage,推理時encoder分成4個stage,decoder分成4個stage,每張卡既有encoder,也有encoder。由於管道並行網絡的特殊性,只有第一個stage需要真正的輸入,只有最後一個stage纔有真正的輸出。不同的stage是跨機器的,就需要把encoder的輸出傳遞給decoder,這裏我們創建了Send,Recv網絡進行發送,接收。

最後

當前盤古β使用的mindspore有些特性是新開發的,目前還在努力開發,預計不久這些新功能就會正式合入mindspore的master,華爲雲ModelArts也經過了此次大模型的考驗,沉澱了一些能力,將來也會上線一些大模型的新功能,請大家拭目以待。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章