天天看點

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?

「70 年的人工智能研究史告訴我們,利用計算能力的一般方法最終是最有效的方法。」

這句話出自「強化學習教父」Rich Sutton 2019 年發表的一篇文章《

苦澀的教訓

》(The Bitter Lesson)。他認為,人工智能如果想要長期獲得提升,利用計算能力才是王道。

這是一個頗具争議的觀點,但也的确為現階段的 AI 發展提供了一個重要思路。在過去的幾年中,越來越多的研究者和機構開始在「大模型 + 大算力」的方向上展開探索。這不僅僅是摸索 AI 技術發展路徑的需要,也是 AI 落地到各行各業的剛需。

我們看到,在 AI 發展的早期階段,開發者傾向于為每個場景從頭訓練一個模型,但随着應用場景的不斷豐富,這種模式的缺點開始顯現,比如重複的人力、算力投入(重複造輪子),部分場景開發難度過大、成本過高等。而且,有些場景的資料是非常稀缺的,難以支撐一個高精度模型的訓練。

在此背景下,通過設計先進的算法,整合盡可能多的資料,彙聚大量算力,集約化地訓練領域通用大模型供大量企業使用,已經成為一種必然趨勢。

5 月 18 日,在華為生态大會 2021「昇騰萬裡 共赢智能新時代」分論壇上,鵬城實驗室超大模型「鵬程. 盤古」重磅亮相。這是業界首個全開源 2000 億參數中文預訓練語言模型。

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?

該模型由鵬城實驗室聯合相關技術團隊開發,首次基于「鵬城雲腦 Ⅱ」和全場景 AI 計算架構 MindSpore 的自動混合并行模式實作在 2048 卡算力叢集上的大規模分布式訓練,是國産全棧式 AI 基礎設施第一次支援 2000 億級超大規模語言模型訓練,探索并驗證了國産 E 級智算平台在軟硬體協同優化、大規模分布式并行訓練等核心關鍵技術上的可行性。

在模型性能方面,鵬程. 盤古大模型性能全球領先,16 個下遊任務中性能名額優于業界 SOTA 模型,其中零樣本學習任務 11 個任務領先、單樣本學習任務 12 個任務領先、小樣本學習任務 13 個任務領先。

在應用方面,鵬程. 盤古支援豐富的應用場景,在知識問答、知識檢索、知識推理、閱讀了解等文本生成領域表現突出。

能夠取得如此優異的成績,「大資料」、「大算力」固然功不可沒,但如果沒有卓越的軟硬體協同優化、大規模分布式并行訓練等技術做支撐,即使拿到足夠的算力和資料,我們也訓練不出鵬程. 盤古這類大模型。

在這篇文章中,我們就來談談鵬程. 盤古背後的技術以及這類大模型的價值所在。

開發鵬程. 盤古難在哪兒?

在以往的印象中,我們很容易将大模型的成功歸功于算力和資料。但其實,大模型是一種統籌了資料預處理、模型架構、并行訓練與優化的完整美學。就算給我們足夠的算力、原始資料、原始模型,想要做出真正跑得通的大模型,中間還有千難萬難。

拿資料來說,什麼樣的資料決定了模型有什麼樣的基本效果。顯然,僅僅滿足資料量大、幹淨、多樣三個标準,就需要大量工程操作。量大與多樣是大模型的必然要求,而它們必然導緻資料被污染,被污染的資料必然導緻模型效果不好(garbage in, garbage out)。是以,工程師們隻能手動寫下一條條規則去過濾、篩選出幹淨的資料。

模型也不例外。如果隻關注大模型的「大」,那想當然地就會把标準模型變深、變寬。這就牽扯出一些問題:模型真的收斂得好?梯度反向傳播沒問題嗎?權重都起作用嗎?标注信号足夠強嗎?是以,要想達到理想的性能,模型上的修改與适配也是必不可少。

最後,也是最難的,并行訓練政策與優化。光想想 2000 億參數需要 TB 級記憶體,現在根本不存在這麼大的 AI 處理器,大模型必然被「肢解」到不同的處理器。怎樣分解模型、怎樣配置設定處理器之間的通信、怎樣優化計算圖等等都顯得異常複雜。

