TensorFlow架構(gòu)與設(shè)計:概述

開源書籍

關(guān)于TensorFlow的內(nèi)核詳細原理與運行機制茅逮,請查閱我的開源技術(shù)書籍:TensorFlow內(nèi)核剖析

TensorFlow是什么竹握?

TensorFlow基于數(shù)據(jù)流圖鄙陡,用于大規(guī)模分布式數(shù)值計算的開源框架诺苹。節(jié)點表示某種抽象的計算,邊表示節(jié)點之間相互聯(lián)系的張量婶博。

計算圖實例

TensorFlow支持各種異構(gòu)的平臺瓮具,支持多CPU/GPU,服務(wù)器,移動設(shè)備呜呐,具有良好的跨平臺的特性想际;TensorFlow架構(gòu)靈活,能夠支持各種網(wǎng)絡(luò)模型兑巾,具有良好的通用性;此外忠荞,TensorFlow架構(gòu)具有良好的可擴展性蒋歌,對OP的擴展支持,Kernel特化方面表現(xiàn)出眾委煤。

TensorFlow最初由Google大腦的研究員和工程師開發(fā)出來,用于機器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)方面的研究碧绞,于2015.10宣布開源府框,在眾多深度學(xué)習(xí)框架中脫穎而出,在Github上獲得了最多的Star量讥邻。

本文將闡述TensorFlow的系統(tǒng)架構(gòu)迫靖,幫助讀者加深理解TensorFlow的工作機理。

本文假設(shè)讀者已經(jīng)了解TensorFlow的基本編程模型兴使,包括計算圖, OP, Tensor, Session等基本概念系宜。

系統(tǒng)概述

TensorFlow的系統(tǒng)結(jié)構(gòu)以C API為界,將整個系統(tǒng)分為「前端」和「后端」兩個子系統(tǒng):

  • 前端系統(tǒng):提供編程模型发魄,負責(zé)構(gòu)造計算圖盹牧;
  • 后端系統(tǒng):提供運行時環(huán)境,負責(zé)執(zhí)行計算圖励幼。
TensorFlow系統(tǒng)架構(gòu)

如上圖所示汰寓,重點關(guān)注系統(tǒng)中如下4個基本組件,它們是系統(tǒng)分布式運行機制的核心苹粟。

Client

Client是前端系統(tǒng)的主要組成部分有滑,它是一個支持多語言的編程環(huán)境。它提供基于計算圖的編程模型六水,方便用戶構(gòu)造各種復(fù)雜的計算圖俺孙,實現(xiàn)各種形式的模型設(shè)計辣卒。

Client通過Session為橋梁,連接TensorFlow后端的「運行時」睛榄,并啟動計算圖的執(zhí)行過程荣茫。

Distributed Master

在分布式的運行時環(huán)境中,Distributed Master根據(jù)Session.runFetching參數(shù)场靴,從計算圖中反向遍歷啡莉,找到所依賴的「最小子圖」。

然后旨剥,Distributed Master負責(zé)將該「子圖」再次分裂為多個「子圖片段」咧欣,以便在不同的進程和設(shè)備上運行這些「子圖片段」。

最后轨帜,Distributed Master將這些「子圖片段」派發(fā)給Work Service魄咕;隨后Work Service啟動「子圖片段」的執(zhí)行過程。

Worker Service

對于每以個任務(wù)蚌父,TensorFlow都將啟動一個Worker Service哮兰。Worker Service將按照計算圖中節(jié)點之間的依賴關(guān)系,根據(jù)當(dāng)前的可用的硬件環(huán)境(GPU/CPU)苟弛,調(diào)用OPKernel實現(xiàn)完成OP的運算(一種典型的多態(tài)實現(xiàn)技術(shù))喝滞。

另外,Worker Service還要負責(zé)將OP運算的結(jié)果發(fā)送到其他的Work Service膏秫;或者接受來自其他Worker Service發(fā)送給它的OP運算的結(jié)果右遭。

Kernel Implements

