中文稀疏GPT大模型落地 — 通往低成本&高效能多工通用自然語言理解的關鍵里程碑

語言: CN / TW / HK

作者:同潤,臨在

團隊:阿里雲機器學習平臺PAI

1. 概述

GPT模型能較好的處理NLP各個應用領域的任務,比如文字分類,推理,對話,問答,完形填空,閱讀理解,摘要,生成等等。百億/千億引數量級的GPT大模型作用在這些應用領域雖然效果很好,但是訓練成本非常高。以OpenAI推出的1750億的GPT-3為例,在1024張A100GPU上預估需要34天,一萬億引數的GPT-3在3072張A100顯示卡上也至少需要84天;微軟/英偉達聯合推出的5300億的NLG模型,在2048張A100顯示卡上耗時了3個月的訓練時間才能達到比較好的收斂效果。基於MoE的稀疏化訓練是目前最具競爭力的降本途徑。另一方面,GPT稀疏大模型在中文領域的效果還沒有得到實際的驗證,能否有效處理中文超多分類任務,口語化表達的中文推理或者情感分析任務,都是我們亟待探索的課題。綜上所述,我們的工作是探索基於稀疏MoE結構的GPT模型在中文任務上的效能上限,同時把大模型訓練成本壓縮到極致,僅在單機A100硬體支援下就能將百億引數大模型訓練成熟。

繼去年使用Transformer Encoder大模型取得中文小樣本學習、英文預訓練模型知識量度量雙冠後,今年阿里雲又在中文語言理解權威評測基準CLUE的中文零樣本學習權威榜單ZeroCLUE上取得冠軍。我們將大模型技術能力向前推進了一大步。基於MoE稀疏結構,僅用一臺A100就把160億引數量級的多工通用GPT模型訓練成熟。此次刷榜的模型是阿里雲機器學習PAI團隊推出的 GPT-MoE,這也是業界推出的首個稀疏的純decoder架構模型在zeroclue上登頂。這是通往低成本且高效能多工通用自然語言理解的重要里程碑。

MoE的全稱是Mixture of Experts,其中的Expert對應的是Transfomrer模型的FFN層,在訓練的時候從多個FFN中選取一部分FFN進行啟用。這意味著模型可以在不增加計算強度(FLOPS/Bytes)的情況下,通過增加FFN的數量進而增加模型引數量級來提升模型在下游任務上的效能。採用MoE後的稀疏Transformer模型和同等質量的稠密模型相比有5倍的吞吐效能提升,如下圖所示。我們在稀疏架構總體設計的時候,選擇讓MoE跟純Transformer Decoder架構的GPT進行有機結合。原因是MoE跟Decoder結合效果通常會好於跟Encoder的結合效果。具體來講,Encoder是通過隨機masking的方式學習語言模型,而這種被隨機masked的token會讓expert的路由選擇出現不均衡。另一方面,考慮到Decoder類的GPT模型比Encoder類的Bert模型有更廣泛使用場景,因此我們採用GPT+MoE的技術架構路線。

2. 演算法&工程技術解讀

演算法方面我們提出了一種更加高效穩定的稀疏路由均衡器,基於Prompt的領域話術再適應的零樣本學習以及中文中文複雜任務定向優化。工程方面我們訓練了工業級中文BPE分詞器,微調過程中的工程優化,transformer訓練加速工具rapidformer等,下面為大家一一詳細解讀。

打造工業級中文BPE分詞器 & 高質量預訓練資料集

中文每個字都有獨立的意思,可以利用複雜多變的自由組合來表達多種含義,如果GPT的詞表依舊採用Bert那種按字分詞的策略,這無形中極大增加了GPT語言建模的難度。比如下面這個例子,“道”字可以衍生出意義完全不同的三個詞:道德,道理,道歉。根據“道”字左邊的上下文資訊推測其右邊的字難度還是比較大的。

我們需要構建一種效能魯棒的中文分詞工具,它能夠從大規模語料中按照上下文統計特徵提煉出中文單個漢字構成的大顆粒度片語。我們決定採用先進的BPE演算法來嘗試做到這點。我們使用的Sentencepiece工具在5億條高質量中文語料上訓練了一個星期產出了一個5w詞表量級的中文BPE分詞器。另外中文超大規模語料的選擇也有講究,去年我們使用PAI資料集就能把13億的Bert模型訓練成熟,今年我們嘗試了更大的WuDao2.0資料集,大概是PAI資料集的十倍。原始WuDoa2.0資料集質量還是不太符合要求的,我們按照去年對PAI資料集的清洗過程,重新對原始的WuDao2.0資料集做了清洗,生成了一份相對高質量的WuDao2.0資料集。我們在資料集和分詞器上做了一些消融實驗,結論如下:

  1. 精選後的wudao資料集比精選的PAI資料集(只有wudao量級的十分之一)在驗證集loss上要小,同時在TNEWS和EPRSTMT等下游任務指標要高。
  2. 5億條句子訓練出來的BPE分詞器比1億條句子訓練出來的BPE分詞器在驗證集loss上有0.02的降低,同時在TNEWS和EPRSTMT下游任務指標有小幅提升。

