大規(guī)模分布式訓(xùn)練作為飛槳的重要功能模塊,在并行訓(xùn)練API、并行策略、框架基礎(chǔ)架構(gòu)都有了相應(yīng)的更新升級(jí)。在一小時(shí)的演講中,百度主任研發(fā)架構(gòu)師董大祥圍繞飛槳框架新版本的大規(guī)模訓(xùn)練與應(yīng)用展開(kāi),介紹了大規(guī)模分布式訓(xùn)練的功能、性能、以及在產(chǎn)業(yè)中的實(shí)踐。
以下為演講實(shí)錄部分:
飛槳的這次改動(dòng)中主要是對(duì)并行訓(xùn)練API進(jìn)行了全面更新,使代碼變得更加簡(jiǎn)潔,也更方便調(diào)試,另外也對(duì)并行訓(xùn)練的策略進(jìn)行了進(jìn)一步的升級(jí),可以適用于更大規(guī)模的模型參數(shù)。
飛槳的分布式訓(xùn)練API——Fleet的1.X版本已經(jīng)投入使用,但一直在內(nèi)部不斷地打磨優(yōu)化和一些升級(jí),所以在文檔中處于面向用戶(hù)隱藏的狀態(tài)。新版本中,我們固定了分布式訓(xùn)練API,正式面向外部的開(kāi)發(fā)者開(kāi)放,同時(shí)也把一些主流的訓(xùn)練模式,包括集合通信訓(xùn)練和參數(shù)服務(wù)器訓(xùn)練,做成統(tǒng)一的Fleet API(paddle.distributed.fleet),并在集合通信訓(xùn)練功能下實(shí)現(xiàn)了動(dòng)態(tài)圖和靜態(tài)圖訓(xùn)練API的統(tǒng)一。
如下三份代碼分別展示了采用參數(shù)服務(wù)器訓(xùn)練、集合通信訓(xùn)練的動(dòng)態(tài)圖和靜態(tài)圖方式訓(xùn)練模型的示例代碼,可以看到僅需要幾行代碼的新增即可完成單機(jī)轉(zhuǎn)化為分布式訓(xùn)練的目標(biāo)。
為了讓用戶(hù)能夠靈活定義不同的分布式訓(xùn)練模式,我們開(kāi)放了分布式加速策略distributed strategy類(lèi)供用戶(hù)定義并行訓(xùn)練的策略,比如我們可以去定義同步訓(xùn)練或者異步訓(xùn)練,可以去定義自動(dòng)和精度訓(xùn)練等等。如下是distributed strategy類(lèi)涵蓋的一些分布式加速策略API,幾乎囊括了所有能夠用到的分布式訓(xùn)練加速策略。
另外我們考慮到用戶(hù)的調(diào)試體驗(yàn),也在執(zhí)行方式上做了改進(jìn),如果用戶(hù)采用Fleet去寫(xiě)分布式訓(xùn)練的代碼,在單機(jī)和多機(jī)上都可以執(zhí)行訓(xùn)練。Fleet API識(shí)別出來(lái)用戶(hù)在跑單機(jī)訓(xùn)練,就會(huì)在底層屏蔽掉一些多機(jī)的邏輯,另一個(gè)就是用戶(hù)可以去使用fleetrun的啟動(dòng)接口執(zhí)行單機(jī)多卡的任務(wù)或多機(jī)多卡的任務(wù),需要強(qiáng)調(diào)的就是這兩種執(zhí)行方式都是同一份代碼,也就是用戶(hù)可以很容易的在多機(jī)多卡和單機(jī)單卡之間做切換和調(diào)試。
飛槳新版本也開(kāi)放了分布式通信的底層API,面向高級(jí)用戶(hù)提供了可微分的分布式編程能力,開(kāi)放了比如broadcast、all_reduce、reduce、all_gather等操作的前向與反向操作,還會(huì)開(kāi)放更多的底層接口來(lái)滿(mǎn)足開(kāi)發(fā)者修改底層通信邏輯的需求。
與友商的性能對(duì)比
GPU卡具有顯存限制,這使得模型大小及訓(xùn)練的Batch大小存在上限。我們?cè)O(shè)計(jì)了低成本擴(kuò)大Batch的方法,gradient_merge梯度累積,對(duì)于不含BatchNormalization的模型有較好擴(kuò)展性,性能幾乎無(wú)損。另外我們還提供了半精度通信等橫向擴(kuò)展的能力,假使我們?cè)谟?xùn)練的過(guò)程中使用的是一些比較老的GPU集群,比如p40不支持 FP16的計(jì)算,但是在通信的過(guò)程中是可以把 FP32精度量化為FP16精度后再進(jìn)行通信,這樣可以在訓(xùn)練精度幾乎無(wú)損的情況下降低網(wǎng)絡(luò)帶寬占用。通過(guò)實(shí)測(cè),P40下單機(jī)八卡訓(xùn)練VGG16模型,訓(xùn)練吞吐可以提升70%。
在超大規(guī)模模型參數(shù)的GPU訓(xùn)練支持上,飛槳框架2.0的RC版本推出sharding策略,開(kāi)發(fā)者使用sharding策略即可訓(xùn)練參數(shù)超過(guò)百億、甚至千億級(jí)別的模型,例如openAI的GPT-3模型,百度的Plato模型。sharding策略的原理是利用模型分片存儲(chǔ),把超大規(guī)模模型參數(shù)的維護(hù)分布在各個(gè)GPU卡上,并通過(guò)集合通信操作All-Gather來(lái)實(shí)現(xiàn)模型參數(shù)的臨時(shí)獲取,在計(jì)算利用局部模型參數(shù)進(jìn)行計(jì)算完成后即釋放臨時(shí)維護(hù)的模型參數(shù)。
飛槳當(dāng)前的并行策略與選項(xiàng)開(kāi)關(guān)較多,面向初級(jí)用戶(hù)的使用仍然存在一定的門(mén)檻,在新版本中,面向用戶(hù)提供可以自動(dòng)并行的第一級(jí)(O1)功能,即并行策略組合功能,飛槳在用戶(hù)開(kāi)啟自動(dòng)并行選項(xiàng)時(shí)即可在底層自動(dòng)打開(kāi)盡可能幫助用戶(hù)加速的并行策略。在隨后的版本中,飛槳還會(huì)逐漸開(kāi)放更高級(jí)的自動(dòng)并行功能,例如在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整并行策略等。
在適配多硬件進(jìn)行分布式訓(xùn)練方面,飛槳正式推出異構(gòu)參數(shù)服務(wù)器訓(xùn)練架構(gòu),充分利用AI芯片的計(jì)算能力提升訓(xùn)練吞吐,并兼容新接入的硬件進(jìn)行并行訓(xùn)練,例如百度的XPU芯片。
飛槳框架新版本全面升級(jí)了面向開(kāi)發(fā)者的編程接口,在分布式訓(xùn)練方面也本著持續(xù)降低用戶(hù)使用門(mén)檻的方向進(jìn)行編程接口的設(shè)計(jì),同時(shí)也兼顧高級(jí)的開(kāi)發(fā)者進(jìn)行底層通信邏輯修改的需求開(kāi)放底層API。在并行訓(xùn)練的策略、功能升級(jí)方面,飛槳也持續(xù)提升了并行訓(xùn)練的橫向擴(kuò)展性和縱向擴(kuò)展性,提供目前最火熱GPT家族模型訓(xùn)練能力,支持千億模型參數(shù)的GPU訓(xùn)練,在對(duì)接硬件生態(tài)方面也推出了大規(guī)模異構(gòu)參數(shù)服務(wù)器訓(xùn)練架構(gòu),方面更多的硬件快速接入飛槳分布式訓(xùn)練能力。
【關(guān)于飛槳】
飛槳(PaddlePaddle)以百度多年的深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),是中國(guó)首個(gè)開(kāi)源開(kāi)放、技術(shù)領(lǐng)先、功能完備的產(chǎn)業(yè)級(jí)深度學(xué)習(xí)平臺(tái),包括飛槳開(kāi)源平臺(tái)和飛槳企業(yè)版。飛槳開(kāi)源平臺(tái)包含核心框架、基礎(chǔ)模型庫(kù)、端到端開(kāi)發(fā)套件與工具組件,持續(xù)開(kāi)源核心能力,為產(chǎn)業(yè)、學(xué)術(shù)、科研創(chuàng)新提供基礎(chǔ)底座。飛槳企業(yè)版基于飛槳開(kāi)源平臺(tái),針對(duì)企業(yè)級(jí)需求增強(qiáng)了相應(yīng)特性,包含零門(mén)檻AI開(kāi)發(fā)平臺(tái)EasyDL和全功能AI開(kāi)發(fā)平臺(tái)BML。EasyDL主要面向中小企業(yè),提供零門(mén)檻、預(yù)置豐富網(wǎng)絡(luò)和模型、便捷高效的開(kāi)發(fā)平臺(tái);BML是為大型企業(yè)提供的功能全面、可靈活定制和被深度集成的開(kāi)發(fā)平臺(tái)。