KernelOP在某種硬件設(shè)備的特定實現(xiàn),它負責(zé)執(zhí)行OP的運算缤削。

組件交互

組件交互

如上圖所示窘哈,假設(shè)存在兩個任務(wù):

  • /job:ps/task:0: 負責(zé)模型參數(shù)的存儲和更新
  • /job:worker/task:0: 負責(zé)模型的訓(xùn)練或推理

接下來,我們將進一步抽絲剝繭僻他,逐漸挖掘出TensorFlow計算圖的運行機制宵距。

客戶端

Client基于TensorFlow的編程接口,構(gòu)造計算圖吨拗。目前,TensorFlow主流支持PythonC++的編程接口婿斥,并對其他編程語言接口的支持日益完善劝篷。

此時,TensorFlow并未執(zhí)行任何計算民宿。直至建立Session會話娇妓,并以Session為橋梁,建立Client與后端運行時的通道活鹰,將Protobuf格式的GraphDef發(fā)送至Distributed Master哈恰。

也就是說只估,當(dāng)ClientOP結(jié)果進行求值時,將觸發(fā)Distributed Master的計算圖的執(zhí)行過程着绷。

如下圖所示蛔钙,Client構(gòu)建了一個簡單計算圖。它首先將wx進行矩陣相乘荠医,再與截距b按位相加吁脱,最后更新至s

構(gòu)造計算圖

Distributed Master

在分布式的運行時環(huán)境中彬向,Distributed Master根據(jù)Session.runFetching參數(shù)兼贡,從計算圖中反向遍歷,找到所依賴的最小子圖娃胆。

然后Distributed Master負責(zé)將該子圖再次分裂為多個「子圖片段」遍希,以便在不同的進程和設(shè)備上運行這些「子圖片段」。

最后里烦,Distributed Master將這些圖片段派發(fā)給Work Service凿蒜。隨后Work Service啟動「本地子圖」的執(zhí)行過程。

Distributed Master將會緩存「子圖片段」招驴,以便后續(xù)執(zhí)行過程重復(fù)使用這些「子圖片段」篙程,避免重復(fù)計算。

執(zhí)行圖計算

如上圖所示别厘,Distributed Master開始執(zhí)行計算子圖虱饿。在執(zhí)行之前,Distributed Master會實施一系列優(yōu)化技術(shù)触趴,例如「公共表達式消除」氮发,「常量折疊」等。隨后冗懦,Distributed Master負責(zé)任務(wù)集的協(xié)同爽冕,執(zhí)行優(yōu)化后的計算子圖。

子圖片段

子圖片段

如上圖所示披蕉,存在一種合理的「子圖片段」劃分算法颈畸。Distributed Master將模型參數(shù)相關(guān)的OP進行分組,并放置在PS任務(wù)上没讲。其他OP則劃分為另外一組眯娱,放置在Worker任務(wù)上執(zhí)行。

SEND/RECV節(jié)點

插入SEND/RECV節(jié)點

如上圖所示爬凑,如果計算圖的邊被任務(wù)節(jié)點分割徙缴,Distributed Master將負責(zé)將該邊進行分裂,在兩個分布式任務(wù)之間插入SENDRECV節(jié)點嘁信,實現(xiàn)數(shù)據(jù)的傳遞于样。

隨后疏叨,Distributed Master將「子圖片段」派發(fā)給相應(yīng)的任務(wù)中執(zhí)行,在Worker Service成為「本地子圖」穿剖,它負責(zé)執(zhí)行該子圖的上的OP蚤蔓。

Worker Service

對于每個任務(wù),都將存在相應(yīng)的Worker Service携御,它主要負責(zé)如下3個方面的職責(zé):

  • 處理來自Master的請求昌粤;
  • 調(diào)度OPKernel實現(xiàn),執(zhí)行本地子圖啄刹;
  • 協(xié)同任務(wù)之間的數(shù)據(jù)通信涮坐。
執(zhí)行本地子圖

Worker Service派發(fā)OP到本地設(shè)備,執(zhí)行Kernel的特定實現(xiàn)誓军。它將盡最大可能地利用多CPU/GPU的處理能力袱讹,并發(fā)地執(zhí)行Kernel實現(xiàn)。

