編者按:Google、Uber、DeepMind和Microsoft這四大科技公司是當(dāng)前將深度學(xué)習(xí)研究廣泛應(yīng)用于自身業(yè)務(wù)的典型代表,躋身全球深度學(xué)習(xí)研究水平最高的科技公司之列。GPipe、Horovod、TF Replicator和DeepSpeed分別是這四家公司開發(fā)應(yīng)用的深度學(xué)習(xí)框架,它們結(jié)合了深度學(xué)習(xí)研究及其基礎(chǔ)設(shè)施的前沿技術(shù),以提高深度學(xué)習(xí)模型的訓(xùn)練效率。這四個(gè)深度學(xué)習(xí)框架各有什么特點(diǎn)和優(yōu)勢(shì)呢?本文將對(duì)此做一個(gè)基本介紹。 以下為譯文:
大規(guī)模深度學(xué)習(xí)訓(xùn)練是在現(xiàn)實(shí)世界中構(gòu)建深度學(xué)習(xí)解決方案最具挑戰(zhàn)性的方面之一。 正如俗語所說,你最大的優(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ù)組織帶來了操作上的挑戰(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)模型仍處于初期階段。在過去的幾年里,技術(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)行也是如此。顯而易見的答案是,可以利用大型GPU網(wǎng)絡(luò)來分配深度學(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í)框架。具體來說,我們將討論以下四個(gè)框架: 谷歌的 GPipe 優(yōu)步的Horovod DeepMind的TF-Replicator 微軟的 DeepSpeed
谷歌的GPipe GPipe專注于為深度學(xué)習(xí)項(xiàng)目提高訓(xùn)練工作量。從基礎(chǔ)設(shè)施的角度來看,訓(xùn)練過程的復(fù)雜性是深度學(xué)習(xí)模型中經(jīng)常被忽視的一個(gè)方面。訓(xùn)練數(shù)據(jù)集越來越大,也越來越復(fù)雜。例如,在醫(yī)療保健領(lǐng)域,遇到需要使用數(shù)百萬高分辨率圖像進(jìn)行訓(xùn)練的模型已不罕見。因此,訓(xùn)練過程通常需要很長(zhǎng)的時(shí)間才能完成,并且由于內(nèi)存和CPU消耗而導(dǎo)致的成本也非常高。 將深度學(xué)習(xí)模型的并行性分為數(shù)據(jù)并行性和模型并行性,是一種研究深度學(xué)習(xí)模型并行性的有效方法。數(shù)據(jù)并行方法使用大量的機(jī)器集群來拆分輸入數(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ì)算帶來了挑戰(zhàn)。 GPipe采用一種稱為管道的技術(shù),將數(shù)據(jù)和模型并行性結(jié)合起來。從概念上講,GPipe是一個(gè)分布式機(jī)器學(xué)習(xí)庫,它使用同步隨機(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)練過程的可伸縮性。 下圖說明了具有多個(gè)連續(xù)層的神經(jīng)網(wǎng)絡(luò)的GPipe模型在四個(gè)加速器之間的劃分。Fk是第k個(gè)劃分的復(fù)合正向計(jì)算函數(shù)。Bk是對(duì)應(yīng)的反向傳播函數(shù)。Bk既依賴于上層的Bk+1,也依賴于Fk的中間激活。在圖片的上部中,我們可以看到網(wǎng)絡(luò)的順序特性如何導(dǎo)致資源利用不足的。圖片的下部顯示了GPipe方法,其中輸入的小批量(mini-batch)被劃分為更小的宏批量(macro-batch),這些宏批量(macro-batch)可以由加速器同時(shí)處理。 谷歌開源了GPipe的一種實(shí)現(xiàn),作為TensorFlow項(xiàng)目的一部分。 開源地址: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之類的消息傳遞接口棧,來使訓(xùn)練作業(yè)能夠在高度并行和分布式的基礎(chǔ)設(shè)施上運(yùn)行,而無需進(jìn)行任何修改。通過以下四個(gè)簡(jiǎn)單的步驟即可在Horovod中運(yùn)行分布式TensorFlow訓(xùn)練工作: - config.gpu_options.visible_device_list = str(hvd.local_rank())為每個(gè)TensorFlow進(jìn)程分配一個(gè)GPU。
- opt=hvd.DistributedOptimizer(opt)使用Horovod優(yōu)化器包裝任何常規(guī)的TensorFlow優(yōu)化器,該優(yōu)化器使用ring-allreduce來處理平均梯度。
- hvd.BroadcastGlobalVariablesHook(0)將變量從第一個(gè)進(jìn)程廣播到所有其他進(jìn)程,以確保一致的初始化。
下面這個(gè)代碼示例是一個(gè)基本的TensorFlow訓(xùn)練作業(yè)的模板,你可以從中看到上面的四個(gè)步驟: 1import tensorflow as tf 2import horovod.tensorflow as hvd# Initialize Horovod 3hvd.init()# Pin GPU to be used to process local rank (one GPU per process) 4config = tf.ConfigProto() 5config.gpu_options.visible_device_list = str(hvd.local_rank())# Build model… 6loss = … 7opt = tf.train.AdagradOptimizer(0.01)# Add Horovod Distributed Optimizer 8opt = hvd.DistributedOptimizer(opt)# Add hook to broadcast variables from rank 0 to all other processes during 9# initialization. 10hooks = [hvd.BroadcastGlobalVariablesHook(0)]# Make training operation 11train_op = opt.minimize(loss)# The MonitoredTrainingSession takes care of session initialization, 12# restoring from a checkpoint, saving to a checkpoint, and closing when done 13# or an error occurs. 14with tf.train.MonitoredTrainingSession(checkpoint_dir=“/tmp/train_logs”, 15 config=config, 16 hooks=hooks) as mon_sess: 17 while not mon_sess.should_stop(): 18 # Perform synchronous training. 19 mon_sess.run(train_op)
TF-Replicator專注于TensorFlow程序如何利用Tensor處理單元(TPU)有關(guān)的可伸縮性的另一個(gè)方面。TPU被認(rèn)為是最先進(jìn)的人工智能芯片之一,它為機(jī)器學(xué)習(xí)工作負(fù)載提供了本機(jī)可擴(kuò)展性。然而,在TensorFlow程序中使用TPU需要專門的API,這會(huì)給不熟悉底層硬件模型的數(shù)據(jù)科學(xué)家們帶來可移植性問題和采用障礙。DeepMind的TF Replicator通過提供一個(gè)更簡(jiǎn)單、對(duì)開發(fā)人員更友好的編程模型來利用TensorFlow程序中的TPU,從而解決了這一難題。TF-Replicator的魔力依賴于一種“圖內(nèi)復(fù)制(in-graph replication)”模型,其中每個(gè)設(shè)備的計(jì)算被復(fù)制到同一張TensorFlow圖中。設(shè)備之間的通信是通過連接設(shè)備對(duì)應(yīng)子圖中的節(jié)點(diǎn)來實(shí)現(xiàn)的。為了達(dá)到這種級(jí)別的并行化,TF-Replicator利用TensorFlow的圖重寫模型在圖中的設(shè)備之間插入本機(jī)通信。當(dāng)呈現(xiàn)一個(gè)TensorFlow圖時(shí),TF Replicator首先獨(dú)立地為每個(gè)設(shè)備構(gòu)建計(jì)算,并在用戶指定跨設(shè)備計(jì)算的地方留下占位符。一旦構(gòu)建了所有設(shè)備的子圖,TF Replicator就會(huì)用實(shí)際的跨設(shè)備計(jì)算替換占位符來連接它們。從編程模型的角度來看,使用TF-Replicator編寫的代碼看起來類似于為單個(gè)設(shè)備編寫的本機(jī)TensorFlow代碼。用戶只需定義:(1)一個(gè)公開數(shù)據(jù)集的輸入函數(shù),和(2)一個(gè)定義其模型邏輯的階躍函數(shù)(例如,梯度下降的單個(gè)階躍)。下面的代碼片段展示了一個(gè)簡(jiǎn)單的TF-Replicator程序: 1# Deploying a model with TpuReplicator. 2repl = tf_replicator.TpuReplicator( 3num_workers=1, num_tpu_cores_per_worker=8 4) 5with repl.context(): 6model = resnet_model() 7base_optimizer = tf.train.AdamOptimizer() 8optimizer = repl.wrap_optimizer(base_optimizer)# ... code to define replica input_fn and step_fn.per_replica_loss = repl.run(step_fn, input_fn) 9train_op = tf.reduce_mean(per_replica_loss)with tf.train.MonitoredSession() as session: 10repl.init(session) 11for i in xrange(num_train_steps): 12session.run(train_op) 13repl.shutdown(session)
為了優(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是一個(gè)新的開源框架,專注于優(yōu)化大型深度學(xué)習(xí)模型的訓(xùn)練。當(dāng)前版本包含了ZeRO的第一個(gè)實(shí)現(xiàn)以及其他優(yōu)化方法。從編程的角度來看,DeepSpeed是在PyTorch之上構(gòu)建的,它提供了一個(gè)簡(jiǎn)單的API,允許工程師只需幾行代碼就可以利用并行化技術(shù)來進(jìn)行訓(xùn)練。DeepSpeed抽象了大規(guī)模訓(xùn)練的所有困難方面,例如并行化、混合精度、梯度累積和檢查點(diǎn),使得開發(fā)人員可以專注于模型的構(gòu)建。從功能角度來看,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)出的吞吐量比其他庫高出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ì)的專業(yè)知識(shí)。利用谷歌、微軟、優(yōu)步或DeepMind等科技公司創(chuàng)建的框架和架構(gòu),肯定可以簡(jiǎn)化這些工作。在不久的將來,我們希望看到這些框架的一些版本包含在主流深度學(xué)習(xí)堆棧中,以加速核心深度學(xué)習(xí)社區(qū)準(zhǔn)入的民主化。https:///the-frameworks-that-google-deepmind-microsoft-and-uber-use-to-train-deep-learning-models-at-scale-30be6295725 本文為CSDN翻譯文章,轉(zhuǎn)載請(qǐng)注明出處。
|