是以,當鵬程. 盤古解決了以上一系列問題,它才能真正稱得上是一個有效的「大模型」。

最為核心:超大規模分布式訓練

優質大模型最為核心,也最為困難的挑戰,是超大規模分布式訓練。機器之心之前曾詳細介紹過

MindSpore 自動并行技術如何助力鵬程. 盤古

很難想象,對于鵬程. 盤古這樣的大模型,MindSpore 隻需幾行代碼就能完全自動地完成并行政策。

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?

MindSpore 對外屏蔽了複雜并行實作的細節,寫并行就像編寫單機模型那樣簡單。單機模型代碼隻需加上紅色的「.shard()」和「.pipline_stage」等方法與配置,即可指定模型并行方法。

如果手動來寫鵬程. 盤古分布式訓練邏輯,那麼需要綜合考慮計算量與類型、叢集帶寬、拓撲結構、樣本數量等等一大堆複雜的東西,然後再設計出性能比較優秀的并行切分政策,并編寫大量并行切分和節點間的通信代碼。而 MindSpore 将所有的複雜邏輯,都隐藏在「.set_auto_parallel_context()」這樣簡單的上下文管理器中。

從算法工程師角度來說,我們寫自己的串行算法邏輯,MindSpore 負責自動把它們優化成并行分布式邏輯,這樣用起來才是最舒服的。為了達到這樣的效果,MindSpore「.set_auto_parallel_context()」上下文管理器默默地自動完成了 5 種并行優化。

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?

MindSpore 從 5 大次元實作自動并行,5 維并行方式組合起來構成了鵬程. 盤古的分布式訓練政策。

1. 資料并行:自動将批量訓練資料分割成更小的批量,并将小批量配置設定到不同的訓練伺服器。這是算法工程師最基本,也是最常用的并行訓練手段。

2. 算子級模型并行:對模型中的每個算子涉及到的張量進行切分。例如前面示例中的 ops.MatMul(x, w).shard((4, 1), (1, 1)),表示将 x 輸入張量切分成 4 份,将 w 權重張量保留為一份。然後 4 個計算裝置各保留一份被切分的 x 和完整的 w。

3.Pipeline 模型并行:将模型按層分成多個 stage,再把各個 stage 映射到多台裝置上。例如模型第一層、第二層這樣的 Pipeline 會拆分到不同的計算節點上。

4. 優化器模型并行:将優化器涉及的參數和梯度切分到多台裝置上。例如常用的 Adam 優化算法,通過引入優化器并行,每個計算節點隻儲存部分權重及「動量」,能降低每個計算節點的靜态記憶體并提升計算效率。

5. 重計算 (Rematerialization):因為反向傳播的需求,一般正向算子的輸出結果會累計儲存在記憶體中,導緻記憶體峰值過大。MindSpore 自動并行會舍棄部分正向算子的輸出,并在反向階段再重新計算一遍,這樣能有效降低記憶體使用峰值。

這 5 大并行政策都是跨計算節點的,然而,在單卡節點内,MindSpore 還會通過圖層和算子層的跨層協同優化,來進一步發揮算力潛能。雖然都隐藏在 MindSpore 架構底層,但這些自動并行與優化政策,對于超大規模的鵬程. 盤古是最為核心的。

模型創新:備援不謂之「大」

預訓練語言模型,除了自編碼(AutoEncoding) 的 BERT 以及自回歸(AutoRegressive) 的 GPT-3 這兩大類架構,還有很多優秀的架構,例如多任務學習或者 XLNet 那樣依賴排列組合的預訓練方式。

然而,并非所有預訓練語言模型都能平滑地擴充到數千億參數量。可能有的架構收斂速度太慢,也可能有的架構對「few-shot」這樣的複雜任務支援不夠好。為了建構一種不臃腫且有效的模型,鵬程. 盤古采用了 GPT-3 初步試驗的自回歸架構作為 baseline,然後增加額外的 Query Layer 以加強模型在大規模中文預訓練上的能力。

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?