強化型稀疏路由均衡器

MoE概念最早出現在2017年的ICLR[1]上。它的基本概念十分簡單,在前向傳播的時候動態地從多個FFN中隨機選擇一些執行運算,從而達到引數擴充的效果。後續一系列論文[4][5][6][7][8][9]也都是圍繞設計稀疏路由均衡器展開。

真正將MoE帶到工業級發揚光大的是谷歌公司的GShard[2]和Switch Transformer[3]。其採用top-1路由機制。每個Expert根據如下的softmax函式被賦予一個概率值,取概率最高(top-1)的那個Expert當作網路的FFN層。其中W_r是做路由選擇時需要學習的引數。

我們作出的改進是對Expert路由選擇也就是到token到FFN的對映模組進行強化。讓該模組在做對映路徑選擇的時候更加保持平衡。我們通過大量的消融實驗發現了一種效能更好更穩定的稀疏路由均衡器Large-Margin[10] Router。其在Transformer中的功能位置如下圖所示:

採用Large-Margin Router後可以看出validation loss的下降十分明顯,同時下游任務的提升的效果也提升不少。

模型 引數量 LAMBADA PIQA BoolQ RACE WebQs
Sparse-GPT-125M-MoE64 1.9B 0.3988 0.6425 0.4737 0.2890 0.0034
Sparse-GPT-125M+MoE64-Large-Margin Router 1.9B 0.4017 0.6496 0.5003 0.2948 0.0057

刷榜採用的模型引數配置如下所示:

sequence length 2048
hidden size 2048
number layers 24
number attention heads 16
number experts (Pyramid Resudial) 32 32 32 32 32 32 32 32 32 32 64 64
稀疏引數總量 160億
稠密引數總量 13億

領域話術再適應的零樣本學習

我們僅使用一臺A100機型就能拉起160億量級的稀疏GPT大模型的訓練。這種低成本的訓練環境,允許我們通過繼續預訓練或者微調來能進一步釋放GPT大模型的能力,讓其在各個NLP任務中發揮更大的價值。

繼續稀疏預訓練的再適應損失函式

訓練GPT大模型使用的超大規模中文資料集WuDao2.0,其話術風格偏向正式的用語風格。而ZeroCLUE9個任務中有六個任務是口語化的風格,兩個任務是是科技論文風格。這兩種風格是大模型沒有見過的,因此需要通過學習更多特定領域的陳述表達方式讓大模型去適應新的話術風格。具體來講,當基礎大模型訓練成熟後,我們對每個任務或者多個相似任務進行繼續預訓練,最後對每個任務執行無監督零樣本學習。如下圖所示:

我們使用CLUE官方提供的未標註的任務語料來學習風格話術。對loss函式設計是總的loss= 上下文 loss + 提示語 loss + 偽標籤loss+MoEloss。示例如下:

其中上下文和提示語的loss使用GPT訓練語言模型標準的負對數最大似然,偽標籤loss使用Masked LM,MoE loss和預訓練保持一致。同時通過相關係數調節各個loss之間的貢獻比例。

尋找最優中文提示語及其答案

提示語和對應答案的設計對zeroshot的效能影響非常大。以EPRSTMT情感分析任務為例,我們發現使用“滿意/不滿意”比使用“負面/正面”效果好不少。提示語中加上評論兩個字毫無作用,這跟我們的直覺貌似有些不一致。需採用更為通用的提示語:“這句話表達的是”。下面是我們通過實踐總結出來的比較好的提示語和答案。