另外昵时,TensorFlow根據(jù)設(shè)備類型捷雕,對于設(shè)備間的SEND/RECV節(jié)點進行特化實現(xiàn):

  • 使用cudaMemcpyAsync的API實現(xiàn)本地CPUGPU設(shè)備的數(shù)據(jù)傳輸;
  • 對于本地的GPU之間則使用端到端的DMA壹甥,避免了跨host CPU昂貴的拷貝過程救巷。

對于任務(wù)之間的數(shù)據(jù)傳遞,TensorFlow支持多協(xié)議句柠,主要包括:

  • gRPC over TCP
  • RDMA over Converged Ethernet

Kernel Implements

TensorFlow的運行時包含200多個標準的OP浦译,包括數(shù)值計算,多維數(shù)組操作溯职,控制流精盅,狀態(tài)管理等。每一個OP根據(jù)設(shè)備類型都會存在一個優(yōu)化了的Kernel實現(xiàn)谜酒。在運行時叹俏,運行時根據(jù)本地設(shè)備的類型,為OP選擇特定的Kernel實現(xiàn)僻族,完成該OP的計算粘驰。

TensorFlow Core

其中,大多數(shù)Kernel基于Eigen::Tensor實現(xiàn)述么。Eigen::Tensor是一個使用C++模板技術(shù)晴氨,為多核CPU/GPU生成高效的并發(fā)代碼。但是碉输,TensorFlow也可以靈活地直接使用cuDNN實現(xiàn)更高效的Kernel

此外亭珍,TensorFlow實現(xiàn)了矢量化技術(shù)敷钾,使得在移動設(shè)備枝哄,及其滿足高吞吐量,以數(shù)據(jù)為中心的應(yīng)用需求阻荒,實現(xiàn)更高效的推理挠锥。

如果對于復(fù)合OP的子計算過程很難表示,或執(zhí)行效率低下侨赡,TensorFlow甚至支持更高效的Kernle實現(xiàn)的注冊蓖租,其擴展性表現(xiàn)相當(dāng)優(yōu)越。

技術(shù)棧

最后羊壹,按照TensorFlow的軟件層次蓖宦,通過一張表格羅列TensorFlow的技術(shù)棧,以便更清晰地對上述內(nèi)容做一個簡單回顧油猫。

TensorFlow技術(shù)棧

開源技術(shù)書

https://github.com/horance-liu/tensorflow-internals
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稠茂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子情妖,更是在濱河造成了極大的恐慌睬关,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毡证,死亡現(xiàn)場離奇詭異电爹,居然都是意外死亡,警方通過查閱死者的電腦和手機料睛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門丐箩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秦效,你說我怎么就攤上這事雏蛮。” “怎么了阱州?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵挑秉,是天一觀的道長。 經(jīng)常有香客問我苔货,道長犀概,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任夜惭,我火速辦了婚禮姻灶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诈茧。我一直安慰自己产喉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曾沈,像睡著了一般这嚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞俱,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天姐帚,我揣著相機與錄音,去河邊找鬼障涯。 笑死罐旗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唯蝶。 我是一名探鬼主播九秀,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼生棍!你這毒婦竟也來了颤霎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤涂滴,失蹤者是張志新(化名)和其女友劉穎友酱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柔纵,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缔杉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁料。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片或详。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郭计,靈堂內(nèi)的尸體忽然破棺而出霸琴,到底是詐尸還是另有隱情,我是刑警寧澤昭伸,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布梧乘,位于F島的核電站,受9級特大地震影響庐杨,放射性物質(zhì)發(fā)生泄漏选调。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一灵份、第九天 我趴在偏房一處隱蔽的房頂上張望仁堪。 院中可真熱鬧,春花似錦填渠、人聲如沸弦聂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽横浑。三九已至剔桨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徙融,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工瑰谜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欺冀,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓萨脑,卻偏偏與公主長得像隐轩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渤早,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容