生活随笔
收集整理的這篇文章主要介紹了
Tensorflow源码解析1 -- 内核架构和源码结构
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 主流深度學(xué)習(xí)框架對(duì)比
當(dāng)今的軟件開發(fā)基本都是分層化和模塊化的,應(yīng)用層開發(fā)會(huì)基于框架層。比如開發(fā)Linux Driver會(huì)基于Linux kernel,開發(fā)Android app會(huì)基于Android Framework。深度學(xué)習(xí)也不例外,框架層為上層模型開發(fā)提供了強(qiáng)大的多語言接口、穩(wěn)定的運(yùn)行時(shí)、高效的算子,以及完備的通信層和設(shè)備層管理層。因此,各大公司早早的就開始了深度學(xué)習(xí)框架的研發(fā),以便能占領(lǐng)市場(chǎng)。當(dāng)前的框架有數(shù)十種之多,主流的如下(截止到2018年11月)
顯然TensorFlow是獨(dú)一無二的王者。第二名Keras,它是對(duì)TensorFlow或Theano接口的二次封裝,嚴(yán)格意義上并不是一個(gè)獨(dú)立的深度學(xué)習(xí)框架。TensorFlow目前也已經(jīng)集成了Keras,使得安裝了TensorFlow的用戶就可以直接使用Keras了。
TensorFlow之所以能夠從數(shù)十種框架中脫穎而出,主要優(yōu)點(diǎn)有
出身高貴,是谷歌出品的。但其他很多框架出身也不差,例如PyTorch之于Facebook,MXNET之于Amazon2015年就開源了,比較早的俘獲了一大批開發(fā)者。這個(gè)確實(shí)是tf的一大先發(fā)優(yōu)勢(shì),但PyTorch的前身Caffe,以及MXNET開源時(shí)間都不晚,而且Caffe流行時(shí)間比tf早,后來才被趕超的。更有Theano這樣的絕對(duì)老前輩。由此可見,軟件開源是多么重要。目前流行的深度學(xué)習(xí)框架也基本都開源了。支持的開發(fā)語言多,支持Python Java Go C++等多種流行語言。相比某些框架,確實(shí)是優(yōu)勢(shì)很大。相比MXNET則小巫見大巫了。MXNET早期發(fā)展的一個(gè)主要方向就是前端多語言的支持,連MATLAB R Julia等語言都支持了。運(yùn)行效率高。早期的時(shí)候,其實(shí)tf的運(yùn)行效率比很多框架都要低一些的。安裝容易,用戶上手快,文檔齊全,社區(qū)活躍。這個(gè)是tf的一個(gè)較大優(yōu)勢(shì),特別是社區(qū)方面,也就是我們常說的生態(tài)優(yōu)勢(shì)。互聯(lián)網(wǎng)頭部集中效應(yīng)十分明顯,體現(xiàn)在開源軟件上也是一樣。這也是我認(rèn)為最大的一個(gè)優(yōu)勢(shì)。總結(jié)起來,TensorFlow雖然每個(gè)方面都不是絕對(duì)領(lǐng)先的優(yōu)勢(shì),但貴在每個(gè)方面都做的不錯(cuò),因此最終能夠一騎絕塵,獨(dú)領(lǐng)風(fēng)騷。
學(xué)習(xí)Tensorflow框架內(nèi)核,可以理解前端接口語言的支持,session生命周期,graph的構(gòu)建、分裂和執(zhí)行,operation的注冊(cè)和運(yùn)行,模塊間數(shù)據(jù)通信,本地運(yùn)行和分布式運(yùn)行模式,以及CPU GPU TPU等異構(gòu)設(shè)備的封裝支持等。學(xué)習(xí)這些,對(duì)于模型的壓縮 加速 優(yōu)化等都是大有裨益的。
2 TensorFlow系統(tǒng)架構(gòu)
TensorFlow設(shè)計(jì)十分精巧,基于分層和模塊化的設(shè)計(jì)思想進(jìn)行開發(fā)的。框架如下圖
整個(gè)框架以C API為界,分為前端和后端兩大部分。
前端:提供編程模型,多語言的接口支持,比如Python Java C++等。通過C API建立前后端的連接,后面詳細(xì)講解。 后端:提供運(yùn)行環(huán)境,完成計(jì)算圖的執(zhí)行。進(jìn)一步分為4層
運(yùn)行時(shí):分為分布式運(yùn)行時(shí)和本地運(yùn)行時(shí),負(fù)責(zé)計(jì)算圖的接收,構(gòu)造,編排等。計(jì)算層:提供各op算子的內(nèi)核實(shí)現(xiàn),例如conv2d, relu等通信層:實(shí)現(xiàn)組件間數(shù)據(jù)通信,基于GRPC和RDMA兩種通信方式設(shè)備層:提供多種異構(gòu)設(shè)備的支持,如CPU GPU TPU FPGA等模型構(gòu)造和執(zhí)行流程
TensorFlow的一大特點(diǎn)是,圖的構(gòu)造和執(zhí)行相分離。用戶添加完算子,構(gòu)建好整圖后,才開始進(jìn)行訓(xùn)練和執(zhí)行,也就是圖的執(zhí)行。大體流程如下
圖構(gòu)建:用戶在client中基于TensorFlow的多語言編程接口,添加算子,完成計(jì)算圖的構(gòu)造。圖傳遞:client開啟session,通過它建立和master之間的連接。執(zhí)行session.run()時(shí),將構(gòu)造好的graph序列化為graphDef后,以protobuf的格式傳遞給master。圖剪枝:master根據(jù)session.run()傳遞的fetches和feeds列表,反向遍歷全圖full graph,實(shí)施剪枝,得到最小依賴子圖圖分裂:master將最小子圖分裂為多個(gè)Graph Partition,并注冊(cè)到多個(gè)worker上。一個(gè)worker對(duì)應(yīng)一個(gè)Graph Partition。圖二次分裂:worker根據(jù)當(dāng)前可用硬件資源,如CPU GPU,將Graph Partition按照op算子設(shè)備約束規(guī)范(例如tf.device('/cpu:0'),二次分裂到不同設(shè)備上。每個(gè)計(jì)算設(shè)備對(duì)應(yīng)一個(gè)Graph Partition。圖運(yùn)行:對(duì)于每一個(gè)計(jì)算設(shè)備,worker依照op在kernel中的實(shí)現(xiàn),完成op的運(yùn)算。設(shè)備間數(shù)據(jù)通信可以使用send/recv節(jié)點(diǎn),而worker間通信,則使用GRPC或RDMA協(xié)議。 3 前端多語言實(shí)現(xiàn) - swig包裝器
TensorFlow提供了很多種語言的前端接口,使得用戶可以通過多種語言來完成模型的訓(xùn)練和推斷。其中Python支持得最好。這也是TensorFlow之所以受歡迎的一大原因。前端多語言是怎么實(shí)現(xiàn)的呢?這要?dú)w功于swig包裝器。
swig是個(gè)幫助使用C或者C++編寫的軟件能與其它各種高級(jí)編程語言進(jìn)行嵌入聯(lián)接的開發(fā)工具。在TensorFlow使用bazel編譯時(shí),swig會(huì)生成兩個(gè)wrapper文件
pywrap_tensorflow_internal.py:對(duì)接上層Python調(diào)用pywrap_tensorflow_internal.cc:對(duì)接底層C API調(diào)用。pywrap_tensorflow_internal.py 模塊被導(dǎo)入時(shí),會(huì)加載_pywrap_tensorflow_internal.so動(dòng)態(tài)鏈接庫(kù),它里面包含了所有運(yùn)行時(shí)接口的符號(hào)。而pywrap_tensorflow_internal.cc中,則注冊(cè)了一個(gè)函數(shù)符號(hào)表,實(shí)現(xiàn)Python接口和C接口的映射。運(yùn)行時(shí),就可以通過映射表,找到Python接口在C層的實(shí)現(xiàn)了。
4 tensorflow 源碼結(jié)構(gòu)
TensorFlow源碼基本也是按照框架分層來組織文件的。如下
其中core為tf的核心,它的源碼結(jié)構(gòu)如下
5 總結(jié)
TensorFlow框架設(shè)計(jì)精巧,代碼量也很大,我們可以從以下部分逐步學(xué)習(xí)
TensorFlow內(nèi)核架構(gòu)和源碼結(jié)構(gòu)。先從全局上對(duì)框架進(jìn)行理解。前后端連接的橋梁--Session,重點(diǎn)理解session的生命周期,并通過相關(guān)源碼可以加深理解Python前端如何調(diào)用底層C實(shí)現(xiàn)。TensorFlow核心對(duì)象—Graph。圖graph是TensorFlow最核心的對(duì)象,基本都是圍繞著它來進(jìn)行的。graph的節(jié)點(diǎn)為算子operation,邊為數(shù)據(jù)tensor。TensorFlow圖的節(jié)點(diǎn) -- Operation。operation是圖graph的節(jié)點(diǎn),承載了計(jì)算算子。TensorFlow圖的邊 -- Tensor。Tensor是圖graph的邊,承載了計(jì)算的數(shù)據(jù)。TensorFlow本地運(yùn)行時(shí)。TensorFlow分布式運(yùn)行時(shí)。和本地運(yùn)行時(shí)有一些共用的接口,但區(qū)別也很大。TensorFlow設(shè)備層。主要了解設(shè)備層的定義規(guī)范,以及實(shí)現(xiàn)。TensorFlow隊(duì)列和并行運(yùn)算。TensorFlow斷點(diǎn)檢查checkpoint,模型保存Saver,以及可視化tensorboard。這三個(gè)為TensorFlow主要的工具。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/yunqishequ/p/10405360.html
總結(jié)
以上是生活随笔為你收集整理的Tensorflow源码解析1 -- 内核架构和源码结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。