人工智能是一個(gè)歷久彌新的話題,在數(shù)十年的發(fā)展中幾經(jīng)沉浮,但是隨著近年來AlphaGo,ImageNet等捷報(bào)的頻頻傳來,人工智能再一次被推倒了風(fēng)口浪尖,人人趨之若鶩。驅(qū)動(dòng)這波人工智能浪潮的核心引擎正是深度學(xué)習(xí), 最近幾年各種深度學(xué)習(xí)框架快速的流行起來,比如TensorFlow、Keras、Torch、PyTorch、MXNet、Caffe等。在這些框架中,除了對GPU加速的支持之外,對分布式環(huán)的支持也是它們廣受歡迎的關(guān)鍵因素之一。
接下來,本文將選取一款流行的深度學(xué)習(xí)框架并結(jié)合華云數(shù)據(jù)挖掘團(tuán)隊(duì)產(chǎn)品開發(fā)實(shí)踐,與大家分享分布式深度學(xué)習(xí)中的點(diǎn)滴經(jīng)驗(yàn)。
流行的深度學(xué)習(xí)框架
深度學(xué)習(xí)框架層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch、PyTorch、MXNet、DeepLearning4j,等等。圖 1和圖 2分別展示了各個(gè)框架在研究人員中的使用情況統(tǒng)計(jì)和在github上的各項(xiàng)指標(biāo)統(tǒng)計(jì)。TensorFlow在科研使用量上及項(xiàng)目活躍程度上,都完勝其它框架。除Google號召力和研發(fā)水平外,TensorFlow本身確有諸多優(yōu)異表現(xiàn),比如編程靈活,執(zhí)行效率高,部署便利等等。到目前為止,TensorFlow在github上仍然保持著快速的迭代更新,而且形成了活躍社區(qū)。
在綜合考慮了各種深度學(xué)習(xí)框架的功能與特點(diǎn)以及項(xiàng)目的具體需求之后,在實(shí)際工作中,華云數(shù)據(jù)Insight-GPUs選擇TensorFlow作為深度學(xué)習(xí)的開發(fā)框架,并且拓展了訓(xùn)練過程及結(jié)果在分布式環(huán)境上的可視化的功能。
圖 1 各框架在研究人員中的使用情況(圖片引自keras官網(wǎng))
圖表2顯示了TensorFlow及各種深度學(xué)習(xí)框架對各種語言的支持情況。能看出Python是當(dāng)下在深度學(xué)習(xí)上使用最多的。
圖 2 各個(gè)開源框架在github上的數(shù)據(jù)統(tǒng)計(jì)(圖片引自csdn博客網(wǎng)貼)
Python也被Spark厚愛,比如,可使用spark-submit直接提交python版本的分布式map-reduce程序;人們自然也會(huì)想到用基于內(nèi)存map-reduce管理機(jī)制來處理分布式TensorFlow程序,來對付單機(jī)搞不定的計(jì)算任務(wù)。
然而,基于gRPC(google Remote Process Calling)的TensorFlow也能很靈活地支持分布式環(huán)境。
TensorFlow及原生分布式方案
TensorFlow簡介
TensorFlow是一個(gè)采用靜態(tài)數(shù)據(jù)流圖,支持常見的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),比如卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)之外,TensorFlow還支持深度強(qiáng)化學(xué)習(xí)乃至其它計(jì)算密集的科學(xué)計(jì)算,如偏微分方程求解、物理仿真等。
圖 3 數(shù)據(jù)流圖 (圖片引自TensorFlow官網(wǎng))
圖3示意了一張采用隨機(jī)梯度下降法來訓(xùn)練模型的圖(Graph)。TensorFlow是一款采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計(jì)算的開源軟件庫。節(jié)點(diǎn)(nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。TensorFlow可以放到分布式式環(huán)境下訓(xùn)練,實(shí)現(xiàn)集群、GPU集群或TPU集群并行計(jì)算。
原生分布式方案
TensorFlow支持以“數(shù)據(jù)并行化”的方式對模型進(jìn)行分布式訓(xùn)練,實(shí)際上指的是同一個(gè)“/job:worker”分組下,不同任務(wù)(task)可以分別使用不同的小批量(mini-batch)數(shù)據(jù)對同一個(gè)模型進(jìn)行訓(xùn)練,更新同一份參數(shù)。分布式TensorFlow支持實(shí)現(xiàn)方式有以下幾種:
(1)圖內(nèi)復(fù)制(In-graph replication)
1. 通常所有的操作都定義在一個(gè)Graph中;
2. 參數(shù)定義、更新相關(guān)的操作都集中分配給參數(shù)服務(wù)器(“/job:ps”);
3. 計(jì)算密集的操作會(huì)被復(fù)制多份,每一份都會(huì)被指定給不同worker節(jié)點(diǎn)(“/job:worker”)。
圖 4 圖內(nèi)復(fù)制同步訓(xùn)練示意圖 (圖片引自TensorFlow官網(wǎng))
(2)圖間復(fù)制(Between-graphreplication)
1. 需要有多個(gè)客戶端,每個(gè)客戶端都有一份graph的定義;
2. 通常每個(gè)客戶端跟每一個(gè)執(zhí)行worker類型task的server在同一個(gè)進(jìn)程中;
3. 同圖內(nèi)復(fù)制一樣,參數(shù)的定義與更新也都集中分配給參數(shù)服務(wù)器(“/job:ps”)。
(3)異步訓(xùn)練(Asynchronoustraining)
1. Graph的每一份副本各自獨(dú)立地執(zhí)行一個(gè)訓(xùn)練循環(huán),之間不會(huì)協(xié)同;
2. ps服務(wù)器只要收到一臺worker服務(wù)器的梯度值,就直接進(jìn)行參數(shù)更新;
3. 不穩(wěn)定,訓(xùn)練曲線震蕩比較劇烈;
4. 適用于in-graph和between-graph。
圖 5 圖間復(fù)制異步訓(xùn)練示意圖 (圖片引自TensorFlow官網(wǎng))
(4)同步訓(xùn)練(Synchronous training)
1. 各個(gè)worker服務(wù)器都從ps服務(wù)器讀取同一份參數(shù),計(jì)算參數(shù)的梯度,然后把梯度傳給ps服務(wù)器,本身并不進(jìn)行參數(shù)更新;
2. ps服務(wù)器收到所有worker服務(wù)器的梯度之后,對參數(shù)進(jìn)行更新;
3. ps服務(wù)器每一次更新參數(shù)的時(shí)候都需要等待所有的worker服務(wù)器計(jì)算并傳遞參數(shù)梯度,因此執(zhí)行速度取決于執(zhí)行最慢的worker服務(wù)器。
圖 6 獨(dú)立于Hadoop/Spark集群的TensorFlow集群 (圖片引自Yahoo Hadoop網(wǎng)站)
在2016年,TensorFlow支持了HDFS,但仍需用戶部署專門TensorFlow應(yīng)用集群,如圖 6所示。
基于gRPC及RDMA(Remote Direct Memory Access)分布式TensorFlow優(yōu)勢特點(diǎn)是靈活,特別方便于有大量分布式編程基礎(chǔ)的開發(fā)人員,但這一特點(diǎn)也帶來不少麻煩:
(1) 需要開發(fā)人員手工指定worker上的計(jì)算資源gpu:0或者cpu:0;
(2) 需要相對謹(jǐn)慎計(jì)算資源,分布到各個(gè)計(jì)算節(jié)點(diǎn);
(3) 分布式TensorFlow計(jì)算資源共享調(diào)度麻煩。
華云數(shù)據(jù)Insight-GPUs設(shè)計(jì)初心
一個(gè)昂貴的分布式GPU計(jì)算資源,在團(tuán)隊(duì)間的協(xié)作分享,還是很麻煩,甚至很棘手,因?yàn)殚_發(fā)者事先知道有多少計(jì)算資源可以使用調(diào)度;需事先知道存在計(jì)算資源,在競爭的場合,使用人員間,團(tuán)隊(duì)間,調(diào)度管理上尤為尷尬?赡苁怯捎谶@些看得見的缺點(diǎn)和使用上的痛點(diǎn),催生了其他的帶有任務(wù)管理和調(diào)度功能的分布式深度學(xué)習(xí)平臺。在這樣的情景下,人們會(huì)自然想到用成熟spark任務(wù)調(diào)度模塊(比如,Yarn或者M(jìn)esos)和Spark管理RDD機(jī)制來管理分布式TensorFlow訓(xùn)練任務(wù)。
基于Spark分布式TensorFlow
Yahoo團(tuán)隊(duì)基于Caffe和TensorFlow開發(fā)的兩套方案,如圖 所示。華云大數(shù)據(jù)團(tuán)隊(duì)根據(jù)內(nèi)部已有的集群環(huán)境,并經(jīng)過深入的客戶需求分析與調(diào)研,最終決定采用TensorFlowOnSpark作為內(nèi)部分布式深度學(xué)習(xí)的部署方案。
圖 7 基于Spark的深度學(xué)習(xí)擴(kuò)展模塊(圖片引自Yahoo Hadoop網(wǎng)站)
RDD動(dòng)態(tài)TensorFlow分布式訓(xùn)練
在TensorFlow原生的分布式方案中,需要用戶在提交應(yīng)用之外手動(dòng)的配置、維護(hù)、管理整個(gè)集群的運(yùn)行,例如,在提交應(yīng)用前需要對節(jié)點(diǎn)進(jìn)行仔細(xì)的配置;需要手動(dòng)地啟動(dòng)、關(guān)閉所對應(yīng)的集群節(jié)點(diǎn);在Between-graph模式下需要在不同的節(jié)點(diǎn)上多次提交應(yīng)用等等。總之,TensorFlow原生的分布式方案無論在運(yùn)維成本,易用性等方面都有很多提升的空間。
可伸縮分布式數(shù)據(jù)集(Resilient Distributed Datasets, RDDs)是Spark的核心數(shù)據(jù)對象,提供了對大數(shù)據(jù)集群的高度抽象。RDD的抽象包含兩個(gè)方面:
一是數(shù)據(jù)并行化,指的是數(shù)據(jù)會(huì)被劃分成不同的部分保存到RDD不同的分片中;TensorFlowOnSpark提供了兩種模式的支持,Tensor Mode和Spark Mode,其中Spark Mode充分利用了RDD的數(shù)據(jù)并行化機(jī)制,由Spark動(dòng)態(tài)的完成數(shù)據(jù)集的切分。
二是集群節(jié)點(diǎn)映射,指的是RDD中的每一個(gè)分片其實(shí)都對應(yīng)一個(gè)活動(dòng)的進(jìn)程。TensorFlowOnSpark所提供的分布式方案充分利用了RDD這兩方面的特性。圖 8是TensorFlowOnSpark的運(yùn)行狀態(tài)示意圖。在整個(gè)架構(gòu)中,TensorFlowOnSpark使用nodeRDD管理TensorFlow集群運(yùn)行的整個(gè)生命周期,TensorFlow集群隨著應(yīng)用的提交與結(jié)束進(jìn)行動(dòng)態(tài)的創(chuàng)建與回收。
圖 8 TensorFlowOnSpark運(yùn)行狀態(tài)圖 (圖片引自Yahoo hadoop網(wǎng)站)
分布式TensorFlow訓(xùn)練過程可視化
采用分布式TensorFlow訓(xùn)練一個(gè)模型,會(huì)不會(huì)降低訓(xùn)練的精度?采用RDD切分訓(xùn)練數(shù)據(jù),再次放到分布式環(huán)境下,訓(xùn)練過程,loss下降過程會(huì)不會(huì)加長?這一系列的問題,需要通過訓(xùn)練可視化工具tensorboard來完成和解答。
數(shù)據(jù)分析人員也會(huì)通過tensorboard,看到自己精心調(diào)制的loss設(shè)計(jì),試圖監(jiān)督訓(xùn)練中的收斂過程。但細(xì)心的開發(fā)人員會(huì)發(fā)現(xiàn),即使是當(dāng)下最新1.6.0版本,也不支持直接查看放在分布式環(huán)境下的TensorFlow訓(xùn)練過程事件,因?yàn)椴捎胑vents機(jī)制寫出的V2版本訓(xùn)練過程文件,并不能實(shí)時(shí)地被tensorboard所加載。究其原因,可能與新開發(fā)的NewCheckpointReader有關(guān),該類封裝C++程序,只關(guān)注了本地化(單機(jī)本地化目錄)解析,而忽視了兼容HDFS文件夾所致。
通過本地文件夾與分布式環(huán)境下events文件夾logdir同步手段,可回避解決tensorboard不能加載位于HDFS上events文件夾這個(gè)問題,仍可以變相地達(dá)到查看分布式TensorFlow訓(xùn)練過程的目的。
華云數(shù)據(jù)Insight-GPUs直接讀取HDFS上events文件夾,實(shí)時(shí)解析放置于分布式環(huán)境中的TensorFlow訓(xùn)練過程文件events、model.ckpt.data*等文件,毋須同步logdir文件夾。同時(shí),為了脫離語言限制,華云數(shù)據(jù)Insight-GPUs根據(jù)bazel特點(diǎn),將tensorboard可視化功能也拆分出來,方便不同語言開發(fā)者調(diào)用和嵌入。
用戶可以按照圖9方式嵌入分布式TensorFlow訓(xùn)練過程中的隱層權(quán)重分布圖:
圖 9 華云Insight-GPUs
展示分布式TensorFlow訓(xùn)練過程中的隱層權(quán)重
最直接地,如圖10所示,也可以直嵌入訓(xùn)練結(jié)果頁面:
圖 10 華云數(shù)據(jù)Insight-GPUs展示分布式TensorFlow訓(xùn)練結(jié)果
華云數(shù)據(jù)分布式Insight-GPUs運(yùn)行部署環(huán)境
采用最新ant-design頁面設(shè)計(jì)的Insight-GPUs可以很好地融入各類云產(chǎn)品,如,華云開發(fā)的公有云、私有云CloudUltra™及超融合產(chǎn)品。Insight-GPUs嵌入k8s客戶端,可以為用戶設(shè)計(jì)出更走心的管理功能(比如,華云數(shù)據(jù)Insight-GPUs可以從一個(gè)pod反追蹤到頂層執(zhí)行的分布式GPU任務(wù)),幫用戶更好地在各類云上編排管理容器的同時(shí),也管理好異構(gòu)GPU集群。
參考文獻(xiàn)
1,TensorFlow官方網(wǎng)站. https://www.tensorflow.org/
2,Keras官方網(wǎng)站. https://keras.io/
3,主流深度學(xué)習(xí)框架對比. http://blog.csdn.net/zuochao_2013/article/details/56024172
4,TensorFlowOnSpark github. https://github.com/yahoo/TensorFlowOnSpark
5,Open Sourcing TensorFlowOnSpark: Distributed Deep Learning on Big-Data Clusters. http://yahoohadoop.tumblr.com/post/157196317141/open-sourcing-tensorflowonspark-distributed-deep
6,Spark官網(wǎng). http://spark.apache.org/
文章內(nèi)容僅供閱讀,不構(gòu)成投資建議,請謹(jǐn)慎對待。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。
2024年的Adobe MAX 2024發(fā)布會(huì)上,Adobe推出了最新版本的Adobe Creative Cloud。
奧維云網(wǎng)(AVC)推總數(shù)據(jù)顯示,2024年1-9月明火炊具線上零售額94.2億元,同比增加3.1%,其中抖音渠道表現(xiàn)優(yōu)異,同比有14%的漲幅,傳統(tǒng)電商略有下滑,同比降低2.3%。
“以前都要去窗口辦,一套流程下來都要半個(gè)月了,現(xiàn)在方便多了!”打開“重慶公積金”微信小程序,按照提示流程提交相關(guān)材料,僅幾秒鐘,重慶市民曾某的賬戶就打進(jìn)了21600元。
華碩ProArt創(chuàng)藝27 Pro PA279CRV顯示器,憑借其優(yōu)秀的性能配置和精準(zhǔn)的色彩呈現(xiàn)能力,為您的創(chuàng)作工作帶來實(shí)質(zhì)性的幫助,雙十一期間低至2799元,性價(jià)比很高,簡直是創(chuàng)作者們的首選。
9月14日,2024全球工業(yè)互聯(lián)網(wǎng)大會(huì)——工業(yè)互聯(lián)網(wǎng)標(biāo)識解析專題論壇在沈陽成功舉辦。