自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PaddlePaddle與TensorFlow的對比分析

原創(chuàng)
人工智能 深度學習
本文主要從框架概覽、系統(tǒng)架構、編程模型、分布式架構、框架對比這五大方面比較TensorFlow和PaddlePaddle框架。

【51CTO.com原創(chuàng)稿件】

本文主要從框架概覽、系統(tǒng)架構、編程模型、分布式架構、框架對比這五大方面比較TensorFlow和PaddlePaddle框架。作為國際兩大搜索引擎研發(fā)的深度學習框架,使用側(cè)重點不同,卻同樣提供了優(yōu)雅簡潔的設計架構,并且還在不斷發(fā)展。對于PaddlePaddle來說,它的易用性和本土性、快速業(yè)務集成性,對國內(nèi)以速度致勝的互聯(lián)網(wǎng)公司是一個非常有利的武器;而TensorFlow的靈活性和相對偏科研性,是AI研究領域的一大利好。

框架概覽

PaddlePaddle的研發(fā)始于2013年,伴隨著百度廣告、文本、圖像、語音等訓練數(shù)據(jù)的快速增長,以及百度外賣、搜索、無人駕駛領域的算法要求,百度深度學習實驗室在基于單GPU訓練平臺的基礎上,研發(fā)了Paddle(Parallel Asynchronous Distributed Deep Learning)這個多機并行GPU這個訓練平臺。

PaddlePaddle自開源以來,它的設計和定位就一直集中在“易用、高效、靈活、可擴展”上。正如官網(wǎng)的設計定位: An Easy-to-use, Efficient, Flexible and Scalable Deep Learning Platform 。下圖是Paddle的官方網(wǎng)站:

paddle

