摘要:盤古NLP大模型有兩個,α和β。α已經開源gitee連接,它是基於GPT-3結構的網絡,主打生成類任務。β是基於Transformer結構的網絡,更擅長理解類任務。
本文分享自華爲雲社區《千億模型訓練—盤古β大模型》,原文做者:泰坦 。python
在4月25日的華爲HDC大會上, 餘總和田奇老師發佈了盤古AI大模型,做爲參與了盤古項目的開發人員,也來湊個熱鬧,簡單介紹一下盤古項目,以下圖:
git
NLP大模型其實有兩個,α和β。α已經開源gitee連接,它是基於GPT-3結構的網絡,主打生成類任務。β是基於Transformer結構的網絡,更擅長理解類任務,田其老師臺上互動的就是β,CLUE打榜的也是β。
segmentfault
千億參數: 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。
spa
單卡沒法容納全量參數, 須要把模型參數切分到每一個不一樣的卡上。分佈式節點儲存不一樣的參數,可是他們的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。
使用multi_task方法(無監督數據集,CLUE數據集無監督數據集,CLUE數據有監督數據集)進行第一次finetune。這裏使用的是CLUE全部下游任務的數據集。如無監督數據集A條,CLUE數據集無監督數據集B條,CLUE數據有監督數據集C條。
當第一次finetune的loss達到預期後,再針對單獨的下游任務,使用有監督數據集進行finetuen。
任務轉換:再也不直接對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也通過了這次大模型的考驗,沉澱了一些能力,未來也會上線一些大模型的新功能,請你們拭目以待。