人工智能是一個歷久彌新的話題,在數(shù)十年的發(fā)展中幾經(jīng)沉浮,但是隨著近年來AlphaGo,ImageNet等捷報的頻頻傳來,人工智能再一次被推倒了風(fēng)口浪尖,人人趨之若鶩。驅(qū)動這波人工智能浪潮的核心引擎正是深度學(xué)習(xí), 最近幾年各種深度學(xué)習(xí)框架快速的流行起來,比如TensorFlow、Keras、Torch、PyTorch、MXNet、Caffe等。在這些框架中,除了對GPU加速的支持之外,對分布式環(huán)的支持也是它們廣受歡迎的關(guān)鍵因素之一。
接下來,本文將選取一款流行的深度學(xué)習(xí)框架并結(jié)合華云數(shù)據(jù)挖掘團(tuán)隊產(chǎn)品開發(fā)實踐,與大家分享分布式深度學(xué)習(xí)中的點滴經(jīng)驗。
流行的深度學(xué)習(xí)框架
深度學(xué)習(xí)框架層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch、PyTorch、MXNet、DeepLearning4j,等等。圖 1和圖 2分別展示了各個框架在研究人員中的使用情況統(tǒng)計和在github上的各項指標(biāo)統(tǒng)計。TensorFlow在科研使用量上及項目活躍程度上,都完勝其它框架。除Google號召力和研發(fā)水平外,TensorFlow本身確有諸多優(yōu)異表現(xiàn),比如編程靈活,執(zhí)行效率高,部署便利等等。到目前為止,TensorFlow在github上仍然保持著快速的迭代更新,而且形成了活躍社區(qū)。
在綜合考慮了各種深度學(xué)習(xí)框架的功能與特點以及項目的具體需求之后,在實際工作中,華云數(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 各個開源框架在github上的數(shù)據(jù)統(tǒng)計(圖片引自csdn博客網(wǎng)貼)
Python也被Spark厚愛,比如,可使用spark-submit直接提交python版本的分布式map-reduce程序;人們自然也會想到用基于內(nèi)存map-reduce管理機制來處理分布式TensorFlow程序,來對付單機搞不定的計算任務(wù)。
然而,基于gRPC(google Remote Process Calling)的TensorFlow也能很靈活地支持分布式環(huán)境。
TensorFlow及原生分布式方案
TensorFlow簡介
TensorFlow是一個采用靜態(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還支持深度強化學(xué)習(xí)乃至其它計算密集的科學(xué)計算,如偏微分方程求解、物理仿真等。
圖 3 數(shù)據(jù)流圖 (圖片引自TensorFlow官網(wǎng))
圖3示意了一張采用隨機梯度下降法來訓(xùn)練模型的圖(Graph)。TensorFlow是一款采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計算的開源軟件庫。節(jié)點(nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。TensorFlow可以放到分布式式環(huán)境下訓(xùn)練,實現(xiàn)集群、GPU集群或TPU集群并行計算。
原生分布式方案
TensorFlow支持以“數(shù)據(jù)并行化”的方式對模型進(jìn)行分布式訓(xùn)練,實際上指的是同一個“/job:worker”分組下,不同任務(wù)(task)可以分別使用不同的小批量(mini-batch)數(shù)據(jù)對同一個模型進(jìn)行訓(xùn)練,更新同一份參數(shù)。分布式TensorFlow支持實現(xiàn)方式有以下幾種:
(1)圖內(nèi)復(fù)制(In-graph replication)
1. 通常所有的操作都定義在一個Graph中;
2. 參數(shù)定義、更新相關(guān)的操作都集中分配給參數(shù)服務(wù)器(“/job:ps”);
3. 計算密集的操作會被復(fù)制多份,每一份都會被指定給不同worker節(jié)點(“/job:worker”)。
圖 4 圖內(nèi)復(fù)制同步訓(xùn)練示意圖 (圖片引自TensorFlow官網(wǎng))
(2)圖間復(fù)制(Between-graphreplication)
1. 需要有多個客戶端,每個客戶端都有一份graph的定義;
2. 通常每個客戶端跟每一個執(zhí)行worker類型task的server在同一個進(jìn)程中;
3. 同圖內(nèi)復(fù)制一樣,參數(shù)的定義與更新也都集中分配給參數(shù)服務(wù)器(“/job:ps”)。
(3)異步訓(xùn)練(Asynchronoustraining)
1. Graph的每一份副本各自獨立地執(zhí)行一個訓(xùn)練循環(huán),之間不會協(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. 各個worker服務(wù)器都從ps服務(wù)器讀取同一份參數(shù),計算參數(shù)的梯度,然后把梯度傳給ps服務(wù)器,本身并不進(jìn)行參數(shù)更新;
2. ps服務(wù)器收到所有worker服務(wù)器的梯度之后,對參數(shù)進(jìn)行更新;
3. ps服務(wù)器每一次更新參數(shù)的時候都需要等待所有的worker服務(wù)器計算并傳遞參數(shù)梯度,因此執(zhí)行速度取決于執(zhí)行最慢的worker服務(wù)器。
圖 6 獨立于Hadoop/Spark集群的TensorFlow集群 (圖片引自Yahoo Hadoop網(wǎng)站)
在2016年,TensorFlow支持了HDFS,但仍需用戶部署專門TensorFlow應(yīng)用集群,如圖 6所示。
基于gRPC及RDMA(Remote Direct Memory Access)分布式TensorFlow優(yōu)勢特點是靈活,特別方便于有大量分布式編程基礎(chǔ)的開發(fā)人員,但這一特點也帶來不少麻煩:
(1) 需要開發(fā)人員手工指定worker上的計算資源gpu:0或者cpu:0;
(2) 需要相對謹(jǐn)慎計算資源,分布到各個計算節(jié)點;
(3) 分布式TensorFlow計算資源共享調(diào)度麻煩。
華云數(shù)據(jù)Insight-GPUs設(shè)計初心
一個昂貴的分布式GPU計算資源,在團(tuán)隊間的協(xié)作分享,還是很麻煩,甚至很棘手,因為開發(fā)者事先知道有多少計算資源可以使用調(diào)度;需事先知道存在計算資源,在競爭的場合,使用人員間,團(tuán)隊間,調(diào)度管理上尤為尷尬�?赡苁怯捎谶@些看得見的缺點和使用上的痛點,催生了其他的帶有任務(wù)管理和調(diào)度功能的分布式深度學(xué)習(xí)平臺。在這樣的情景下,人們會自然想到用成熟spark任務(wù)調(diào)度模塊(比如,Yarn或者M(jìn)esos)和Spark管理RDD機制來管理分布式TensorFlow訓(xùn)練任務(wù)。
基于Spark分布式TensorFlow
Yahoo團(tuán)隊基于Caffe和TensorFlow開發(fā)的兩套方案,如圖 所示。華云大數(shù)據(jù)團(tuán)隊根據(jù)內(nèi)部已有的集群環(huán)境,并經(jīng)過深入的客戶需求分析與調(diào)研,最終決定采用TensorFlowOnSpark作為內(nèi)部分布式深度學(xué)習(xí)的部署方案。
圖 7 基于Spark的深度學(xué)習(xí)擴展模塊(圖片引自Yahoo Hadoop網(wǎng)站)
RDD動態(tài)TensorFlow分布式訓(xùn)練
在TensorFlow原生的分布式方案中,需要用戶在提交應(yīng)用之外手動的配置、維護(hù)、管理整個集群的運行,例如,在提交應(yīng)用前需要對節(jié)點進(jìn)行仔細(xì)的配置;需要手動地啟動、關(guān)閉所對應(yīng)的集群節(jié)點;在Between-graph模式下需要在不同的節(jié)點上多次提交應(yīng)用等等。總之,TensorFlow原生的分布式方案無論在運維成本,易用性等方面都有很多提升的空間。
可伸縮分布式數(shù)據(jù)集(Resilient Distributed Datasets, RDDs)是Spark的核心數(shù)據(jù)對象,提供了對大數(shù)據(jù)集群的高度抽象。RDD的抽象包含兩個方面:
一是數(shù)據(jù)并行化,指的是數(shù)據(jù)會被劃分成不同的部分保存到RDD不同的分片中;TensorFlowOnSpark提供了兩種模式的支持,Tensor Mode和Spark Mode,其中Spark Mode充分利用了RDD的數(shù)據(jù)并行化機制,由Spark動態(tài)的完成數(shù)據(jù)集的切分。
二是集群節(jié)點映射,指的是RDD中的每一個分片其實都對應(yīng)一個活動的進(jìn)程。TensorFlowOnSpark所提供的分布式方案充分利用了RDD這兩方面的特性。圖 8是TensorFlowOnSpark的運行狀態(tài)示意圖。在整個架構(gòu)中,TensorFlowOnSpark使用nodeRDD管理TensorFlow集群運行的整個生命周期,TensorFlow集群隨著應(yīng)用的提交與結(jié)束進(jìn)行動態(tài)的創(chuàng)建與回收。
圖 8 TensorFlowOnSpark運行狀態(tài)圖 (圖片引自Yahoo hadoop網(wǎng)站)
分布式TensorFlow訓(xùn)練過程可視化
采用分布式TensorFlow訓(xùn)練一個模型,會不會降低訓(xùn)練的精度?采用RDD切分訓(xùn)練數(shù)據(jù),再次放到分布式環(huán)境下,訓(xùn)練過程,loss下降過程會不會加長?這一系列的問題,需要通過訓(xùn)練可視化工具tensorboard來完成和解答。
數(shù)據(jù)分析人員也會通過tensorboard,看到自己精心調(diào)制的loss設(shè)計,試圖監(jiān)督訓(xùn)練中的收斂過程。但細(xì)心的開發(fā)人員會發(fā)現(xiàn),即使是當(dāng)下最新1.6.0版本,也不支持直接查看放在分布式環(huán)境下的TensorFlow訓(xùn)練過程事件,因為采用events機制寫出的V2版本訓(xùn)練過程文件,并不能實時地被tensorboard所加載。究其原因,可能與新開發(fā)的NewCheckpointReader有關(guān),該類封裝C++程序,只關(guān)注了本地化(單機本地化目錄)解析,而忽視了兼容HDFS文件夾所致。
通過本地文件夾與分布式環(huán)境下events文件夾logdir同步手段,可回避解決tensorboard不能加載位于HDFS上events文件夾這個問題,仍可以變相地達(dá)到查看分布式TensorFlow訓(xùn)練過程的目的。
華云數(shù)據(jù)Insight-GPUs直接讀取HDFS上events文件夾,實時解析放置于分布式環(huán)境中的TensorFlow訓(xùn)練過程文件events、model.ckpt.data*等文件,毋須同步logdir文件夾。同時,為了脫離語言限制,華云數(shù)據(jù)Insight-GPUs根據(jù)bazel特點,將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運行部署環(huán)境
采用最新ant-design頁面設(shè)計的Insight-GPUs可以很好地融入各類云產(chǎn)品,如,華云開發(fā)的公有云、私有云CloudUltra™及超融合產(chǎn)品。Insight-GPUs嵌入k8s客戶端,可以為用戶設(shè)計出更走心的管理功能(比如,華云數(shù)據(jù)Insight-GPUs可以從一個pod反追蹤到頂層執(zhí)行的分布式GPU任務(wù)),幫用戶更好地在各類云上編排管理容器的同時,也管理好異構(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/
榜單收錄、高管收錄、融資收錄、活動收錄可發(fā)送郵件至news#citmt.cn(把#換成@)。
海報生成中...