PaddlePaddle框架的開源始于2016年9月份,它最大的特點和定位是easy to use,因此對很多算法進行了完整的封裝,不僅是針對只目前現(xiàn)成的CV、NLP等算法 (如VGG、ResNet、LSTM、GRU等),它在模型庫models(https://github.com/PaddlePaddle/models)模塊下,封裝了詞向量(包括Hsigmoid加速詞向量訓練和噪聲對比估計加速詞向量訓練)、RNN 語言模型、點擊率預估、文本分類、排序?qū)W習(信息檢索和搜索引擎研究的核心問題之一)、結構化語義模型、命名實體識別、序列到序列學習、閱讀理解、自動問答、圖像分類、目標檢測、場景文字識別、語音識別等多個技術領域人工智能的通用解決方案。

上述的每個解決方案都是針對某個技術場景而設計,因此,開發(fā)者可能只需要略微了解下源碼原理,按照官網(wǎng)的示例執(zhí)行運行的命令,更換成自己的數(shù)據(jù)、修改一些超參數(shù)就能運行起來。并且因為沒有向用戶暴露過多的python接口,理解和使用起來還比較容易。但是因為側(cè)重在使用,在科研或者新增功能方面,如果修改算法,需要從框架的C++底層開始實現(xiàn)。

它的第二大特色是分布式部署,并且是目前是唯一很好的支持Kubernetes的深度學習庫。在本文的“分布式架構”中會進一步說明。

TensorFlow官網(wǎng)上對TensorFlow的描述是 An open-source software library for Machine Intelligence,一個開源的機器學習庫。

tensorflow

從使用人數(shù)和活躍度上來說,TensorFlow是目前最流行的人工智能的算法引擎。它提供了深度學習的基本元素的實現(xiàn),例如conv、pooling、lstm和其它的基本算子。如下圖是TensorFlow支持的常用算子:

類別

示例

數(shù)學運算操作

Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal……

數(shù)組運算操作

Concat、Slice、Split、Constant、Rank、Shape、Shuffle……

矩陣運算操作

MatMul、MatrixInverse、MatrixDeterminant……

有狀態(tài)的操作

Variable、Assign、AssignAdd……

神經(jīng)網(wǎng)絡構建操作

SoftMax、Sigmoid、ReLU、Convolution2D、MaxPool,……

檢查點操作

Save、Restore

隊列和同步操作

Enqueue、Dequeue、MutexAcquire、MutexRelease……

控制張量流動的操作

Merge、Switch、Enter、Leave、NextIteration

2016年4月,TensorFlow的0.8版本就支持了分布式、支持多GPU運算。2016年6月,TensorFlow的0.9版本改進了對移動設備的支持。2017年2月,TensorFlow的1.0正式版本中,增加了Java和Go的實驗性API,以及專用編譯器XLA和調(diào)試工具Debugger,還發(fā)布了tf.transform,專門用來數(shù)據(jù)預處理。同時,圍繞著模型部署推出了TensorFlow Serving,用于將算法動態(tài)部署到線上;以及逐步完善的類似于scikit-learn功能的tf.contrib.learn。并且還推出了“動態(tài)圖計算”TensorFlow Fold,這是被評價為“第一次清晰地在設計理念上領先”

用戶還可以使用谷歌公司的PaaS TensorFlow產(chǎn)品Cloud Machine Learning來做分布式訓練?,F(xiàn)在也已經(jīng)有了完整的TensorFlow Model Zoo。

2018年1月,TensorFlow已經(jīng)支持到1.5.0版本,完整開放了TensorFlow Lite移動端應用以及動態(tài)圖機制Eager Execution,使得調(diào)試即刻的運行錯誤并和Python 工具進行整合。

TensorFlow的一大亮點是支持異構設備分布式計算

何為異構?信息技術當中的異構是指包含不同的成分,有異構網(wǎng)絡(如互聯(lián)網(wǎng),不同廠家的硬件軟件產(chǎn)品組成統(tǒng)一網(wǎng)絡且互相通信)、異構數(shù)據(jù)庫(多個數(shù)據(jù)庫系統(tǒng)的集合,可以實現(xiàn)數(shù)據(jù)的共享和透明訪問)。這里的異構設備是指使用CPU、GPU等核心進行有效地協(xié)同合作;與只依靠CPU相比,性能更高,功耗更低。

那何為分布式?分布式架構目的在于幫助我們調(diào)度和分配計算資源(甚至容錯,如某個計算節(jié)點宕機或者太慢),使得上千萬、上億數(shù)據(jù)量的模型能夠有效地利用機器資源進行訓練。

總結來看,目前AI領域有幾大主流的框架,而今天我們所對比的這兩個框架的共性就是有都有下面的一些特點。我們參考《The Unreasonable Effectiveness of Recurrent Neural Networks》,這篇文章梳理了一個有效框架應該具有的功能。

  • Tensor庫是對CPU/GPU透明的,并且實現(xiàn)了很多操作(如切片、數(shù)組或矩陣操作等)。這里的透明是指,在不同設備上如何運行,都是框架幫用戶去實現(xiàn)的,用戶只需要指定在哪個設備上進行哪種運算即可。
  • 有一個完全獨立的代碼庫,用腳本語言(最理想的是Python)來操作Tensors,并且實現(xiàn)所有深度學習的內(nèi)容,包括前向傳播/反向傳播、圖形計算等。
  • 可以輕松地共享預訓練模型(如Caffe的模型及TensorFlow中的slim模塊、PaddlePaddle的models模塊)。
  • 沒有編譯過程。深度學習是朝著更大、更復雜的網(wǎng)絡發(fā)展的,因此在復雜圖算法中花費的時間會成倍增加。而且,進行編譯的話會丟失可解釋性和有效進行日志調(diào)試的能力。

那么PaddlePaddle 對開發(fā)者來說有什么優(yōu)勢?

首先,是易用性。相比偏底層的谷歌 TensorFlow,PaddlePaddle 的易用特點非常明顯:它讓開發(fā)者開發(fā)精力放在構建深度學習模型的高層部分。

除此之外,PaddlePadddle 是國內(nèi)巨頭百度開源的框架,他的本土性不僅非常符合國人的使用習慣,而且非常重視主流互聯(lián)網(wǎng)技術的使用場景和解決方法。

其次,是更快的速度。如上所說,PaddlePaddle 的代碼和設計更加簡潔,用它來開發(fā)模型顯然能為開發(fā)者省去一些時間。這使得 PaddlePaddle 很適合于工業(yè)應用,尤其是需要快速開發(fā)的場景。

我們知道,系統(tǒng)架構就直接決定了框架設計的根本不同,現(xiàn)在我們就一起窺探一番。

系統(tǒng)架構

下圖給出的是TensorFlow的系統(tǒng)架構,自底向上分為設備層和網(wǎng)絡層、數(shù)據(jù)操作層、圖計算層、API層、應用層,其中設備層和網(wǎng)絡層、數(shù)據(jù)操作層、圖計算層是TensorFlow的核心層。

下面就自底向上詳細介紹一下TensorFlow的系統(tǒng)架構。最下層是網(wǎng)絡通信層和設備管理層。網(wǎng)絡通信層包括gRPC(google Remote Procedure Call Protocol)和遠程直接數(shù)據(jù)存?。≧emote Direct Memory Access,RDMA),這都是在分布式計算時需要用到的。設備管理層包括TensorFlow分別在CPU、GPU、FPGA等設備上的實現(xiàn),也就是對上層提供了一個統(tǒng)一的接口,使上層只需要處理卷積等邏輯,而不需要關心在硬件上的卷積的實現(xiàn)過程。

