PaddlePaddle與TensorFlow的對(duì)比分析
本文主要從框架概覽、系統(tǒng)架構(gòu)、編程模型、分布式架構(gòu)、框架對(duì)比這五大方面比較TensorFlow和PaddlePaddle框架。作為國(guó)際兩大搜索引擎研發(fā)的深度學(xué)習(xí)框架,使用側(cè)重點(diǎn)不同,卻同樣提供了優(yōu)雅簡(jiǎn)潔的設(shè)計(jì)架構(gòu),并且還在不斷發(fā)展。對(duì)于PaddlePaddle來(lái)說(shuō),它的易用性和本土性、快速業(yè)務(wù)集成性,對(duì)國(guó)內(nèi)以速度致勝的互聯(lián)網(wǎng)公司是一個(gè)非常有利的武器;而TensorFlow的靈活性和相對(duì)偏科研性,是AI研究領(lǐng)域的一大利好。
框架概覽
PaddlePaddle的研發(fā)始于2013年,伴隨著百度廣告、文本、圖像、語(yǔ)音等訓(xùn)練數(shù)據(jù)的快速增長(zhǎng),以及百度外賣(mài)、搜索、無(wú)人駕駛領(lǐng)域的算法要求,百度深度學(xué)習(xí)實(shí)驗(yàn)室在基于單GPU訓(xùn)練平臺(tái)的基礎(chǔ)上,研發(fā)了Paddle(Parallel Asynchronous Distributed Deep Learning)這個(gè)多機(jī)并行GPU這個(gè)訓(xùn)練平臺(tái)。
PaddlePaddle自開(kāi)源以來(lái),它的設(shè)計(jì)和定位就一直集中在“易用、高效、靈活、可擴(kuò)展”上。正如官網(wǎng)的設(shè)計(jì)定位: An Easy-to-use, Efficient, Flexible and Scalable Deep Learning Platform 。下圖是Paddle的官方網(wǎng)站:
PaddlePaddle框架的開(kāi)源始于2016年9月份,它最大的特點(diǎn)和定位是easy to use,因此對(duì)很多算法進(jìn)行了完整的封裝,不僅是針對(duì)只目前現(xiàn)成的CV、NLP等算法 (如VGG、ResNet、LSTM、GRU等),它在模型庫(kù)models(https://github.com/PaddlePaddle/models)模塊下,封裝了詞向量(包括Hsigmoid加速詞向量訓(xùn)練和噪聲對(duì)比估計(jì)加速詞向量訓(xùn)練)、RNN 語(yǔ)言模型、點(diǎn)擊率預(yù)估、文本分類(lèi)、排序?qū)W習(xí)(信息檢索和搜索引擎研究的核心問(wèn)題之一)、結(jié)構(gòu)化語(yǔ)義模型、命名實(shí)體識(shí)別、序列到序列學(xué)習(xí)、閱讀理解、自動(dòng)問(wèn)答、圖像分類(lèi)、目標(biāo)檢測(cè)、場(chǎng)景文字識(shí)別、語(yǔ)音識(shí)別等多個(gè)技術(shù)領(lǐng)域人工智能的通用解決方案。
上述的每個(gè)解決方案都是針對(duì)某個(gè)技術(shù)場(chǎng)景而設(shè)計(jì),因此,開(kāi)發(fā)者可能只需要略微了解下源碼原理,按照官網(wǎng)的示例執(zhí)行運(yùn)行的命令,更換成自己的數(shù)據(jù)、修改一些超參數(shù)就能運(yùn)行起來(lái)。并且因?yàn)闆](méi)有向用戶(hù)暴露過(guò)多的python接口,理解和使用起來(lái)還比較容易。但是因?yàn)閭?cè)重在使用,在科研或者新增功能方面,如果修改算法,需要從框架的C++底層開(kāi)始實(shí)現(xiàn)。
它的第二大特色是分布式部署,并且是目前是唯一很好的支持Kubernetes的深度學(xué)習(xí)庫(kù)。在本文的“分布式架構(gòu)”中會(huì)進(jìn)一步說(shuō)明。
TensorFlow官網(wǎng)上對(duì)TensorFlow的描述是 An open-source software library for Machine Intelligence,一個(gè)開(kāi)源的機(jī)器學(xué)習(xí)庫(kù)。
從使用人數(shù)和活躍度上來(lái)說(shuō),TensorFlow是目前最流行的人工智能的算法引擎。它提供了深度學(xué)習(xí)的基本元素的實(shí)現(xiàn),例如conv、pooling、lstm和其它的基本算子。如下圖是TensorFlow支持的常用算子:
表[1]
類(lèi)別 |
示例 |
數(shù)學(xué)運(yùn)算操作 |
Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal…… |
數(shù)組運(yùn)算操作 |
Concat、Slice、Split、Constant、Rank、Shape、Shuffle…… |
矩陣運(yùn)算操作 |
MatMul、MatrixInverse、MatrixDeterminant…… |
有狀態(tài)的操作 |
Variable、Assign、AssignAdd…… |
神經(jīng)網(wǎng)絡(luò)構(gòu)建操作 |
SoftMax、Sigmoid、ReLU、Convolution2D、MaxPool,…… |
檢查點(diǎn)操作 |
Save、Restore |
隊(duì)列和同步操作 |
Enqueue、Dequeue、MutexAcquire、MutexRelease…… |
控制張量流動(dòng)的操作 |
Merge、Switch、Enter、Leave、NextIteration |
2016年4月,TensorFlow的0.8版本就支持了分布式、支持多GPU運(yùn)算。2016年6月,TensorFlow的0.9版本改進(jìn)了對(duì)移動(dòng)設(shè)備的支持。2017年2月,TensorFlow的1.0正式版本中,增加了Java和Go的實(shí)驗(yàn)性API,以及專(zhuān)用編譯器XLA和調(diào)試工具Debugger,還發(fā)布了tf.transform,專(zhuān)門(mén)用來(lái)數(shù)據(jù)預(yù)處理。同時(shí),圍繞著模型部署推出了TensorFlow Serving,用于將算法動(dòng)態(tài)部署到線上;以及逐步完善的類(lèi)似于scikit-learn功能的tf.contrib.learn。并且還推出了“動(dòng)態(tài)圖計(jì)算”TensorFlow Fold,這是被評(píng)價(jià)為“第一次清晰地在設(shè)計(jì)理念上領(lǐng)先”[2]。
用戶(hù)還可以使用谷歌公司的PaaS TensorFlow產(chǎn)品Cloud Machine Learning來(lái)做分布式訓(xùn)練。現(xiàn)在也已經(jīng)有了完整的TensorFlow Model Zoo。
2018年1月,TensorFlow已經(jīng)支持到1.5.0版本,完整開(kāi)放了TensorFlow Lite移動(dòng)端應(yīng)用以及動(dòng)態(tài)圖機(jī)制Eager Execution,使得調(diào)試即刻的運(yùn)行錯(cuò)誤并和Python 工具進(jìn)行整合。
TensorFlow的一大亮點(diǎn)是支持異構(gòu)設(shè)備分布式計(jì)算(heterogeneous distributed computing)。
何為異構(gòu)?信息技術(shù)當(dāng)中的異構(gòu)是指包含不同的成分,有異構(gòu)網(wǎng)絡(luò)(如互聯(lián)網(wǎng),不同廠家的硬件軟件產(chǎn)品組成統(tǒng)一網(wǎng)絡(luò)且互相通信)、異構(gòu)數(shù)據(jù)庫(kù)(多個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的集合,可以實(shí)現(xiàn)數(shù)據(jù)的共享和透明訪問(wèn)[3])。這里的異構(gòu)設(shè)備是指使用CPU、GPU等核心進(jìn)行有效地協(xié)同合作;與只依靠CPU相比,性能更高,功耗更低。
那何為分布式?分布式架構(gòu)目的在于幫助我們調(diào)度和分配計(jì)算資源(甚至容錯(cuò),如某個(gè)計(jì)算節(jié)點(diǎn)宕機(jī)或者太慢),使得上千萬(wàn)、上億數(shù)據(jù)量的模型能夠有效地利用機(jī)器資源進(jìn)行訓(xùn)練。
總結(jié)來(lái)看,目前AI領(lǐng)域有幾大主流的框架,而今天我們所對(duì)比的這兩個(gè)框架的共性就是有都有下面的一些特點(diǎn)。我們參考《The Unreasonable Effectiveness of Recurrent Neural Networks》[4],這篇文章梳理了一個(gè)有效框架應(yīng)該具有的功能。
● Tensor庫(kù)是對(duì)CPU/GPU透明的,并且實(shí)現(xiàn)了很多操作(如切片、數(shù)組或矩陣操作等)。這里的透明是指,在不同設(shè)備上如何運(yùn)行,都是框架幫用戶(hù)去實(shí)現(xiàn)的,用戶(hù)只需要指定在哪個(gè)設(shè)備上進(jìn)行哪種運(yùn)算即可。
● 有一個(gè)完全獨(dú)立的代碼庫(kù),用腳本語(yǔ)言(最理想的是Python)來(lái)操作Tensors,并且實(shí)現(xiàn)所有深度學(xué)習(xí)的內(nèi)容,包括前向傳播/反向傳播、圖形計(jì)算等。
● 可以輕松地共享預(yù)訓(xùn)練模型(如Caffe的模型及TensorFlow中的slim模塊、PaddlePaddle的models模塊)。
● 沒(méi)有編譯過(guò)程。深度學(xué)習(xí)是朝著更大、更復(fù)雜的網(wǎng)絡(luò)發(fā)展的,因此在復(fù)雜圖算法中花費(fèi)的時(shí)間會(huì)成倍增加。而且,進(jìn)行編譯的話會(huì)丟失可解釋性和有效進(jìn)行日志調(diào)試的能力。
那么PaddlePaddle 對(duì)開(kāi)發(fā)者來(lái)說(shuō)有什么優(yōu)勢(shì)?
首先,是易用性。相比偏底層的谷歌 TensorFlow,PaddlePaddle 的易用特點(diǎn)非常明顯:它讓開(kāi)發(fā)者開(kāi)發(fā)精力放在構(gòu)建深度學(xué)習(xí)模型的高層部分。
除此之外,PaddlePadddle 是國(guó)內(nèi)巨頭百度開(kāi)源的框架,他的本土性不僅非常符合國(guó)人的使用習(xí)慣,而且非常重視主流互聯(lián)網(wǎng)技術(shù)的使用場(chǎng)景和解決方法。
其次,是更快的速度。如上所說(shuō),PaddlePaddle 的代碼和設(shè)計(jì)更加簡(jiǎn)潔,用它來(lái)開(kāi)發(fā)模型顯然能為開(kāi)發(fā)者省去一些時(shí)間。這使得 PaddlePaddle 很適合于工業(yè)應(yīng)用,尤其是需要快速開(kāi)發(fā)的場(chǎng)景。
我們知道,系統(tǒng)架構(gòu)就直接決定了框架設(shè)計(jì)的根本不同,現(xiàn)在我們就一起窺探一番。
系統(tǒng)架構(gòu)
下圖給出的是TensorFlow的系統(tǒng)架構(gòu),自底向上分為設(shè)備層和網(wǎng)絡(luò)層、數(shù)據(jù)操作層、圖計(jì)算層、API層、應(yīng)用層,其中設(shè)備層和網(wǎng)絡(luò)層、數(shù)據(jù)操作層、圖計(jì)算層是TensorFlow的核心層。[5]
下面就自底向上詳細(xì)介紹一下TensorFlow的系統(tǒng)架構(gòu)。最下層是網(wǎng)絡(luò)通信層和設(shè)備管理層。網(wǎng)絡(luò)通信層包括gRPC(google Remote Procedure Call Protocol)和遠(yuǎn)程直接數(shù)據(jù)存取(Remote Direct Memory Access,RDMA),這都是在分布式計(jì)算時(shí)需要用到的。設(shè)備管理層包括TensorFlow分別在CPU、GPU、FPGA等設(shè)備上的實(shí)現(xiàn),也就是對(duì)上層提供了一個(gè)統(tǒng)一的接口,使上層只需要處理卷積等邏輯,而不需要關(guān)心在硬件上的卷積的實(shí)現(xiàn)過(guò)程。
其上是數(shù)據(jù)操作層,主要包括卷積函數(shù)、激活函數(shù)等操作。再往上是圖計(jì)算層,也是我們要了解的核心,包含本地計(jì)算圖和分布式計(jì)算圖的實(shí)現(xiàn)(包括圖的創(chuàng)建、編譯、優(yōu)化和執(zhí)行)。再往上是API層和應(yīng)用層。
可能因?yàn)闅v史遺留原因,PaddlePaddle整體架構(gòu)思路和caffe有些類(lèi)似,是基于神經(jīng)網(wǎng)絡(luò)中的功能層來(lái)開(kāi)發(fā)的,一個(gè)層包括了許多復(fù)雜的操作,如下圖中展示了目前包括FCN、CTC、BN、LSTM多種功能層。
并且它將數(shù)據(jù)讀?。―ataProvider)、功能層(Layers)、優(yōu)化方式(Optimizer)、評(píng)估(Evaluators)、激活函數(shù)(Activation)、池化(Pooling)這幾個(gè)過(guò)程分布實(shí)現(xiàn)成類(lèi),構(gòu)建PaddlePaddle的神經(jīng)網(wǎng)絡(luò)的過(guò)程就是組合這些層構(gòu)成整個(gè)網(wǎng)絡(luò)。如下圖所示:
同時(shí),在一層一層累加之外,為了提高靈活性,還額外封裝好了的networks類(lèi),也就是設(shè)置mixed_layer來(lái)組合不同的輸入,如下圖。這里面封裝了一些可能需要的組合,如conv+batchnorm+pooling,它可以極大的簡(jiǎn)化構(gòu)建神經(jīng)網(wǎng)絡(luò)的方式。使用更少的代碼,依據(jù)成熟的算法構(gòu)建網(wǎng)絡(luò)的同時(shí),修改數(shù)據(jù)的輸入就可以順利運(yùn)行。
編程模型
Paddle目前整體模塊如下圖所示:[6]
- Math模塊是Paddle的數(shù)學(xué)計(jì)算模塊。其中有各種矩陣和向量的實(shí)現(xiàn),矩陣和向量基類(lèi)是BaseMatrix。這個(gè)模塊里主體分為兩個(gè)部分。
- MemoryHandle: 申請(qǐng)、管理內(nèi)存和顯存的模塊。Paddle中的所有計(jì)算都是對(duì)MemoryHandle的操作。(MemoryHandle本質(zhì)上是對(duì)一段內(nèi)存的抽象。包括這段內(nèi)存的地址和大小。這段內(nèi)存可以是申請(qǐng)?jiān)谄胀▋?nèi)存上,也可以是申請(qǐng)?jiān)贕PU設(shè)備上。)
- Matrix/Vector: Paddle中實(shí)現(xiàn)計(jì)算邏輯的類(lèi)型。本質(zhì)上是MemoryHandle的一個(gè)view。
- 矩陣和向量組成了神經(jīng)網(wǎng)絡(luò)的參數(shù)Parameter和神經(jīng)網(wǎng)絡(luò)層的輸入和輸出Arguments。
Parameter和Arguments表示神經(jīng)網(wǎng)絡(luò)中所有的數(shù)據(jù)和參數(shù)。其中Parameter表示神經(jīng)網(wǎng)絡(luò)中層與層之間的連接參數(shù),而Argument表示每一層的輸入和輸出。即Parameter表示下圖中的黃色連線,而Argument表示下圖中的的輸入和輸出(Input, Output)。
并且Parameter與Argument并不只保存了參數(shù)值,還同時(shí)保存了梯度,動(dòng)量等信息。
1.Layer使用Argument和Parameter完成計(jì)算。
PaddlePaddle整體是一個(gè)基于Layer配置的神經(jīng)網(wǎng)絡(luò)框架。為了支持更細(xì)粒度的神經(jīng)網(wǎng)絡(luò)配置,支持配置op和projection,Paddle提供了MixedLayer。
MixedLayer和其他Layer不同,使用的輸入類(lèi)型不直接是其他Layer本身,而是其他Layer的projection或者operation。其他Layer的projection和operation的結(jié)果依次相加到MixedLayer的輸出中。
2.GradientMachine是一個(gè)把神經(jīng)網(wǎng)絡(luò)各個(gè)層組合在一起調(diào)用的類(lèi)型。這是個(gè)基類(lèi),具有神經(jīng)網(wǎng)絡(luò)常見(jiàn)的forward、backward函數(shù),并且處理了單機(jī)多線程和多顯卡的功能。
GradientMachine是PaddlePaddle中對(duì)于神經(jīng)網(wǎng)絡(luò)的一種抽象,即該數(shù)據(jù)類(lèi)型可以計(jì)算出Gradient,進(jìn)而將計(jì)算后的結(jié)果放入Parameter中即可。一個(gè)GradientMachine一般用來(lái)計(jì)算一個(gè)神經(jīng)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)。進(jìn)而,根據(jù)拓?fù)浣Y(jié)構(gòu)的形態(tài),GradientMachine會(huì)創(chuàng)建一些parameters_,而forward根據(jù)輸入的args和本地的參數(shù),計(jì)算神經(jīng)網(wǎng)絡(luò)的前饋,而backward函數(shù)根據(jù)之前前饋的結(jié)果,計(jì)算出各個(gè)參數(shù)的梯度,并將各個(gè)參數(shù)的梯度保存在parameters_中。
- Trainer調(diào)用GradientMachine計(jì)算出參數(shù)的梯度。
- ParameterUpdaterParameterUpdater主要用于在gradientMachine通過(guò)forward backward計(jì)算出gradient之后,調(diào)用update算法更新參數(shù)。
- Trainer優(yōu)化的拓?fù)浣Y(jié)構(gòu)是Python端的config_parser.py程序生成的。
TensorFlow是用數(shù)據(jù)流圖做計(jì)算的,因此我們先創(chuàng)建一個(gè)數(shù)據(jù)流圖(也稱(chēng)為網(wǎng)絡(luò)結(jié)構(gòu)圖),如圖所示,看一下數(shù)據(jù)流圖中的各個(gè)要素。
圖中講述了TensorFlow的運(yùn)行原理。圖中包含輸入(input)、塑形(reshape)、Relu層(Relu layer)、Logit層(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD訓(xùn)練(SGD Trainer)等部分,是一個(gè)簡(jiǎn)單的回歸模型。
它的計(jì)算過(guò)程是,首先從輸入開(kāi)始,經(jīng)過(guò)塑形后,一層一層進(jìn)行前向傳播運(yùn)算。Relu層(隱藏層)里會(huì)有兩個(gè)參數(shù),即Wh1和bh1,在輸出前使用ReLu(Rectified Linear Units)激活函數(shù)做非線性處理。然后進(jìn)入Logit層(輸出層),學(xué)習(xí)兩個(gè)參數(shù)Wsm和bsm。用Softmax來(lái)計(jì)算輸出結(jié)果中各個(gè)類(lèi)別的概率分布。用交叉熵來(lái)度量?jī)蓚€(gè)概率分布(源樣本的概率分布和輸出結(jié)果的概率分布)之間的相似性。然后開(kāi)始計(jì)算梯度,這里是需要參數(shù)Wh1、bh1、Wsm和bsm,以及交叉熵后的結(jié)果。隨后進(jìn)入SGD訓(xùn)練,也就是反向傳播的過(guò)程,從上往下計(jì)算每一層的參數(shù),依次進(jìn)行更新。也就是說(shuō),計(jì)算和更新的順序?yàn)?em>bsm、Wsm、bh1和 Wh1。
顧名思義,TensorFlow是指“張量的流動(dòng)”。TensorFlow的數(shù)據(jù)流圖是由節(jié)點(diǎn)(node)和邊(edge)組成的有向無(wú)環(huán)圖(directed acycline graph,DAG)。TensorFlow由Tensor和Flow兩部分組成,Tensor(張量)代表了數(shù)據(jù)流圖中的邊,而Flow(流動(dòng))這個(gè)動(dòng)作就代表了數(shù)據(jù)流圖中節(jié)點(diǎn)所做的操作。
那么,在分布式計(jì)算下,兩種框架又各自有哪些實(shí)現(xiàn)特點(diǎn)呢?
分布式架構(gòu)
PaddlePaddle的分布式結(jié)構(gòu)主要有兩個(gè)部分,trainer和parameter server。
分布式訓(xùn)練架構(gòu)如下圖所示:[7]
數(shù)據(jù)分片(Data shard): 用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù),被切分成多個(gè)部分,每個(gè)部分分別給每個(gè)trainer使用。
計(jì)算節(jié)點(diǎn)(Trainer): 每個(gè)trainer啟動(dòng)后讀取切分好的一部分?jǐn)?shù)據(jù),開(kāi)始神經(jīng)網(wǎng)絡(luò)的“前饋”和“后饋”計(jì)算,并和參數(shù)服務(wù)器通信。在完成一定量數(shù)據(jù)的訓(xùn)練后,上傳計(jì)算得出的梯度(gradients),然后下載優(yōu)化更新后的神經(jīng)網(wǎng)絡(luò)參數(shù)(parameters)。
參數(shù)服務(wù)器(Parameter server):每個(gè)參數(shù)服務(wù)器只保存整個(gè)神經(jīng)網(wǎng)絡(luò)所有參數(shù)的一部分。參數(shù)服務(wù)器接收從計(jì)算節(jié)點(diǎn)上傳的梯度,并完成參數(shù)優(yōu)化更新,再將更新后的參數(shù)下發(fā)到每個(gè)計(jì)算節(jié)點(diǎn)。
在使用同步SGD訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),PaddlePaddle使用同步屏障(barrier),使梯度的提交和參數(shù)的更新按照順序方式執(zhí)行。在異步SGD中,則并不會(huì)等待所有trainer提交梯度才更新參數(shù),這樣極大地提高了計(jì)算的并行性:參數(shù)服務(wù)器之間不相互依賴(lài),并行地接收梯度和更新參數(shù),參數(shù)服務(wù)器也不會(huì)等待計(jì)算節(jié)點(diǎn)全部都提交梯度之后才開(kāi)始下一步,計(jì)算節(jié)點(diǎn)之間也不會(huì)相互依賴(lài),并行地執(zhí)行模型的訓(xùn)練。可以看出,雖然異步SGD方式會(huì)提高參數(shù)更新并行度, 但是并不能保證參數(shù)同步更新,在任意時(shí)間某一臺(tái)參數(shù)服務(wù)器上保存的參數(shù)可能比另一臺(tái)要更新,與同步SGD相比,梯度會(huì)有噪聲。
同時(shí),Paddle本身支持多種分布式集群的部署和運(yùn)行方式,包括fabric集群、openmpi集群、Kubernetes單機(jī)、Kubernetes distributed分布式等。
TensorFlow的分布式架構(gòu)主要由客戶(hù)端(client)和服務(wù)端(server)組成,服務(wù)端又包括主節(jié)點(diǎn)(master)和工作節(jié)點(diǎn)(worker)兩者組成。我們需要關(guān)注客戶(hù)端、主節(jié)點(diǎn)和工作節(jié)點(diǎn)這三者間的關(guān)系和它們的交互過(guò)程。
客戶(hù)端、主節(jié)點(diǎn)和工作節(jié)點(diǎn)的關(guān)系
簡(jiǎn)單地來(lái)說(shuō),在TensorFlow中,客戶(hù)端通過(guò)會(huì)話來(lái)聯(lián)系主節(jié)點(diǎn),實(shí)際的工作交由工作節(jié)點(diǎn)實(shí)現(xiàn)。每個(gè)工作節(jié)點(diǎn)占據(jù)一臺(tái)設(shè)備(是TensorFlow具體計(jì)算的硬件抽象,即CPU或GPU)。在單機(jī)模式下,客戶(hù)端、主節(jié)點(diǎn)和工作節(jié)點(diǎn)都在同一臺(tái)服務(wù)器上;在分布式模式下,它們可以位于不同的服務(wù)器上。
下圖展示了這三者之間的關(guān)系。
圖[8]
1.客戶(hù)端
客戶(hù)端用于建立TensorFlow計(jì)算圖,并建立與集群進(jìn)行交互的會(huì)話層。因此,代碼中只要包含Session()就是客戶(hù)端。一個(gè)客戶(hù)端可以同時(shí)與多個(gè)服務(wù)端相連,同時(shí)一個(gè)服務(wù)端也可以與多個(gè)客戶(hù)端相連。
2.服務(wù)端
服務(wù)端是一個(gè)運(yùn)行了tf.train.Server實(shí)例的進(jìn)程,是TensorFlow執(zhí)行任務(wù)的集群(cluster)的一部分,并有主節(jié)點(diǎn)服務(wù)(Master service,也叫主節(jié)點(diǎn))和工作節(jié)點(diǎn)服務(wù)(Worker service,也叫工作節(jié)點(diǎn))之分。運(yùn)行中由一個(gè)主節(jié)點(diǎn)進(jìn)程和數(shù)個(gè)工作節(jié)點(diǎn)進(jìn)程組成,主節(jié)點(diǎn)進(jìn)程和工作節(jié)點(diǎn)進(jìn)程之間通過(guò)接口通信。單機(jī)多卡和分布式都是這種結(jié)構(gòu),因此只需要更改它們之間通信的接口就可以實(shí)現(xiàn)單機(jī)多卡和分布式的切換。
3.主節(jié)點(diǎn)服務(wù)
主節(jié)點(diǎn)服務(wù)實(shí)現(xiàn)了tensorflow::Session接口,通過(guò)RPC服務(wù)程序來(lái)遠(yuǎn)程連接工作節(jié)點(diǎn),與工作節(jié)點(diǎn)的服務(wù)進(jìn)程中的工作任務(wù)進(jìn)行通信。在TensorFlow服務(wù)端中,一般是task_index為0的作業(yè)(job)。
4.工作節(jié)點(diǎn)服務(wù)
工作節(jié)點(diǎn)服務(wù)實(shí)現(xiàn)了worker_service.proto接口,使用本地設(shè)備對(duì)部分圖進(jìn)行計(jì)算。在TensorFlow服務(wù)端中,所有工作節(jié)點(diǎn)都包含工作節(jié)點(diǎn)的服務(wù)邏輯。每個(gè)工作節(jié)點(diǎn)負(fù)責(zé)管理一個(gè)或者多個(gè)設(shè)備。工作節(jié)點(diǎn)也可以是本地不同端口的不同進(jìn)程,或者多臺(tái)服務(wù)器上的多個(gè)進(jìn)程。
下圖左邊是單機(jī)多卡的交互,右邊是分布式的交互。
框架對(duì)比
下面是PaddlePaddle和TensorFlow在框架流行度和代碼穩(wěn)定性上的比較。[9]可以看出,兩個(gè)框架在活躍度、穩(wěn)定性上都是一流,并且在代碼質(zhì)量上也不分伯仲。
對(duì)PaddlePaddle我這里列舉以下Paddle的幾個(gè)亮點(diǎn)的地方:
•更易用的API,更好的封裝,更快速的業(yè)務(wù)集成;
•占用內(nèi)存小,速度快,因?yàn)镻addle在百度內(nèi)部也服務(wù)了眾多大并發(fā)大數(shù)據(jù)場(chǎng)景,工業(yè)經(jīng)驗(yàn)也很豐富;
•本土化支持,也是唯一有官方中文文檔的深度學(xué)習(xí)框架;
•在自然語(yǔ)言處理上有很多現(xiàn)成的應(yīng)用,比如情感分類(lèi),神經(jīng)機(jī)器翻譯,閱讀理解、自動(dòng)問(wèn)答等,使用起來(lái)相對(duì)簡(jiǎn)單;
•PaddlePaddle支持多機(jī)多卡訓(xùn)練,并且本身支持多種集群方式。
總結(jié)
本文主要從框架概覽、系統(tǒng)架構(gòu)、編程模型、分布式架構(gòu)、框架對(duì)比等幾個(gè)方面說(shuō)明了PaddlePaddle和TensorFlow??偠灾?,“易學(xué)易用、靈活高效”是PaddlePaddle的最大亮點(diǎn),非常適合傳統(tǒng)互聯(lián)網(wǎng)引入AI模塊的集成,設(shè)計(jì)清晰也在研究方面也有所助力;除此之前,分布式架構(gòu)支持的多種集群環(huán)境,可以較輕松地和企業(yè)的分布式架構(gòu)結(jié)合。相信隨著眾多好用的模型的不斷釋出,一定會(huì)讓你在業(yè)務(wù)中找到滿(mǎn)意易用的算法方案。
1. 本表的內(nèi)容參考TensorFlow白皮書(shū)《TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems》:http://download.tensorflow.org/paper/whitepaper2015.pdf。 ↑
2. 參考論文《Deep Leaning with Dynamic Computation Graphs》:https://openreview.net/pdf?id=ryrGawqex。 ↑
3. 參考百度百科 “異構(gòu)數(shù)據(jù)庫(kù)”。 ↑
4. http://karpathy.github.io/2015/05/21/rnn-effectiveness/ ↑
5. 內(nèi)容參考https://www.tensorflow.org/extend/architecture。 ↑
6.https://github.com/PaddlePaddle/Paddle/wiki/Paddle%E7%9B%AE%E5%89%8D%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%90%84%E4%B8%AA%E6%A8%A1%E5%9D%97%E7%BB%86%E8%8A%82#math ↑
7.http://www.paddlepaddle.org/docs/develop/documentation/zh/howto/usage/cluster/cluster_train_cn.html ↑
8. 本圖出自https://www.tensorflow.org/extend/architecture。 ↑
9. 圖出自:https://python.libhunt.com/project/paddle/vs/tensorflow ↑