任務名稱 任務型別 Prompt
EPRSTMT 情感分析 Sentiment 提示語:這句話表達的是 答案選擇:“不滿意”,“滿意”
CSLDCP 主題分類 Topic Classification 提示語:這句話是關於 答案選擇:主題標籤
TNEWS 主題分類 Topic Classification 提示語:這條新聞的主題是 答案選擇:主題標籤
IFLYTEK 主題分類 Topic Classification 提示語:這兩句話的關係是 答案選擇:“蘊含”,“矛盾”,“中性”
OCNLI 自然語言推理 Natural Language Inference 提示語:這兩句話的關係是 答案選擇:“蘊含”,“矛盾”,“中性”
BUSTM 自然語言推理 Natural Language Inference 提示語:這兩句話的意思 答案選擇:”相同“,”不同“
CSL 關鍵詞識別 關鍵詞識別 提示語:關鍵詞{}在這段摘要中是否全部為真實關鍵詞 答案選擇:”是“,”不是“
CLUEWSC 互指消解 Coreference Resolution 提示語:這句話中的{}指的是{}嗎? 答案選擇:”是“,”不是“

備註:CHID任務不需要提示語和答案

單機環境優化訓練視訊記憶體 & 超大體積大模型載入
我們在使用160億引數大模型做繼續預訓練的時候面臨兩個非常大的工程挑戰

  • 超大容量ckpt導致單機無法載入
  • 原始資料on the fly繼續預訓練視訊記憶體消耗更大導致無法繼續預訓練

160億稀疏GPT大模型需要佔用2T的記憶體空間才能載入進來,經過探索嘗試,我們最終用NVME掛載來擴充虛擬記憶體的方式解決了該問題,幸運的是我們使用的A100機型NVME空間很大。命令如下所示:

sudo mkfs -t ext4 /dev/nvme0n1
sudo mkfs -t ext4 /dev/nvme3n1
sudo mkdir /mnt /mnt3
sudo mount /dev/nvme0n1 /mnt
sudo mount /dev/nvme3n1 /mnt3
sudo dd if=/dev/zero of=/mnt/swapfile bs=1G count=1024
sudo dd if=/dev/zero of=/mnt3/swapfile bs=1G count=1024
sudo chmod 600 /mnt/swapfile
sudo chmod 600 /mnt3/swapfile
sudo swapoff -a
sudo mkswap /mnt/swapfile
sudo mkswap /mnt3/swapfile
sudo swapon /mnt/swapfile /mnt3/swapfile

更為致命的是我們發現160億引數的大模型按照和基礎預訓練同樣的訓練加速&降視訊記憶體配置載入進來視訊記憶體就OOM了。OOM的主要原因是由於採用了on the fly的資料載入方式以及更為複雜的反向傳播。得益於Rapidformer加速庫良好的使用者介面設計,我們發現開啟zero-stage-2開關同時限制number workers個數可以執行繼續預訓練。這樣做存在一個負效應就是基礎預訓練和繼續預訓練的優化器存在不一致,不過影響在可控範圍內。

攻堅中文超多分類任務&複雜推理任務&關鍵字識別任務

中文超多分類任務

榜單中有二個很困難的超多分類任務,是英文任務中從來沒有遇到過的。眾所周知,GPT模型擅長做生成類的任務,BERT模型擅長做識別類的任務。IFLYTEK和CSLDCP是識別類的任務且類別超多,類別數過多導致likelihood-ranking的效能下降,直接使用ZeroShot的精度很低。

任務 描述 示例
IFLYTEK 該資料集關於app應用描述的長文字標註資料,包含和日常生活相關的各類應用主題,共119個類別:"打車":0,"地圖導航":1,"免費WIFI":2,"租車":3,….,"女性":115,"經營":116,"收款":117,"其他":118(分別用0-118表示)。 {"label": "110", "label_des": "社群超市", "sentence": "樸樸快送超市創立於2016年,專注於打造移動端30分鐘即時配送一站式購物平臺,商品品類包含水果、蔬菜、肉禽蛋奶、海鮮水產、糧油調味、酒水飲料、休閒食品、日用品、外賣等。樸樸公司希望能以全新的商業模式,更高效快捷的倉儲配送模式,致力於成為更快、更好、更多、更省的線上零售平臺,帶給消費者更好的消費體驗,同時推動中國食品安全程序,成為一家讓社會尊敬的網際網路公司。,樸樸一下,又好又快,1.配送時間提示更加清晰友好2.保障使用者隱私的一些優化3.其他提高使用體驗的調整4.修復了一些已知bug"}
CSLDCP 中文科學文獻學科分類資料集,包括67個類別的文獻類別,這些類別來自於分別歸屬於13個大類,範圍從社會科學到自然科學,文字為文獻的中文摘要。 {"content": "通過幾年的觀察和實踐,初步掌握了盆栽菊花的栽培技術及方法,並進行了總結,以滿足人們對花卉消費的需求,提高觀賞植物的商品價值,為企業化生產的盆菊提供技術指導。", "label": "園藝學", "id": 1770}