其上是數(shù)據(jù)操作層,主要包括卷積函數(shù)、激活函數(shù)等操作。再往上是圖計算層,也是我們要了解的核心,包含本地計算圖和分布式計算圖的實現(xiàn)(包括圖的創(chuàng)建、編譯、優(yōu)化和執(zhí)行)。再往上是API層和應用層。

應用

可能因為歷史遺留原因,PaddlePaddle整體架構思路和caffe有些類似,是基于神經(jīng)網(wǎng)絡中的功能層來開發(fā)的,一個層包括了許多復雜的操作,如下圖中展示了目前包括FCN、CTC、BN、LSTM多種功能層。

gnc

并且它將數(shù)據(jù)讀?。―ataProvider)、功能層(Layers)、優(yōu)化方式(Optimizer)、評估(Evaluators)、激活函數(shù)(Activation)、池化(Pooling)這幾個過程分布實現(xiàn)成類,構建PaddlePaddle的神經(jīng)網(wǎng)絡的過程就是組合這些層構成整個網(wǎng)絡。如下圖所示:

wl

同時,在一層一層累加之外,為了提高靈活性,還額外封裝好了的networks類,也就是設置mixed_layer來組合不同的輸入,如下圖。這里面封裝了一些可能需要的組合,如conv+batchnorm+pooling,它可以極大的簡化構建神經(jīng)網(wǎng)絡的方式。使用更少的代碼,依據(jù)成熟的算法構建網(wǎng)絡的同時,修改數(shù)據(jù)的輸入就可以順利運行。

im

編程模型

Paddle目前整體模塊如下圖所示:

bclj

  • Math模塊是Paddle的數(shù)學計算模塊。其中有各種矩陣和向量的實現(xiàn),矩陣和向量基類是BaseMatrix。這個模塊里主體分為兩個部分。
  • MemoryHandle: 申請、管理內(nèi)存和顯存的模塊。Paddle中的所有計算都是對MemoryHandle的操作。(MemoryHandle本質(zhì)上是對一段內(nèi)存的抽象。包括這段內(nèi)存的地址和大小。這段內(nèi)存可以是申請在普通內(nèi)存上,也可以是申請在GPU設備上。)
  • Matrix/Vector: Paddle中實現(xiàn)計算邏輯的類型。本質(zhì)上是MemoryHandle的一個view。
  • 矩陣和向量組成了神經(jīng)網(wǎng)絡的參數(shù)Parameter和神經(jīng)網(wǎng)絡層的輸入和輸出Arguments。

