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

yifanwu發表於2021-09-09

摘要:盤古 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,即將其轉換為完形填空形式的任務,來預測不同 labeldescription 的機率,例如:

一個樣本為“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 也經過了此次大模型的考驗,沉澱了一些能力,將來也會上線一些大模型的新功能,請大家拭目以待。

作者:華為雲開發者社群
連結:
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2797582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章