為了提升超多分類問題的精度,我們首先對這些葉子類目進行歸納整理,抽象出一級類目出來,比如:

葉子類目 歸納出的一級類目
飛行空戰,射擊遊戲,休閒益智,棋牌中心,經營養成 手遊
約會社交,即時通訊,工作社交,生活社交 社交

接著在執行loglikehood-ranking的時候先在一級類目範圍內進行粗排,接著在葉子淚目範圍內進行精排。採用這樣一級淚目輔助的精細化排序後,這三個多分類任務平均有4個點左右的提升。

複雜推理任務

這兩個任務的難點在於口語化,句子短。即使進行領域話術再適應,也很難在幾個epoch內讓160億大模型的風格迅速適配過來。

任務 描述 示例
OCNLI 原生中文自然語言推理資料集,是第一個非翻譯的、使用原生漢語的大型中文自然語言推理資料集。 "sentence1":"身上裹一件工廠發的棉大衣,手插在袖筒裡", "sentence2":"身上至少一件衣服","label": "entailment"
BUSTM 對話短文字語義匹配資料集,源於小布助手。它是OPPO為品牌手機和IoT裝置自研的語音助手,為使用者提供便捷對話式服務。 {"id": 5, "sentence1": "女孩子到底是不是你", "sentence2": "你不是女孩子嗎", "label": "1"}

我們將CMNLI/OCNLI/BUSTM的無標籤資料混合在一起進行聯合領域自適應,採用同樣的Prompt設計,進行聯合推理。執行多工資料混合後在OCNLI和BUSTM的平均分有5個點的提升。
關鍵字識別任務

任務 描述 示例
CSL 取自中文論文摘要及其關鍵詞,論文選自部分中文社會科學和自然科學核心期刊,任務目標是根據摘要判斷關鍵詞是否全部為真實關鍵詞(真實為1,偽造為0)。 {"id": 1, "abst": "為解決傳統均勻FFT波束形成演算法引起的3維聲吶成像解析度降低的問題,該文提出分割槽域FFT波束形成演算法.遠場條件下, 以保證成像解析度為約束條件,以劃分數量最少為目標,採用遺傳演算法作為優化手段將成像區域劃分為多個區域.在每個區域內選取一個波束方向, 獲得每一個接收陣元收到該方向回波時的解調輸出,以此為原始資料在該區域內進行傳統均勻FFT波束形成.對FFT計算過程進行優化,降低新演算法的計算量, 使其滿足3維成像聲吶實時性的要求.模擬與實驗結果表明,採用分割槽域FFT波束形成演算法的成像解析度較傳統均勻FFT波束形成演算法有顯著提高,且滿足實時性要求.", "keyword": ["水聲學", "FFT", "波束形成", "3維成像聲吶"], "label": "1"}

起初我們認為這個任務不行是prompt的設計有問題,後來通過大量的實驗我們發現使用log-likelihood-ranking推理準則沒有使用perplexity推理準則有用,部署perplexity-ranking後有將近7個點的提升。

大模型訓練加速工具Rapidformer

Rapidformer的定位是為Transformer模型庫提供大模型大資料量的訓練加速能力。這是通過有機整合微軟的DeepSpeed,英偉達的Megatron以及Meta的FairScale來做到的。如下圖所示:


下圖對比了Rapidformer,Megatron,DeepSpeed三者之間的加速能力差異,Rapidformer融合了Megatron和DeepSpeed的各自的優點,提供了一個統一的訓練環境。

基於Rapidformer,我們可以通過加速開關的組合,來找到最優的吞吐。下面我們用130億引數的GPT-MoE大模型為例,介紹下如何尋找最優的吞吐加速策略組合。130億稀疏模型的引數配置如下:

number layers hidden size number attention heads number experts 引數總量
24 1024 16 128 13B

我們用到的訓練加速核心技術包括:

啟用檢查點(Activation Checkpoint) 在神經網路中間設定若干個檢查點(checkpoint),檢查點以外的中間結果全部捨棄,反向傳播求導數的時間,需要某個中間結果就從最近的檢查點開始計算,這樣既節省了視訊記憶體,又避免了從頭計算的繁瑣過程。

梯度累積 (Gradient Accumulation)  以batch_size=16為例,可以每次算16個樣本的平均梯度,然後快取累加起來,算夠了4次之後,然後把總梯度除以4,然後才執行引數更新,這個效果等價於batch_size=64。這是一種有效的增加Batch Size的方法。通過該策略可以將每個step的batch size擴充到很大,結合LAMB優化器會提升收斂速度。