Parameter和Arguments表示神經(jīng)網(wǎng)絡中所有的數(shù)據(jù)和參數(shù)。其中Parameter表示神經(jīng)網(wǎng)絡中層與層之間的連接參數(shù),而Argument表示每一層的輸入和輸出。即Parameter表示下圖中的黃色連線,而Argument表示下圖中的的輸入和輸出(Input, Output)。

 

input

并且Parameter與Argument并不只保存了參數(shù)值,還同時保存了梯度,動量等信息。

  • Layer使用Argument和Parameter完成計算。

PaddlePaddle整體是一個基于Layer配置的神經(jīng)網(wǎng)絡框架。為了支持更細粒度的神經(jīng)網(wǎng)絡配置,支持配置op和projection,Paddle提供了MixedLayer。

MixedLayer和其他Layer不同,使用的輸入類型不直接是其他Layer本身,而是其他Layer的projection或者operation。其他Layer的projection和operation的結果依次相加到MixedLayer的輸出中。

  • GradientMachine是一個把神經(jīng)網(wǎng)絡各個層組合在一起調(diào)用的類型。這是個基類,具有神經(jīng)網(wǎng)絡常見的forward、backward函數(shù),并且處理了單機多線程和多顯卡的功能。

GradientMachine是PaddlePaddle中對于神經(jīng)網(wǎng)絡的一種抽象,即該數(shù)據(jù)類型可以計算出Gradient,進而將計算后的結果放入Parameter中即可。一個GradientMachine一般用來計算一個神經(jīng)網(wǎng)絡的拓撲結構。進而,根據(jù)拓撲結構的形態(tài),GradientMachine會創(chuàng)建一些parameters_,而forward根據(jù)輸入的args和本地的參數(shù),計算神經(jīng)網(wǎng)絡的前饋,而backward函數(shù)根據(jù)之前前饋的結果,計算出各個參數(shù)的梯度,并將各個參數(shù)的梯度保存在parameters_中。

  • Trainer調(diào)用GradientMachine計算出參數(shù)的梯度。
  • ParameterUpdaterParameterUpdater主要用于在gradientMachine通過forward backward計算出gradient之后,調(diào)用update算法更新參數(shù)。
  • Trainer優(yōu)化的拓撲結構是Python端的config_parser.py程序生成的。

TensorFlow是用數(shù)據(jù)流圖做計算的,因此我們先創(chuàng)建一個數(shù)據(jù)流圖(也稱為網(wǎng)絡結構圖),如圖所示,看一下數(shù)據(jù)流圖中的各個要素。

