世界頂尖科技公司的工程師常常發(fā)現(xiàn),為了滿足公司的獨(dú)特需求,他們不得不為現(xiàn)有軟件基礎(chǔ)上開發(fā)定制替代方案。
近日,Uber將自己的Horovod(一個(gè)跨多臺(tái)機(jī)器的分布式深度學(xué)習(xí)訓(xùn)練框架)引入開源項(xiàng)目LF深度學(xué)習(xí)基金會(huì)。Uber利用Horovod支持自動(dòng)駕駛汽車、欺詐檢測(cè)和出行預(yù)測(cè),該項(xiàng)目的貢獻(xiàn)者包括Amazon、IBM、Intel和Nvidia。
Horovod是一個(gè)分布式的TensorFlow訓(xùn)練框架,目標(biāo)是使分布式深度學(xué)習(xí)快速且易于使用。在Uber內(nèi)部,他們發(fā)現(xiàn)MPI模型比帶參數(shù)服務(wù)器的分布式TensorFlow簡(jiǎn)單得多,所需的代碼更改也少得多。
除了Uber,阿里巴巴、亞馬遜和Nvidia也在使用Horovod。Horovod項(xiàng)目可以與TensorFlow、Keras和PyTorch等流行框架一起使用。
Uber上個(gè)月加入了Linux基金會(huì),并加入了AT&T和諾基亞等其他科技公司的行列,支持LF深度學(xué)習(xí)基金會(huì)的開源項(xiàng)目。LF深度學(xué)習(xí)基金會(huì)成立于3月,旨在支持針對(duì)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的開源項(xiàng)目,是Linux基金會(huì)的一部分。
自該基金會(huì)成立以來(lái),其他項(xiàng)目還包括機(jī)器學(xué)習(xí)平臺(tái)Angel和彈性深度學(xué)習(xí)(Elastic Deep learning),這是一個(gè)幫助云服務(wù)提供商利用TensorFlow等框架制作云集群服務(wù)的項(xiàng)目。
根據(jù)Uber的說(shuō)法,Horovod讓開發(fā)人員只需幾行代碼就可以完成任務(wù)。這不僅加快了初始修改過(guò)程,而且進(jìn)一步簡(jiǎn)化了調(diào)試。考慮到深度學(xué)習(xí)項(xiàng)目的高度迭代性,這同樣可以節(jié)省大量時(shí)間。
在過(guò)去的幾年里,深度學(xué)習(xí)的進(jìn)步推動(dòng)了圖像處理、語(yǔ)音識(shí)別和預(yù)測(cè)的巨大進(jìn)步。在Uber,深度學(xué)習(xí)應(yīng)用于整個(gè)業(yè)務(wù),從自動(dòng)駕駛研究到出行預(yù)測(cè)和欺詐預(yù)防,并為用戶創(chuàng)造更好的體驗(yàn)。
由于種種原因,TensorFlow已經(jīng)成為Uber首選的深度學(xué)習(xí)庫(kù)。首先,該框架是用于深度學(xué)習(xí)的最廣泛使用的開源框架之一,這使得新用戶很容易上手。
它還結(jié)合了高性能和修補(bǔ)低級(jí)模型細(xì)節(jié)的能力——例如,可以同時(shí)使用高級(jí)api,如Keras,并使用NVIDIA的CUDA工具包實(shí)現(xiàn)自己的自定義操作符。
此外,TensorFlow還支持各種深度學(xué)習(xí)用例的端到端支持,從進(jìn)行探索性研究到將模型部署到云服務(wù)器、移動(dòng)應(yīng)用程序甚至自動(dòng)駕駛汽車上。
去年,Uber Engineering推出了米開朗基羅(Michelangelo),這是一個(gè)內(nèi)部的“mvc即服務(wù)”(mvc -as-a-service)平臺(tái),它讓機(jī)器學(xué)習(xí)自主化,讓大規(guī)模構(gòu)建和部署這些系統(tǒng)變得容易。
Horovod正是這個(gè)米開朗基羅復(fù)雜平臺(tái)的組成部分,Uber開發(fā)這個(gè)平臺(tái)是為了為其內(nèi)部的深度學(xué)習(xí)努力奠定基礎(chǔ)。該公司將該軟件描述為管理AI開發(fā)生命周期各個(gè)方面的端到端系統(tǒng)。
鑒于Uber此次宣布開放Horovod,它可能還會(huì)隨著時(shí)間的推移發(fā)布米開朗基羅其他組件的代碼。
Horovod的出現(xiàn),也反應(yīng)不同企業(yè)在縱深涉及深度學(xué)習(xí)時(shí)遇到了不少問(wèn)題。
隨著Uber使用越來(lái)越多的機(jī)器學(xué)習(xí)模型,它們的規(guī)模和數(shù)據(jù)消耗顯著增長(zhǎng)。在大多數(shù)情況下,模型仍然足夠小,可以容納一個(gè)服務(wù)器中的一個(gè)或多個(gè)GPU,但是隨著數(shù)據(jù)集的增長(zhǎng),訓(xùn)練時(shí)間也在增加,有時(shí)需要一周甚至更長(zhǎng)時(shí)間。
此后,Uber轉(zhuǎn)向了分布式深度學(xué)習(xí)訓(xùn)練。標(biāo)準(zhǔn)的分布式TensorFlow包引入了許多新概念:workers、參數(shù)服務(wù)器、tf.Server()、tf.ClusterSpec()、tf.train. syncreasoptimizer()和tf.train.replicas_device_setter()等等。雖然對(duì)某些場(chǎng)景有益,但這也引入了難以診斷的bug,從而減慢了訓(xùn)練速度。
第二個(gè)問(wèn)題是關(guān)于Uber規(guī)模計(jì)算的挑戰(zhàn)。在運(yùn)行了一些基準(zhǔn)測(cè)試之后,他們發(fā)現(xiàn)不能使標(biāo)準(zhǔn)的分布式TensorFlow按比例擴(kuò)展,以及需要的服務(wù)。例如,在128個(gè)GPU上進(jìn)行訓(xùn)練時(shí),由于效率低下,損失了大約一半的資源。
當(dāng)Uber在128個(gè)NVIDIA Pascal GPU上運(yùn)行標(biāo)準(zhǔn)的TensorFlow基準(zhǔn)測(cè)試套件時(shí),他們發(fā)現(xiàn)Inception V3和ResNet-101模型都無(wú)法利用將近一半的GPU資源。
標(biāo)準(zhǔn)的分布式TensorFlow包使用參數(shù)服務(wù)器方法來(lái)平均梯度。在這種方法中,每個(gè)流程都有兩個(gè)潛在角色之一:Worker或參數(shù)服務(wù)器。Worker用于處理訓(xùn)練數(shù)據(jù),計(jì)算梯度,并將它們發(fā)送到參數(shù)服務(wù)器進(jìn)行平均。
Uber認(rèn)為,雖然這種方法提高了性能,但遇到了兩個(gè)挑戰(zhàn):確定Worker與參數(shù)服務(wù)器的正確比例。
如果使用一個(gè)參數(shù)服務(wù)器,它可能會(huì)成為網(wǎng)絡(luò)或計(jì)算瓶頸。如果使用多個(gè)參數(shù)服務(wù)器,通信模式將變成“all-to-all”,這可能會(huì)使網(wǎng)絡(luò)互連飽和。
處理增加TensorFlow程序復(fù)雜性:在測(cè)試中,每個(gè)用戶的分布式TensorFlow必須顯式啟動(dòng)每個(gè)Worker和參數(shù)服務(wù)器,通過(guò)服務(wù)發(fā)現(xiàn)周圍信息,如所有的Worker和參數(shù)服務(wù)器的主機(jī)和端口,并修改培訓(xùn)計(jì)劃構(gòu)建tf.Server()和一個(gè)適當(dāng)?shù)膖f.ClusterSpec()。
此外,用戶必須確保使用tf.train.device_replica_setter()適當(dāng)?shù)胤胖盟胁僮鳎⑿薷拇a以使用towers來(lái)利用服務(wù)器中的多個(gè)GPU。這通常會(huì)導(dǎo)致陡峭的學(xué)習(xí)曲線和大量的代碼重構(gòu),從而占用實(shí)際建模的時(shí)間。
2017年初,百度發(fā)表了一篇文章《將HPC技術(shù)深度學(xué)習(xí)》,涉及到不同的算法平均梯度和溝通這些梯度(上面的第2步和第3步),該算法基于Patarasuk和Yuan在2009年的論文《工作站集群帶寬最優(yōu)全約算法》中引入的方法。
在環(huán)約簡(jiǎn)算法中,每個(gè)N個(gè)節(jié)點(diǎn)與兩個(gè)節(jié)點(diǎn)通信2*(N-1)次。在此通信過(guò)程中,節(jié)點(diǎn)發(fā)送和接收數(shù)據(jù)緩沖區(qū)的塊。在前N-1次迭代中,接收到的值被添加到節(jié)點(diǎn)緩沖區(qū)的值中。在第二次N-1迭代中,接收到的值替換節(jié)點(diǎn)緩沖區(qū)中保存的值。
百度的論文認(rèn)為,該算法是帶寬最優(yōu)的,這意味著如果緩沖區(qū)足夠大,它將最優(yōu)地利用可用網(wǎng)絡(luò)。
Uber也意識(shí)到,采用環(huán)減少(ring-allreduce)方法可以提高可用性和性能,這促使我們自己開發(fā)實(shí)現(xiàn),以滿足Uber的TensorFlow需求。隨后,Uber采用了百度的TensorFlow ring-allreduce算法,并在此基礎(chǔ)上進(jìn)行了構(gòu)建。
Uber將代碼轉(zhuǎn)換為一個(gè)名為Horovod的獨(dú)立Python包,這個(gè)包是以俄羅斯傳統(tǒng)的民間舞蹈命名的,在這種舞蹈中,表演者挽著手臂繞圈跳舞,就像分布式TensorFlow進(jìn)程使用Horovod彼此通信一樣。
Uber目前的不同團(tuán)隊(duì)都可能使用不同版本的TensorFlow,但他們希望所有團(tuán)隊(duì)都能夠利用ring-allreduce算法,而不需要升級(jí)到TensorFlow的最新版本,對(duì)自己的版本應(yīng)用補(bǔ)丁,甚至不需要花時(shí)間構(gòu)建框架。
有了一個(gè)獨(dú)立的包,Uber表示就可以根據(jù)硬件的不同,將安裝Horovod所需的時(shí)間從大約1小時(shí)縮短到幾分鐘。Horovod在Inception V3和ResNet-101中都達(dá)到了90%的縮放效率,在VGG-16中達(dá)到了79%的縮放效率。
此外,Uber用NCCL替換了百度ring-allreduce實(shí)現(xiàn),NCCL是NVIDIA的集合通信庫(kù),它提供了高度優(yōu)化的ring-allreduce版本。NCCL 2引入了跨多臺(tái)機(jī)器運(yùn)行ring-allreduce的能力,能夠利用它的許多性能提升優(yōu)化。
Uber還在此基礎(chǔ)上增加了對(duì)適合單個(gè)服務(wù)器模型的支持,可能是在多個(gè)GPU上,而原來(lái)的版本只支持適合單個(gè)GPU的模型。
Horovod項(xiàng)目負(fù)責(zé)人亞歷克斯?瑟蓋夫(Alex Sergeev)表示,Horovod是為了讓各行各業(yè)的人工智能研究人員能夠更快、更直觀地進(jìn)行深度學(xué)習(xí)模型訓(xùn)練。后續(xù)隨著Horovod在功能和應(yīng)用方面的不斷成熟,加入LF將使我們能夠進(jìn)一步擴(kuò)大它在開源生態(tài)系統(tǒng)中的影響。
-
圖像處理
+關(guān)注
關(guān)注
27文章
1300瀏覽量
56894 -
自動(dòng)駕駛
+關(guān)注
關(guān)注
785文章
13932瀏覽量
167010 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5515瀏覽量
121553
原文標(biāo)題:Horovod ? Tensor flow ? Uber開源分布式深度學(xué)習(xí)模型 | GGAI海外
文章出處:【微信號(hào):ilove-ev,微信公眾號(hào):高工智能汽車】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論