混合精度訓練(Mixed Precision Training) 採用混合精度訓練的好處主要有以下兩點:1. 減少視訊記憶體佔用,由於FP16的記憶體佔用只有FP32的一半,自然地就可以幫助訓練過程節省一半的視訊記憶體空間。2. 加快訓練和推斷的計算,FP16除了能節約記憶體,還能同時節省模型的訓練時間。具體原理如下圖所示,核心是在反向傳播引數更新的時候需要維護一個FP32的備份來避免舍入誤差,另外會通過Loss Scaling來緩解溢位錯誤。

Zero視訊記憶體優化器 ZeRO(The Zero Redundancy Optimizer)是一種用於大規模分散式深度學習的新型記憶體優化技術。ZeRO具有三個主要的優化階段分別對應於優化器狀態,梯度和引數的劃分。

  • 優化器狀態分割槽(Pos) :減少了4倍的記憶體,通訊容量與資料並行性相同
  • 增加梯度分割槽(Pos+g) : 8x記憶體減少,通訊容量與資料並行性相同
  • 增加引數分割槽(Pos+g+p) :記憶體減少與資料並行度和複雜度成線性關係。

所有吞吐實驗都採用sequence length=2048,Global Batch Size=256,通過下表我們發現當在local DDP環境下,開啟Activation Checkpoint,關閉Zero-stage-2,8步梯度累積每步消耗的時間是最少的,吞吐也是最高的。同時視訊記憶體也得到了充分的利用。

DDP Activation Checkpoint Zero-stage-2 Batch Size elapsed time per iteration (ms) Max Reserve Memory
torch 4 OOM OOM
torch 4 3688 74454
torch 8 OOM OOM
torch 8 5493 52338
torch 4 4734 43912
torch 8 5331 50026
torch 16 6970 59745
local 4 3452 75192
local 8 5349 50026
local 16 6834 59754
local 32 OOM OOM

3. 使用示例

本次刷榜使用的160億引數的中文GPT-MOE稀疏大模型及其ZeroShot應用已在EasyNLP(http://github.com/alibaba/EasyNLP)中開源,詳情請見連結。具體使用方式如下所示:

首先通過如下的命令拉起EasyNLP專屬映象並建立容器,裡面已經安裝了Rapidformer及其全部的依賴庫。

docker pull pai-image-manage-registry.cn-shanghai.cr.aliyuncs.com/pai/easy_nlp:0.0.7

然後下載中文版的GPT-MOE模型,注意需要在硬碟上預留2T的儲存空間同時需要通過swap設定2T的記憶體空間。

./ossutil64 cp -r oss://atp-modelzoo-sh/tutorial/rapidformer/zeroclue/ckpts ckpts

接下來就可以開始針對每個任務執行繼續預訓練了,在run_finetune_gpt_moe.sh指令碼中已經通過開關打開了必要的訓練降視訊記憶體加速技術比如:Activation Checkpoint和Zero-stage-2。從CLUE官網下載無標籤的訓練資料,然後打上偽標籤,注入進大模型中開始進行任務話術領域再適應。

sh run_finetune_gpt_moe.sh

訓練完成後儲存ckpt就可以執行鍼對特定任務的Zeroshot推理了,使用如下的推理指令碼。

sh run_predict_gpt_moe.sh

4. 總結

在這次中文ZeroCLUE刷榜評測中,我們圍繞中文百億稀疏GPT大模型落地挖掘了以下核心技術:

  • 基於large-margin的稀疏路由均衡器比傳統Top-1均衡器效果更好更穩定。
  • 針對160億引數稀疏大模型的領域話術再適應演算法以及工程底座經刷榜檢驗是可靠的。
  • 提升了中文超多分類問題和複雜推理等問題的零樣本學習任務效果。
  • 大模型訓練加速工具的可靠性進一步得到了驗證。

後續在EasyNLP中還會陸續放出更多高質量的大模型,敬請期待。

參考檔案

[1] . Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer

[2]. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding

[3]. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity

[4]. BASE Layers: Simplifying Training of Large, Sparse Models

[5]. Hash Layers For Large Sparse Models

[6]. TAMING SPARSELY ACTIVATED TRANSFORMER WITH STOCHASTIC EXPERTS

[7]. GLaM: Efficient Scaling of Language Models with Mixture-of-Experts

[8]. Unified Scaling Laws for Routed Language Models

[9]. Designing Effective Sparse Expert Models

[10]. Large Margin Deep Networks for Classification