分布式训练基本原理
分布式訓(xùn)練基本原理
近十年來(lái),深度學(xué)習(xí)技術(shù)不斷刷新視覺、自然語(yǔ)言、語(yǔ)音、搜索、推薦等領(lǐng)域各種任務(wù)的紀(jì)錄。這其中的原因,用一個(gè)關(guān)鍵詞描述就是“大規(guī)模”。大規(guī)模的數(shù)據(jù)使得模型有足夠的知識(shí)可以記憶,大規(guī)模參數(shù)量的模型使得模型本身有能力記憶更多的數(shù)據(jù),大規(guī)模高性能的算力(以GPU為典型代表)使得模型的訓(xùn)練速度有百倍甚至千倍的提升。數(shù)據(jù)、模型、算力的發(fā)展催生了大規(guī)模深度學(xué)習(xí)這個(gè)領(lǐng)域,如何進(jìn)行多機(jī)任務(wù)的拆分、如何配置集群訓(xùn)練資源、如何平衡訓(xùn)練速度和收斂速度、如何訓(xùn)練單機(jī)無(wú)法訓(xùn)練的模型、彈性訓(xùn)練與容錯(cuò)等都是這個(gè)方向重點(diǎn)研究的問(wèn)題。分布式訓(xùn)練正是解決上述問(wèn)題,提升訓(xùn)練效率的最有效手段。分布式訓(xùn)練的核心目的是加快模型的訓(xùn)練速度,如何加快訓(xùn)練速度的呢?首先,可以把單機(jī)單卡的模型訓(xùn)練過(guò)程看成是一個(gè)流水線生產(chǎn)的過(guò)程,數(shù)據(jù)就是輸入生產(chǎn)線的原材料,而模型的網(wǎng)絡(luò)可以看成生產(chǎn)線上的加工設(shè)備。數(shù)據(jù)經(jīng)過(guò)第一個(gè)生產(chǎn)環(huán)節(jié)處理后,得到的結(jié)果發(fā)給下一個(gè)環(huán)節(jié)處理,后面環(huán)節(jié)依次類推。后來(lái)工廠要求提高生產(chǎn)效率,最直觀的方法就是再加一條生產(chǎn)線,分出一部分原材料交由新生產(chǎn)線處理,這樣生產(chǎn)的時(shí)間直接壓縮了一半,有哪些生產(chǎn)環(huán)節(jié)可以同時(shí)做的,可以直接對(duì)單個(gè)生產(chǎn)線進(jìn)行拆分重組。分布式訓(xùn)練采用了同樣的方式,即將訓(xùn)練任務(wù)按照一定方法拆分到多個(gè)計(jì)算節(jié)點(diǎn)進(jìn)行計(jì)算,再按照一定的方法對(duì)拆分后計(jì)算得到的信息,一般是梯度信息或基于梯度更新后的參數(shù)信息,進(jìn)行聚合。這個(gè)拆分可以采用多種不同的方式,一般被統(tǒng)稱為“并行方式”,而信息聚合的方式可以稱為“模型更新傳遞方式”。下面將從這兩個(gè)方面對(duì)分布式訓(xùn)練進(jìn)行介紹。
分布式訓(xùn)練的并行方式
在分布式訓(xùn)練過(guò)程中,并不是所有的訓(xùn)練任務(wù)都可以拆分,當(dāng)前常用的拆分方式有如下幾種:
? 數(shù)據(jù)并行:將數(shù)據(jù)集切分放到各計(jì)算節(jié)點(diǎn),每個(gè)計(jì)算節(jié)點(diǎn)的計(jì)算內(nèi)容完全一致,并在多個(gè)計(jì)算節(jié)點(diǎn)之間傳遞模型參數(shù),通常稱這種并行訓(xùn)練方法為數(shù)據(jù)并行。數(shù)據(jù)并行可以解決數(shù)據(jù)集過(guò)大無(wú)法在單機(jī)高效率訓(xùn)練的問(wèn)題,也是工業(yè)生產(chǎn)中最常用的并行方法。
? 模型并行:通常指將模型單個(gè)算子計(jì)算分治到多個(gè)硬件設(shè)備上并發(fā)計(jì)算,以達(dá)到計(jì)算單個(gè)算子計(jì)算速度的目的。一般會(huì)將單個(gè)算子的計(jì)算,利用模型并行的方式分配在配置相同的幾個(gè)硬件上,進(jìn)行模型存儲(chǔ)和計(jì)算,以保證計(jì)算步調(diào)一致。
? 流水線并行:一般是指將模型的不同算子,拆分到不同的硬件設(shè)備上進(jìn)行計(jì)算,通過(guò)生產(chǎn)者-消費(fèi)者的方式(流水線)完成不同設(shè)備之間的數(shù)據(jù)流通。深度學(xué)習(xí)中的跨設(shè)備交換數(shù)據(jù)場(chǎng)景很多,例如硬盤數(shù)據(jù)到內(nèi)存,內(nèi)存數(shù)據(jù)到顯存,內(nèi)存數(shù)據(jù)到網(wǎng)卡等,由于不同硬件之間處理數(shù)據(jù)的速度通常不一致,通常會(huì)采用流水線并行的方式進(jìn)行訓(xùn)練效率最大化。
在工業(yè)場(chǎng)景的實(shí)踐中,分布式模型訓(xùn)練也會(huì)采用不同并行方式的組合,例如數(shù)據(jù)并行與模型并行結(jié)合,數(shù)據(jù)并行與流水線并行結(jié)合等。其中數(shù)據(jù)并行的應(yīng)用范圍最廣,像搜索、推薦領(lǐng)域的深度學(xué)習(xí)模型,通常都是采用數(shù)據(jù)并行的方式進(jìn)行切分的,而后面講到的飛槳paddle分布式訓(xùn)練的幾種架構(gòu)方案中,基本都采用了數(shù)據(jù)并行方式,然后再與其它并行方式配合使用。
分布式訓(xùn)練中的模型參數(shù)傳遞
雖然訓(xùn)練任務(wù)可以拆分,但是在一個(gè)Batch的數(shù)據(jù)訓(xùn)練完成后,下一個(gè)Batch的數(shù)據(jù)訓(xùn)練開始之前,必須先更新Worker上的模型參數(shù),因此模型參數(shù)的更新傳遞是分布式訓(xùn)練中非常重要的一環(huán),模型參數(shù)信息的傳遞方式和更新頻率都會(huì)直接影響模型的最終效果:
? 參數(shù)傳遞方式很大程度決定于參與分布式訓(xùn)練的硬件資源選用的組織架構(gòu)類型,通常有兩種架構(gòu)方式,參數(shù)服務(wù)器架構(gòu)和Collective架構(gòu),后面將會(huì)位大家詳細(xì)介紹。
? 參數(shù)更新頻率是指以什么樣的節(jié)奏更新參數(shù)。這同樣有兩種方式,一個(gè)是同步,即所有Worker節(jié)點(diǎn),共同完成一個(gè)Batch的數(shù)據(jù)訓(xùn)練后統(tǒng)一更新,另一個(gè)是異步,每個(gè)Worker節(jié)點(diǎn),完成自己負(fù)責(zé)的數(shù)據(jù)部分的訓(xùn)練后,就直接開始更新參數(shù)。
下面先來(lái)看下分布式訓(xùn)練的架構(gòu)。
分布式訓(xùn)練架構(gòu)
在分布式訓(xùn)練的兩種常用架構(gòu)中, Collective架構(gòu)多被用于視覺、自然語(yǔ)言處理等需要復(fù)雜網(wǎng)絡(luò)計(jì)算的模型訓(xùn)練任務(wù)場(chǎng)景,而參數(shù)服務(wù)器架構(gòu)多被用于搜索推薦場(chǎng)景中大規(guī)模稀疏特征模型的訓(xùn)練任務(wù)。下面會(huì)分別具體介紹下這兩種架構(gòu)。
參數(shù)服務(wù)器架構(gòu)
參數(shù)服務(wù)器架構(gòu)是一種中心化架構(gòu),該架構(gòu)采用將模型參數(shù)進(jìn)行中心化管理的方式實(shí)現(xiàn)模型參數(shù)的更新和分發(fā)。參數(shù)服務(wù)器架構(gòu)有兩個(gè)角色Server與Worker,值得注意的是,Server與Worker不一定對(duì)應(yīng)實(shí)際的硬件,可以理解為是進(jìn)程。Server負(fù)責(zé)參數(shù)的分片存儲(chǔ)與更新,Worker則會(huì)保存有完整的模型網(wǎng)絡(luò)結(jié)構(gòu),用于執(zhí)行模型的前向與反向計(jì)算。常規(guī)的參數(shù)服務(wù)器的Worker節(jié)點(diǎn),需要使用統(tǒng)一型號(hào)的CPU或GPU機(jī)器完成模型訓(xùn)練。
每個(gè)Worker在執(zhí)行每一步訓(xùn)練時(shí),都可以向參數(shù)服務(wù)器發(fā)出請(qǐng)求,獲取全局最新的模型參數(shù),并基于最新的模型參數(shù)計(jì)算當(dāng)前數(shù)據(jù)的模型梯度。當(dāng)Worker基于最新的模型參數(shù)完成模型梯度的計(jì)算后,會(huì)將模型梯度發(fā)回給Server。參數(shù)服務(wù)器架構(gòu)通常可以對(duì)模型參數(shù)的存儲(chǔ)進(jìn)行分布式保存,因此對(duì)于存儲(chǔ)超大規(guī)模模型參數(shù)的訓(xùn)練場(chǎng)景十分友好,這也是該架構(gòu)在個(gè)性化推薦場(chǎng)景中,應(yīng)該任務(wù)中需要保存的海量稀疏特征對(duì)應(yīng)的模型參數(shù),通常就只能采用參數(shù)服務(wù)器架構(gòu)才能實(shí)現(xiàn)。
Collective架構(gòu)
Collective架構(gòu)是一種去中心化的架構(gòu),也是近年來(lái)非常流行的分布式訓(xùn)練架構(gòu)。該架構(gòu)沒有所謂管理模型參數(shù)的中心節(jié)點(diǎn),每個(gè)設(shè)備都是Worker,這個(gè)Worker同樣是進(jìn)程的概念。每個(gè)Worker負(fù)責(zé)模型的訓(xùn)練同時(shí)還需要掌握當(dāng)前最新的全局信息。
在Collective架構(gòu)中,多節(jié)點(diǎn)間的參數(shù)信息的傳輸通常是各個(gè)Worker之間多次點(diǎn)對(duì)點(diǎn)通信完成的,比較經(jīng)典的通信算法,例如Baidu Ring All Reduce,可以采用較少的點(diǎn)對(duì)點(diǎn)通信輪數(shù)完成全局節(jié)點(diǎn)的模型參數(shù)傳輸。Collective架構(gòu)通常在現(xiàn)代高性能AI芯片中使用較多,這種架構(gòu)對(duì)計(jì)算芯片的算力和芯片之間的網(wǎng)絡(luò)互聯(lián)要求較高。高性能計(jì)算的AI芯片例如GPU,芯片之間的高速網(wǎng)絡(luò)互聯(lián)例如NVLINK, InfiniBand,都加快的Collective架構(gòu)的發(fā)展。Collective訓(xùn)練架構(gòu)對(duì)于計(jì)算密集的任務(wù)非常友好,熟知的經(jīng)典模型,例如機(jī)器翻譯中的Transformer,圖像分類中的ResNet50,語(yǔ)音識(shí)別中的DeepSpeech2通常都是采用這種訓(xùn)練架構(gòu)完成。
參數(shù)更新頻率
如前所述,參數(shù)同步的方式與訓(xùn)練架構(gòu)的選取有關(guān),即是統(tǒng)一由Server更新和分發(fā),還是Worker間相互同步,這是關(guān)系到訓(xùn)練效果的重要因素之一,而另一個(gè)因素就是參數(shù)同步的頻率,即什么時(shí)候同步參數(shù),用戶同樣可以選擇兩種方式的一種,即同步和異步,下面將會(huì)分布進(jìn)行介紹。
同步訓(xùn)練
同步訓(xùn)練通常是指每個(gè)Worker在模型訓(xùn)練的每一步都進(jìn)行一次模型參數(shù)的全局更新,參數(shù)服務(wù)器架構(gòu)和Collective架構(gòu)都可以采用這種方式。這種方式在本質(zhì)上與單機(jī)訓(xùn)練一致,只是單步訓(xùn)練的總數(shù)據(jù)量會(huì)更大。值得一提的是,在參數(shù)服務(wù)器架構(gòu)下的同步訓(xùn)練,優(yōu)化算法的執(zhí)行是發(fā)生在參數(shù)服務(wù)器一端,而在Collective架構(gòu)下,通過(guò)對(duì)每一步所有樣本產(chǎn)生的模型參數(shù)梯度進(jìn)行全局同步后,由每個(gè)Worker執(zhí)行優(yōu)化算法,相當(dāng)于優(yōu)化了全局的模型參數(shù)。下圖展示了單機(jī)SGD算法,基于Collective架構(gòu)的同步SGD算法,基于參數(shù)服務(wù)器的異步SGD算法在計(jì)算步驟上的區(qū)別。可以看到Collective架構(gòu)發(fā)生通信的位置比較集中,并行是通過(guò)與正在訓(xùn)練的其他節(jié)點(diǎn)進(jìn)行Collective通信完成,每個(gè)節(jié)點(diǎn)只需要關(guān)注自己即可。參數(shù)服務(wù)器架構(gòu)在獲取參數(shù),推送參數(shù)梯度等操作上都需要與參數(shù)服務(wù)器進(jìn)行通信,參數(shù)服務(wù)器架構(gòu)下的參數(shù)服務(wù)器端,要等待每個(gè)計(jì)算節(jié)點(diǎn)發(fā)送的梯度信息進(jìn)行匯總后再進(jìn)行模型參數(shù)的更新。
異步并行訓(xùn)練算法
異步訓(xùn)練在參數(shù)服務(wù)器架構(gòu)下采用較多,其本質(zhì)就是讓每個(gè)Worker不用關(guān)心其他節(jié)點(diǎn)的計(jì)算步調(diào),獨(dú)自與參數(shù)服務(wù)器完成模型參數(shù)的更新。異步訓(xùn)練情況下,參數(shù)服務(wù)器端的模型參數(shù)更新也是異步進(jìn)行,即不需要等待其他正在計(jì)算的節(jié)點(diǎn)的進(jìn)度。異步訓(xùn)練下,各個(gè)計(jì)算節(jié)點(diǎn)的計(jì)算頻率不同,參數(shù)服務(wù)器更新模型參數(shù)的頻率也會(huì)不同,這種特性使得模型的收斂可能存在一定的問(wèn)題,能夠保證高效率收斂的異步并行算法是一個(gè)研究比較多的領(lǐng)域。下圖是一個(gè)單機(jī)SGD與參數(shù)服務(wù)器架構(gòu)下的異步SGD的計(jì)算步驟對(duì)比,可以看到參數(shù)服務(wù)器一端與同步SGD的區(qū)別在于,不需要對(duì)各個(gè)節(jié)點(diǎn)的梯度進(jìn)行匯聚而直接進(jìn)行模型參數(shù)的更新。
飛槳paddle分布式API
盡管分布式訓(xùn)練能夠大大提升用戶在大規(guī)模數(shù)據(jù)下的模型訓(xùn)練速度,如前面背景知識(shí)的描述可知普通用戶想快速掌握并行訓(xùn)練的方法并不容易,將飛槳paddle的單機(jī)訓(xùn)練程序轉(zhuǎn)換成多機(jī)訓(xùn)練程序會(huì)給用戶帶來(lái)一定的使用成本。為了降低用戶使用分布式訓(xùn)練的門檻,飛槳paddle官方支持分布式訓(xùn)練高層API Fleet,作為分布式訓(xùn)練的統(tǒng)一入口API,用戶可以在單機(jī)程序的基礎(chǔ)上進(jìn)行簡(jiǎn)單的幾行代碼修改,可實(shí)現(xiàn)多種類型的并行訓(xùn)練方式。后面結(jié)合Fleet API介紹飛槳paddle數(shù)據(jù)并行方法,在參數(shù)服務(wù)器架構(gòu)和Collective架構(gòu)下,使用方法以及具體模型上的使用示例。
總結(jié)
- 上一篇: 服务化部署框架Paddle Servin
- 下一篇: 多机多卡训练基本原理