以下為譯文:
大規(guī)模深度學(xué)習(xí)訓(xùn)練是在現(xiàn)實(shí)世界中構(gòu)建深度學(xué)習(xí)解決方案最具挑戰(zhàn)性的方面之一。 正如俗語(yǔ)所說(shuō),你最大的優(yōu)點(diǎn)可以成為你最大的缺點(diǎn),這一點(diǎn)自然也適用于深度學(xué)習(xí)模型。整個(gè)深度學(xué)習(xí)空間在一定程度上取決于深度神經(jīng)網(wǎng)絡(luò)(DNN)跨越GPU拓?fù)涞哪芰?。然而,同樣的擴(kuò)展能力導(dǎo)致了計(jì)算密集型程序的創(chuàng)建,這給大多數(shù)組織帶來(lái)了操作上的挑戰(zhàn)。從訓(xùn)練到優(yōu)化,深度學(xué)習(xí)項(xiàng)目的生命周期需要健壯的基礎(chǔ)設(shè)施構(gòu)建塊,以便能夠并行化和擴(kuò)展計(jì)算工作負(fù)載。
盡管深度學(xué)習(xí)框架正在快速發(fā)展,但相應(yīng)的基礎(chǔ)架構(gòu)模型仍處于初期階段。在過(guò)去的幾年里,技術(shù)巨頭谷歌、微軟、優(yōu)步(Uber)、DeepMind和其他公司定期發(fā)布了各自的研究成果,以便在大型GPU等基礎(chǔ)設(shè)施上實(shí)現(xiàn)深度學(xué)習(xí)模型的并行化。
分布式和并行化計(jì)算的原理與深度學(xué)習(xí)程序生命周期的幾乎所有階段都息息相關(guān)。訓(xùn)練一個(gè)深度學(xué)習(xí)模型可能是一個(gè)非常昂貴的任務(wù),運(yùn)行也是如此。顯而易見(jiàn)的答案是,可以利用大型GPU網(wǎng)絡(luò)來(lái)分配深度學(xué)習(xí)程序的工作負(fù)載,但這絕非易事。眾所周知,并發(fā)和并行編程是非常復(fù)雜的,尤其在應(yīng)用于大型神經(jīng)網(wǎng)絡(luò)時(shí)更是如此。大型科技公司每天都在面臨這些挑戰(zhàn),因?yàn)樗鼈儽仨殲殛P(guān)鍵業(yè)務(wù)應(yīng)用運(yùn)行極其復(fù)雜的深層神經(jīng)網(wǎng)絡(luò)。
今天,我想回顧一下谷歌、微軟、DeepMind、和優(yōu)步(Uber)等科技巨頭用于并行化大規(guī)模深度學(xué)習(xí)模型訓(xùn)練的一些頂級(jí)框架。具體來(lái)說(shuō),我們將討論以下四個(gè)框架:
谷歌的 GPipe
優(yōu)步的Horovod
DeepMind的TF-Replicator
微軟的 DeepSpeed
谷歌的GPipe
GPipe專(zhuān)注于為深度學(xué)習(xí)項(xiàng)目提高訓(xùn)練工作量。從基礎(chǔ)設(shè)施的角度來(lái)看,訓(xùn)練過(guò)程的復(fù)雜性是深度學(xué)習(xí)模型中經(jīng)常被忽視的一個(gè)方面。訓(xùn)練數(shù)據(jù)集越來(lái)越大,也越來(lái)越復(fù)雜。例如,在醫(yī)療保健領(lǐng)域,遇到需要使用數(shù)百萬(wàn)高分辨率圖像進(jìn)行訓(xùn)練的模型已不罕見(jiàn)。因此,訓(xùn)練過(guò)程通常需要很長(zhǎng)的時(shí)間才能完成,并且由于內(nèi)存和CPU消耗而導(dǎo)致的成本也非常高。
將深度學(xué)習(xí)模型的并行性分為數(shù)據(jù)并行性和模型并行性,是一種研究深度學(xué)習(xí)模型并行性的有效方法。數(shù)據(jù)并行方法使用大量的機(jī)器集群來(lái)拆分輸入數(shù)據(jù)。模型并行性嘗試將模型移至加速器上,如GPU或TPU,它們具有加速模型訓(xùn)練的特殊硬件。在較高的層次上,幾乎所有的訓(xùn)練數(shù)據(jù)集都可以按照一定的邏輯進(jìn)行并行化,但在模型上卻不是這樣。例如,一些深度學(xué)習(xí)模型是由可以獨(dú)立訓(xùn)練的并行分支組成的。在這種情況下,經(jīng)典的策略是將計(jì)算劃分為多個(gè)分區(qū),并將不同的分區(qū)分配給不同的分支。然而,這種策略在連續(xù)堆疊層的深度學(xué)習(xí)模型中存在不足,這給高效并行計(jì)算帶來(lái)了挑戰(zhàn)。
GPipe采用一種稱(chēng)為管道的技術(shù),將數(shù)據(jù)和模型并行性結(jié)合起來(lái)。從概念上講,GPipe是一個(gè)分布式機(jī)器學(xué)習(xí)庫(kù),它使用同步隨機(jī)梯度下降和管道并行性進(jìn)行訓(xùn)練,適用于任何由多個(gè)連續(xù)層組成的深度神經(jīng)網(wǎng)絡(luò)(DNN)。GPipe將一個(gè)模型劃分到不同的加速器上,并自動(dòng)將一個(gè)小批量的訓(xùn)練實(shí)例分割成更小的微批量。該模型允許GPipe的加速器并行運(yùn)行,以最大限度地提高了訓(xùn)練過(guò)程的可伸縮性。
下圖說(shuō)明了具有多個(gè)連續(xù)層的神經(jīng)網(wǎng)絡(luò)的GPipe模型在四個(gè)加速器之間的劃分。Fk是第k個(gè)劃分的復(fù)合正向計(jì)算函數(shù)。Bk是對(duì)應(yīng)的反向傳播函數(shù)。Bk既依賴(lài)于上層的Bk+1,也依賴(lài)于Fk的中間激活。在圖片的上部中,我們可以看到網(wǎng)絡(luò)的順序特性如何導(dǎo)致資源利用不足的。圖片的下部顯示了GPipe方法,其中輸入的小批量(mini-batch)被劃分為更小的宏批量(macro-batch),這些宏批量(macro-batch)可以由加速器同時(shí)處理。
谷歌開(kāi)源了GPipe的一種實(shí)現(xiàn),作為T(mén)ensorFlow項(xiàng)目的一部分。
開(kāi)源地址:https://github.com/tensorflow/lingvo/blob/master/lingvo/core/gpipe.py
優(yōu)步的 Horovod
Horovod是Uber的機(jī)器學(xué)習(xí)(ML)堆棧之一,它已經(jīng)在社區(qū)中非常流行,并且已經(jīng)被DeepMind和OpenAI等人工智能巨頭的研究團(tuán)隊(duì)采用。從概念上講,Horovod是一個(gè)用于大規(guī)模運(yùn)行分布式深度學(xué)習(xí)訓(xùn)練工作的框架。
Horovod利用諸如OpenMPI之類(lèi)的消息傳遞接口棧,來(lái)使訓(xùn)練作業(yè)能夠在高度并行和分布式的基礎(chǔ)設(shè)施上運(yùn)行,而無(wú)需進(jìn)行任何修改。通過(guò)以下四個(gè)簡(jiǎn)單的步驟即可在Horovod中運(yùn)行分布式TensorFlow訓(xùn)練工作:
1、hvd.init()初始化Horovod。
2、config.gpu_options.visible_device_list = str(hvd.local_rank())為每個(gè)TensorFlow進(jìn)程分配一個(gè)GPU。
3、opt=hvd.DistributedOptimizer(opt)使用Horovod優(yōu)化器包裝任何常規(guī)的TensorFlow優(yōu)化器,該優(yōu)化器使用ring-allreduce來(lái)處理平均梯度。
4、hvd.BroadcastGlobalVariablesHook(0)將變量從第一個(gè)進(jìn)程廣播到所有其他進(jìn)程,以確保一致的初始化。
下面這個(gè)代碼示例是一個(gè)基本的TensorFlow訓(xùn)練作業(yè)的模板,你可以從中看到上面的四個(gè)步驟:
DeepMind的TF-Replicator
TF-Replicator專(zhuān)注于TensorFlow程序如何利用Tensor處理單元(TPU)有關(guān)的可伸縮性的另一個(gè)方面。TPU被認(rèn)為是最先進(jìn)的人工智能芯片之一,它為機(jī)器學(xué)習(xí)工作負(fù)載提供了本機(jī)可擴(kuò)展性。然而,在TensorFlow程序中使用TPU需要專(zhuān)門(mén)的API,這會(huì)給不熟悉底層硬件模型的數(shù)據(jù)科學(xué)家們帶來(lái)可移植性問(wèn)題和采用障礙。DeepMind的TF Replicator通過(guò)提供一個(gè)更簡(jiǎn)單、對(duì)開(kāi)發(fā)人員更友好的編程模型來(lái)利用TensorFlow程序中的TPU,從而解決了這一難題。
TF-Replicator的魔力依賴(lài)于一種“圖內(nèi)復(fù)制(in-graph replication)”模型,其中每個(gè)設(shè)備的計(jì)算被復(fù)制到同一張TensorFlow圖中。設(shè)備之間的通信是通過(guò)連接設(shè)備對(duì)應(yīng)子圖中的節(jié)點(diǎn)來(lái)實(shí)現(xiàn)的。為了達(dá)到這種級(jí)別的并行化,TF-Replicator利用TensorFlow的圖重寫(xiě)模型在圖中的設(shè)備之間插入本機(jī)通信。當(dāng)呈現(xiàn)一個(gè)TensorFlow圖時(shí),TF Replicator首先獨(dú)立地為每個(gè)設(shè)備構(gòu)建計(jì)算,并在用戶(hù)指定跨設(shè)備計(jì)算的地方留下占位符。一旦構(gòu)建了所有設(shè)備的子圖,TF Replicator就會(huì)用實(shí)際的跨設(shè)備計(jì)算替換占位符來(lái)連接它們。
從編程模型的角度來(lái)看,使用TF-Replicator編寫(xiě)的代碼看起來(lái)類(lèi)似于為單個(gè)設(shè)備編寫(xiě)的本機(jī)TensorFlow代碼。用戶(hù)只需定義:(1)一個(gè)公開(kāi)數(shù)據(jù)集的輸入函數(shù),和(2)一個(gè)定義其模型邏輯的階躍函數(shù)(例如,梯度下降的單個(gè)階躍)。下面的代碼片段展示了一個(gè)簡(jiǎn)單的TF-Replicator程序:
為了優(yōu)化不同設(shè)備之間的通信,TF-Replicator利用了最先進(jìn)的MPI接口。在一些實(shí)驗(yàn)中,DeepMind能夠在一個(gè)TPUv3 pod的512個(gè)核心上,以2048的batch size批量訓(xùn)練著名的BigGAN模型。目前,TF-Replicator是DeepMind公司的TPU的主要編程接口。
微軟的DeepSpeed
微軟的DeepSpeed是一個(gè)新的開(kāi)源框架,專(zhuān)注于優(yōu)化大型深度學(xué)習(xí)模型的訓(xùn)練。當(dāng)前版本包含了ZeRO的第一個(gè)實(shí)現(xiàn)以及其他優(yōu)化方法。從編程的角度來(lái)看,DeepSpeed是在PyTorch之上構(gòu)建的,它提供了一個(gè)簡(jiǎn)單的API,允許工程師只需幾行代碼就可以利用并行化技術(shù)來(lái)進(jìn)行訓(xùn)練。DeepSpeed抽象了大規(guī)模訓(xùn)練的所有困難方面,例如并行化、混合精度、梯度累積和檢查點(diǎn),使得開(kāi)發(fā)人員可以專(zhuān)注于模型的構(gòu)建。
從功能角度來(lái)看,DeepSpeed在以下四個(gè)關(guān)鍵方面表現(xiàn)出色:
●規(guī)模:DeepSpeed可以為運(yùn)行高達(dá)1,000億個(gè)參數(shù)的模型提供系統(tǒng)支持,這和其他訓(xùn)練優(yōu)化框架相比,提高了10倍。
●速度:在最初的測(cè)試中,DeepSpeed表現(xiàn)出的吞吐量比其他庫(kù)高出4-5倍。
●成本:可以使用DeepSpeed進(jìn)行訓(xùn)練的模型,其成本比其他替代方案少三倍。
●可用性:DeepSpeed不需要重構(gòu)PyTorch模型,僅需幾行代碼即可使用。
將深度學(xué)習(xí)模型的訓(xùn)練并行化是一項(xiàng)非常復(fù)雜的工作,超出了大多數(shù)機(jī)器學(xué)習(xí)團(tuán)隊(duì)的專(zhuān)業(yè)知識(shí)。利用谷歌、微軟、優(yōu)步或DeepMind等科技公司創(chuàng)建的框架和架構(gòu),肯定可以簡(jiǎn)化這些工作。
在不久的將來(lái),我們希望看到這些框架的一些版本包含在主流深度學(xué)習(xí)堆棧中,以加速核心深度學(xué)習(xí)社區(qū)準(zhǔn)入的民主化。
原文鏈接:
https://towardsdatascience.com/the-frameworks-that-google-deepmind-microsoft-and-uber-use-to-train-deep-learning-models-at-scale-30be6295725