圖中講述了TensorFlow的運行原理。圖中包含輸入(input)、塑形(reshape)、Relu層(Relu layer)、Logit層(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD訓練(SGD Trainer)等部分,是一個簡單的回歸模型。

它的計算過程是,首先從輸入開始,經(jīng)過塑形后,一層一層進行前向傳播運算。Relu層(隱藏層)里會有兩個參數(shù),即Wh1和bh1,在輸出前使用ReLu(Rectified Linear Units)激活函數(shù)做非線性處理。然后進入Logit層(輸出層),學習兩個參數(shù)Wsm和bsm。用Softmax來計算輸出結果中各個類別的概率分布。用交叉熵來度量兩個概率分布(源樣本的概率分布和輸出結果的概率分布)之間的相似性。然后開始計算梯度,這里是需要參數(shù)Wh1、bh1、Wsm和bsm,以及交叉熵后的結果。隨后進入SGD訓練,也就是反向傳播的過程,從上往下計算每一層的參數(shù),依次進行更新。也就是說,計算和更新的順序為bsm、Wsm、bh1和 Wh1。

ceng

顧名思義,TensorFlow是指“張量的流動”。TensorFlow的數(shù)據(jù)流圖是由節(jié)點(node)和邊(edge)組成的有向無環(huán)圖(directed acycline graph,DAG)。TensorFlow由Tensor和Flow兩部分組成,Tensor(張量)代表了數(shù)據(jù)流圖中的邊,而Flow(流動)這個動作就代表了數(shù)據(jù)流圖中節(jié)點所做的操作。

那么,在分布式計算下,兩種框架又各自有哪些實現(xiàn)特點呢?

分布式架構

PaddlePaddle的分布式結構主要有兩個部分,trainer和parameter server。分布式訓練架構如下圖所示:

mx

數(shù)據(jù)分片(Data shard): 用于訓練神經(jīng)網(wǎng)絡的數(shù)據(jù),被切分成多個部分,每個部分分別給每個trainer使用。

計算節(jié)點(Trainer): 每個trainer啟動后讀取切分好的一部分數(shù)據(jù),開始神經(jīng)網(wǎng)絡的“前饋”和“后饋”計算,并和參數(shù)服務器通信。在完成一定量數(shù)據(jù)的訓練后,上傳計算得出的梯度(gradients),然后下載優(yōu)化更新后的神經(jīng)網(wǎng)絡參數(shù)(parameters)。

參數(shù)服務器(Parameter server):每個參數(shù)服務器只保存整個神經(jīng)網(wǎng)絡所有參數(shù)的一部分。參數(shù)服務器接收從計算節(jié)點上傳的梯度,并完成參數(shù)優(yōu)化更新,再將更新后的參數(shù)下發(fā)到每個計算節(jié)點。

在使用同步SGD訓練神經(jīng)網(wǎng)絡時,PaddlePaddle使用同步屏障(barrier),使梯度的提交和參數(shù)的更新按照順序方式執(zhí)行。在異步SGD中,則并不會等待所有trainer提交梯度才更新參數(shù),這樣極大地提高了計算的并行性:參數(shù)服務器之間不相互依賴,并行地接收梯度和更新參數(shù),參數(shù)服務器也不會等待計算節(jié)點全部都提交梯度之后才開始下一步,計算節(jié)點之間也不會相互依賴,并行地執(zhí)行模型的訓練??梢钥闯觯m然異步SGD方式會提高參數(shù)更新并行度, 但是并不能保證參數(shù)同步更新,在任意時間某一臺參數(shù)服務器上保存的參數(shù)可能比另一臺要更新,與同步SGD相比,梯度會有噪聲。

同時,Paddle本身支持多種分布式集群的部署和運行方式,包括fabric集群、openmpi集群、Kubernetes單機、Kubernetes distributed分布式等。TensorFlow的分布式架構主要由客戶端(client)和服務端(server)組成,服務端又包括主節(jié)點(master)和工作節(jié)點(worker)兩者組成。我們需要關注客戶端、主節(jié)點和工作節(jié)點這三者間的關系和它們的交互過程.

客戶端、主節(jié)點和工作節(jié)點的關系

簡單地來說,在TensorFlow中,客戶端通過會話來聯(lián)系主節(jié)點,實際的工作交由工作節(jié)點實現(xiàn)。每個工作節(jié)點占據(jù)一臺設備(是TensorFlow具體計算的硬件抽象,即CPU或GPU)。在單機模式下,客戶端、主節(jié)點和工作節(jié)點都在同一臺服務器上;在分布式模式下,它們可以位于不同的服務器上。下圖展示了這三者之間的關系。

kehd

1.客戶端

客戶端用于建立TensorFlow計算圖,并建立與集群進行交互的會話層。因此,代碼中只要包含Session()就是客戶端。一個客戶端可以同時與多個服務端相連,同時一個服務端也可以與多個客戶端相連

2.服務端

服務端是一個運行了tf.train.Server實例的進程,是TensorFlow執(zhí)行任務的集群(cluster)的一部分,并有主節(jié)點服務(Master service,也叫主節(jié)點)和工作節(jié)點服務(Worker service,也叫工作節(jié)點)之分。運行中由一個主節(jié)點進程和數(shù)個工作節(jié)點進程組成,主節(jié)點進程和工作節(jié)點進程之間通過接口通信。單機多卡和分布式都是這種結構,因此只需要更改它們之間通信的接口就可以實現(xiàn)單機多卡和分布式的切換。

3.主節(jié)點服務

主節(jié)點服務實現(xiàn)了tensorflow::Session接口,通過RPC服務程序來遠程連接工作節(jié)點,與工作節(jié)點的服務進程中的工作任務進行通信。在TensorFlow服務端中,一般是task_index為0的作業(yè)(job)。

4.工作節(jié)點服務

工作節(jié)點服務實現(xiàn)了worker_service.proto接口,使用本地設備對部分圖進行計算。在TensorFlow服務端中,所有工作節(jié)點都包含工作節(jié)點的服務邏輯。每個工作節(jié)點負責管理一個或者多個設備。工作節(jié)點也可以是本地不同端口的不同進程,或者多臺服務器上的多個進程。

下圖左邊是單機多卡的交互,右邊是分布式的交互。

fbs

框架對比

下面是PaddlePaddle和TensorFlow在框架流行度和代碼穩(wěn)定性上的比較。可以看出,兩個框架在活躍度、穩(wěn)定性上都是一流,并且在代碼質(zhì)量上也不分伯仲。

對PaddlePaddle我這里列舉以下Paddle的幾個亮點的地方:

  • 更易用的API,更好的封裝,更快速的業(yè)務集成;
  • 占用內(nèi)存小,速度快,因為Paddle在百度內(nèi)部也服務了眾多大并發(fā)大數(shù)據(jù)場景,工業(yè)經(jīng)驗也很豐富;
  • 本土化支持,也是唯一有官方中文文檔的深度學習框架;
  • 在自然語言處理上有很多現(xiàn)成的應用,比如情感分類,神經(jīng)機器翻譯,閱讀理解、自動問答等,使用起來相對簡單;
  • PaddlePaddle支持多機多卡訓練,并且本身支持多種集群方式。

總結本文主要從框架概覽、系統(tǒng)架構、編程模型、分布式架構、框架對比等幾個方面說明了PaddlePaddle和TensorFlow??偠灾?ldquo;易學易用、靈活高效”是PaddlePaddle的最大亮點,非常適合傳統(tǒng)互聯(lián)網(wǎng)引入AI模塊的集成,設計清晰也在研究方面也有所助力;除此之前,分布式架構支持的多種集群環(huán)境,可以較輕松地和企業(yè)的分布式架構結合。相信隨著眾多好用的模型的不斷釋出,一定會讓你在業(yè)務中找到滿意易用的算法方案。

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

責任編輯:張昂 來源: 51CTO
相關推薦

2018-01-26 14:29:01

框架

2010-07-20 16:16:21

SDH

2017-03-20 14:32:57

2021-05-18 10:18:15

Java

2023-05-14 22:00:01

2025-01-17 09:29:42

2010-06-08 11:15:43

OpenSUSE Ub

2010-08-04 15:47:24

NFS版本

2024-08-08 07:38:42

2016-10-18 21:10:17

GitHubBitbucketGitLab

2023-10-10 08:39:25

Java 7Java 8

2020-04-24 16:00:58

存儲分析應用

2010-07-14 10:26:58

IMAP協(xié)議

2017-05-05 10:15:38

深度學習框架對比分析

2010-06-24 21:35:33

2013-01-17 16:11:11

數(shù)據(jù)中心交換機網(wǎng)絡虛擬化

2018-06-07 09:45:08

2015-11-16 15:37:13

編排工具集群管理對比

2019-07-03 10:58:22

Kubernetes網(wǎng)絡插件

2019-12-26 16:21:59

ReactJSAngularJSVue.js
點贊
收藏

51CTO技術棧公眾號