的确,如上所示,鵬程. 盤古和标準的自回歸語言模型結構不一樣,通常來說 Transformer 層在「5+this」那一個時間步就直接輸出第六個位置的 Token。但鵬程. 盤古還增加了一個 Query 層,并加上「6」 這一位置資訊以預測對應的 Token。

在 Transformer 頂層加上一個 Query Layer,旨在通過獨立的位置編碼,顯式地将期望的輸出給加進去。這樣的好處在于鵬程. 盤古明确知道它要預測哪個位置的詞,是以輸入可以是随機詞序,而不隻是标準正序的方式。

和标準正序語言模型相比,顯然這樣的任務是更難的,因為模型不僅要預測下一個詞,同時還要自己學會了解随機詞序正确的語義及詞之間真正的依賴關系。

正因為預訓練任務及模型結構的雙重改進,鵬程. 盤古大模型才會盡可能用上龐大的 2000 億權重參數,才能稱得上「大」。

為什麼要花那麼大力氣開發鵬程. 盤古?

從鵬程. 盤古背後的技術我們可以看出,這類大模型的誕生往往要經曆一個艱辛的過程。但一旦訓練出來,其價值是非常可觀的。

首先,大模型的泛化能力往往非常強大。以鵬程. 盤古為例,在學習了 TB 級的資料之後,該模型在很多方向都具備強大的通用知識,就像一個修煉了多年内功的武林高手。以此為底座,模型在各行各業的語言類場景下都有用武之地。

其次,大模型的小樣本學習能力非常強大。在擁有了強大的通用知識之後,模型隻需要學習少量新增樣本就可以「觸類旁通」,去解決特定場景下的任務。這就省去了從零開始訓練的麻煩,減少了重複勞動,降低了普通人、一般企業用上大模型的難度。

但是,要想将上述價值發揮到極緻,惠及整個 AI 生态圈,模型還得是開源、開放的。

我們看到,由于超大模型耗資甚巨、技術特性難以透徹了解,目前隻有 Google、Microsoft、NVIDIA 等大公司才可以玩轉千億 / 萬億級的大模型,這對于中小企業、研究機構和個人研究者來說都很不友好,也不利于 AI 生态圈的建設。

鵬程. 盤古的開源正是基于這一考量。為了發揮這一基礎性技術成果的最大效益,以鵬城實驗室為首的聯合團隊決定将鵬程. 盤古的模型、代碼、資料集在 OpenI 啟智社群全面開源、開放,希望以啟智開源社群為載體,集衆智、聚衆力,吸引開發者共同參與到模型的壓縮輕量化和應用創新工作中,不斷探索鵬程. 盤古大模型的巨大潛力。

透視鵬程.盤古:首個2000億參數中文大模型是怎樣煉成的?
OpenI 啟智社群是在國家實施新一代人工智能發展戰略背景下,新一代人工智能産業技術創新戰略聯盟(AITISA)組織産學研用協作共建共享的開源平台,旨在以鵬城雲腦重大科研基礎設施及 Trustie 軟體開發群體化方法與平台為基礎,全面推動人工智能領域的開源開放協同創新。

此外,鵬程. 盤古的開源也符合一帶一路人工智能産業發展聯盟《聯合宣言》的精神。這份宣言提出了四大倡議,其中就包括「建構基于先進技術的新型科技夥伴關系」,「把人工智能作為一帶一路新的紐帶,共同建設面向未來的『科技命運共同體』」等内容。

自成立以來,鵬城實驗室一直将國家對新型研發機制及一帶一路科研合作的要求作為自己的整體定位和目标,先後在多個戰略性、前瞻性、基礎性重大科學問題和關鍵核心技術上展開研究,鵬程. 盤古就是其最新研究成果之一。當然,鵬程. 盤古隻是對超大規模分布式訓練、超大規模中文預訓練模型的一次探索,未來還需要更多的研究工作者投入到通用智能與大規模分布式計算的研究工作中。

繼續閱讀