【TensorFlow實(shí)戰(zhàn)——筆記】第2章:TensorFlow和其他深度學(xué)習(xí)框架的對(duì)比

2.1 主流深度學(xué)習(xí)框架對(duì)比

各個(gè)開源框架在Github上的數(shù)據(jù)統(tǒng)計(jì)

數(shù)據(jù)統(tǒng)計(jì)截止于2017.07.15

可以看到各大主流框架基本都支持Python,目前Python在科學(xué)計(jì)算和數(shù)據(jù)挖掘領(lǐng)域可以說是獨(dú)領(lǐng)風(fēng)騷。雖然有來自R、Julia等語言的競爭壓力,但是Python的各種庫實(shí)在是太完善了,Web開發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)預(yù)處理、數(shù)據(jù)庫連接,爬蟲等無所不能,有一個(gè)完美的生態(tài)環(huán)境。僅在數(shù)據(jù)挖掘工具鏈上,Python就有Numpy、SciPy、Pandas、Scikit-learn、XGBoost等組件,做數(shù)據(jù)采集和預(yù)處理都非常方便,并且之后的模型訓(xùn)練階段可以和TensorFlow等基于Python的深度學(xué)習(xí)框架完美銜接。

主流深度學(xué)習(xí)框架在各個(gè)維度的評(píng)分

各基礎(chǔ)深度學(xué)習(xí)框架在AlexNet上的性能對(duì)比

數(shù)據(jù)來源于:

https://github.com/soumith/convnet-benchmarks

AlexNet (One Weird Trick paper) - Input 128x3x224x224

2.2 各深度學(xué)習(xí)框架簡介

== TensorFlow ==

Github源碼地址:

https://github.com/tensorflow/tensorflow

TensorFlow是由核心代碼C++編寫,提供的接口除了C++外,還有官方的Python、Go、Java接口,是通過SWIG(Simplified Wrapper and Interface Generator)實(shí)現(xiàn)的,這樣用戶就可以在硬件配置較好的機(jī)器中用Python進(jìn)行實(shí)驗(yàn),并在資源比較緊張的嵌入式環(huán)境或需要低延時(shí)的環(huán)境中使用C++部署模型。

非官方接口地址如下:

Julia: https://github.com/malmaud/TensorFlow.jl
Node.js https://github.com/node-tensorflow/node-tensorflow
R: https://github.com/rstudio/tensorflow

TensorFlow內(nèi)置TF.Learn和TF.Slim等上層組件可以幫助快速設(shè)計(jì)新網(wǎng)絡(luò),并兼任Scikit-learn estimator接口,方便實(shí)現(xiàn)evaluate、grid search、cross validation等功能。不局限于神經(jīng)網(wǎng)絡(luò),數(shù)據(jù)流式圖可以輕松實(shí)現(xiàn)深度學(xué)習(xí)以外的機(jī)器學(xué)習(xí)算法。

在數(shù)據(jù)并行模式上,類似Parameter Server,但是TensorFlow有自己獨(dú)立的Variable node,不像其他框架有一個(gè)全局的參數(shù)服務(wù)器,因此參數(shù)同步更自由。和Spark一樣都是數(shù)據(jù)計(jì)算的流式圖。

靈活的移植性,同份代碼基本不需修改就可以輕松部署到任意數(shù)據(jù)CPU、GPU的PC、服務(wù)器或移動(dòng)設(shè)備上。編譯速度快。有強(qiáng)大的可視化組件TensorBoard。

TensorFlow除了支持常見的網(wǎng)絡(luò)結(jié)構(gòu)卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurent Neural Network, RNN)外,還支持深度強(qiáng)化學(xué)習(xí)乃至其他計(jì)算密集的科學(xué)計(jì)算(如偏微分方程求解等)。

TensorFlow的用戶可將訓(xùn)練好的模型方便地部署到多種硬件、操作系統(tǒng)平臺(tái)上,支持Intel和AMD的CPU,通過CUDA支持NVIDIA的GPU,通過OpenCL支持AMD的GPU,支持Linux、Mac和Windows。在CPU上的矩陣運(yùn)算庫使用了Eigen而不是BLAS庫,能夠基于ARM架構(gòu)編程和優(yōu)化,因此在移動(dòng)設(shè)備上表現(xiàn)得很好。

目前在單GPU條件下,絕大多數(shù)深度學(xué)習(xí)框架都依賴于cuDNN。對(duì)于大規(guī)模深度學(xué)習(xí)來說,巨大的數(shù)據(jù)量使得單機(jī)很難在有限時(shí)間完成訓(xùn)練。這時(shí)需要使用GPU集群乃至TPU集群并行運(yùn)算。目前TensorFlow分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,分布式性能可能還沒達(dá)到最優(yōu)。

TensorFlow Serving

Google在2016年2月開源了TensorFlow Serving,這個(gè)組件可以將TensorFlow訓(xùn)練好的模型導(dǎo)出,并部署成可以對(duì)外提供預(yù)測服務(wù)的RESTful接口。內(nèi)部開發(fā)人員描述:“TensorFlow Serving是一個(gè)為生產(chǎn)環(huán)境而設(shè)計(jì)的高性能的機(jī)器學(xué)習(xí)服務(wù)系統(tǒng)。它可以同時(shí)運(yùn)行多個(gè)大規(guī)模深度學(xué)習(xí)模型,支持模型生命周期管理、算法實(shí)驗(yàn),并可以高效地利用GPU資源,讓TensorFlow訓(xùn)練好的模型更快捷方便地投入到實(shí)際生產(chǎn)環(huán)境”。

TensorBoard

TensorBoard是TensorFlow的一組Web應(yīng)用。支持5種可視化:

  • 標(biāo)量(scalars)
  • 圖片(images)
  • 音頻(audio)
  • 直方圖(histograms)
  • 計(jì)算圖(Computation Graph)

== Caffe ==

Github源碼地址:

https://github.com/BVLC/caffe

Caffe全稱為Convolutional Architecture for Fast Feature Embedding,在TensorFlow出現(xiàn)前,一直是最火的深度學(xué)習(xí)框架。其優(yōu)勢如下:

  • 容易上手,網(wǎng)絡(luò)結(jié)構(gòu)都是以配置文件形式定義,不需要用代碼設(shè)計(jì)網(wǎng)絡(luò)
  • 訓(xùn)練速度快,能夠訓(xùn)練state-of-the-art的模型與大規(guī)模的數(shù)據(jù)
  • 組件模塊化,可以方便拓展新的模型和學(xué)習(xí)任務(wù)

Caffe的核心概念是Layer,每一個(gè)神經(jīng)網(wǎng)絡(luò)的模塊都是一個(gè)Layer。每一個(gè)Layer需要定義兩種運(yùn)算,一種是正向(forward)的運(yùn)算,即從輸入數(shù)據(jù)計(jì)算輸出結(jié)果,也就是模型的預(yù)測過程;另一種是反向(backward)的運(yùn)算,從輸出端的gradient求解相對(duì)于輸入的gradient,即相反傳播算法,這部分就是模型的訓(xùn)練過程。

Caffe最開始設(shè)計(jì)時(shí)的目標(biāo)只是針對(duì)于圖像,沒有考慮文本、語音或時(shí)間序列的數(shù)據(jù)。所以Caffe對(duì)卷積神經(jīng)網(wǎng)絡(luò)支持非常好,但對(duì)于時(shí)間序列RNN
、LSTM等支持的不是特別充分。同時(shí),基于Layer的模式也對(duì)RNN不是非常友好,定義RNN結(jié)構(gòu)時(shí)比較麻煩。

Caffe一大優(yōu)勢是擁有大量訓(xùn)練好的經(jīng)典模型(AlexNet、VGG、Inception)乃至其他的state-of-the-art(ResNet等)。因?yàn)镃affe的底層基于C++,因此可以在各種硬件環(huán)境編譯并具有良好的移植性,支持Linux、Mac和Windows系統(tǒng),也可以編譯部署到移動(dòng)設(shè)備。

== Theano ==

Github源碼地址:

https://github.com/Theano/Theano

Theano誕生于2008年,因?yàn)槌霈F(xiàn)早,可算是這類庫的始祖之一,也一度被認(rèn)為是深度學(xué)習(xí)研究和應(yīng)用的重要標(biāo)準(zhǔn)之一。Theano的核心是一個(gè)數(shù)學(xué)表達(dá)式的編譯器,專門為處理大規(guī)模神經(jīng)網(wǎng)絡(luò)訓(xùn)練的計(jì)算而設(shè)計(jì)。其優(yōu)勢如下:

  • 集成NumPy,可以直接用NumPy的ndarray,API接口學(xué)習(xí)成本低
  • 計(jì)算穩(wěn)定性好,比如可以精確地計(jì)算輸出值很小的函數(shù)(像log(1+x))
  • 動(dòng)態(tài)地生成C或者CUDA代碼,用以編譯成高效的機(jī)器代碼

Theano更多地被當(dāng)做一個(gè)研究工具,而不是當(dāng)作產(chǎn)品來使用。雖然支持Linux、Mac和Windows,但是沒有底層C++的接口,因此模型部署非常不方便。

== Torch7 ==

Github源碼地址:

https://github.com/torch/torch7

Torch給自己的定位是LuaJIT上的一個(gè)高效的科學(xué)計(jì)算庫,支持大量的機(jī)器學(xué)習(xí)算法,同時(shí)以GPU上的計(jì)算優(yōu)先。Torch的目標(biāo)是讓設(shè)計(jì)科學(xué)計(jì)算算法變得便捷,它包含了大量的機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺、信號(hào)處理、并行運(yùn)算、圖像、視頻、音頻、網(wǎng)絡(luò)處理的庫,同時(shí)和Caffe類似,Torch擁有大量訓(xùn)練好的深度學(xué)習(xí)模型。

它和TensorFlow一樣使用了底層C++加上層腳本語言調(diào)用的方式,只不過Torch使用的是Lua。Lua支持Linux和Mac,還支持各種嵌入式系統(tǒng)(iOS、Android、FPGA等),只不過運(yùn)行時(shí)還是必須有LuaJIT的環(huán)境,所以工業(yè)生產(chǎn)環(huán)境的使用相對(duì)較少。

Torch提供的各種數(shù)據(jù)處理的庫

== Lasagne ==

Github源碼地址:

https://github.com/Lasagne/Lasagne

Lasagne是一個(gè)基于Theano的輕量級(jí)的神經(jīng)網(wǎng)絡(luò)庫。它支持前饋神經(jīng)網(wǎng)絡(luò),比如卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、LSTM等,以及它們的組合;支持許多優(yōu)化方法,比如Nesterovmomentum、RMSprop、ADAM等;它是Theano的上層封裝,但又不像Keras那樣進(jìn)行了重度的封裝,Keras隱藏了Theano中所有的方法和對(duì)象,而Lasagne則是借用了Theano中很多的類,算是介于基礎(chǔ)的Theano和高度抽象的Keras之間的輕度封裝。

== Keras ==

Github源碼地址:

https://github.com/fchollet/keras

Keras是一個(gè)崇尚極簡、高度模塊化的神經(jīng)網(wǎng)絡(luò)庫,使用Python實(shí)現(xiàn),并可以同時(shí)運(yùn)行在TensorFlow和Theano上。Keras專精于深度學(xué)習(xí)。它提供了目前為止最方便的API,用戶只需要將高級(jí)的模塊拼在一起,就可以設(shè)計(jì)神經(jīng)網(wǎng)絡(luò),它大大降低了編程開銷(code overhead)和閱讀別人代碼的理解開銷(cognitive overhead)。

Keras最大的問題可能是目前無法直接使用多GPU,所以對(duì)大規(guī)模的數(shù)據(jù)處理速度沒有其他支持多GPU和分布式的框架快。

== MXNet ==

Github源碼地址:

https://github.com/dmlc/mxnet

MXNet是DMLC(Distributed Machine Learning Community)開發(fā)的一款開源的、輕量的、可移植的、靈活的深度學(xué)習(xí)庫,它讓用戶可以混合使用符號(hào)編程模式和指令式編程模式來最大化效率和靈活性,目前已經(jīng)是AWS官方推薦的深度學(xué)習(xí)框架。MXNet的很多作者都是中國人,其最大的貢獻(xiàn)組織為百度。它是各個(gè)框架中率先支持多GPU和分布式的,同時(shí)其分布式性能也非常高。

MXNet的核心是一個(gè)動(dòng)態(tài)的以來調(diào)度器,支持自動(dòng)將計(jì)算任務(wù)并行化到多個(gè)GPU或分布式集群。一個(gè)很大的優(yōu)點(diǎn)就是支持非常多的語言封裝,比如C++、Python、R、Julia、Scala、Go、MATLAB和Javascript等。

== DIGITS ==

Github源碼地址:

https://github.com/NVIDIA/DIGITS

DIGITS(Deep Learning GPU Training System)不是一個(gè)標(biāo)準(zhǔn)的深度學(xué)習(xí)庫,它可以算是一個(gè)Caffe的高級(jí)封裝(或者Caffe的Web版培訓(xùn)系統(tǒng))。因?yàn)榉庋b得非常重,以至于你不需要(也不能)在DIGITS中寫代碼,即可實(shí)現(xiàn)一個(gè)深度學(xué)習(xí)的圖片識(shí)別模型。

DIGITS把所有操作都簡化在瀏覽器中執(zhí)行,可以算是Caffe在圖片分類上的一個(gè)漂亮的用戶可視化界面(GUI),計(jì)算機(jī)視覺的研究者或者工程師可以方便的設(shè)計(jì)深度學(xué)習(xí)模型、測試準(zhǔn)確率,以及調(diào)試各種超參數(shù)。同時(shí)使用它也可以生成數(shù)據(jù)和訓(xùn)練結(jié)果的可視化統(tǒng)計(jì)報(bào)表,甚至是網(wǎng)絡(luò)的可視化結(jié)構(gòu)圖。

== CNTK ==

Github源碼地址:

https://github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微軟研究院(MSR)開源的深度學(xué)習(xí)框架。目前在語言識(shí)別領(lǐng)域的使用尤為廣泛。CNTK通過一個(gè)有向圖將神經(jīng)網(wǎng)絡(luò)描述為一系列的運(yùn)算操作,這個(gè)有向圖中子節(jié)點(diǎn)代表輸入或網(wǎng)絡(luò)參數(shù),其他節(jié)點(diǎn)代表各種矩陣運(yùn)算。

CNTK支持各種前饋網(wǎng)絡(luò),包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自動(dòng)求解梯度。擁有產(chǎn)品級(jí)的代碼質(zhì)量,支持多機(jī)、多GPU的分布式訓(xùn)練。

CNTK通過寫配置文件的方式定義網(wǎng)絡(luò)結(jié)構(gòu),還支持Python、C++和C#語言綁定,這樣用戶就可以用編程的方式設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)。

CNTK原生支持多GPU和分布式,從官網(wǎng)公布的對(duì)比測試來看,性能非常不錯(cuò)。在GPU方面,CNTK相對(duì)于其他深度學(xué)習(xí)庫表現(xiàn)得更突出,它實(shí)現(xiàn)了1-bit SGD和自適應(yīng)的mini-batching。CNTK是唯一支持單機(jī)8塊GPU的框架,并且在分布式系統(tǒng)中可以超越8塊GPU的性能。

== Deeplearning4J ==

Github源碼地址:

https://github.com/deeplearning4j/deeplearning4j

Deeplearning4J(簡稱DL4J)是一個(gè)基于Java和Scala的開源的分布式深度學(xué)習(xí)庫。其核心目標(biāo)是創(chuàng)建一個(gè)即插即用的解決方案原型。可以方便的與Hadoop及Spark自動(dòng)整合,同時(shí)可以方便地在現(xiàn)有集群(包括但不限于AWS,Azure等)上進(jìn)行擴(kuò)展。此外,DL4J還有商業(yè)版的支持。

== Chainer ==

Github源碼地址:

https://github.com/chainer/chainer

Chainer是由日本公司Preferred Networks于2015年6月發(fā)布的深度學(xué)習(xí)框架。特征描述如下:

  • Powerful:支持CUDA計(jì)算,只需要幾行代碼就可以使用GPU加速,同時(shí)只需少改動(dòng)就可以運(yùn)行在多GPU上
  • Flexible:支持多種前饋神經(jīng)網(wǎng)絡(luò),包括卷積網(wǎng)絡(luò)、循環(huán)網(wǎng)絡(luò)、遞歸網(wǎng)絡(luò),支持運(yùn)行中動(dòng)態(tài)定義的網(wǎng)絡(luò)(Define-by-Run)
  • Intuitive:前饋計(jì)算可以引入Python的各種控制流,同時(shí)反向傳播時(shí)不受干擾,簡化了調(diào)試錯(cuò)誤的難度

== Leaf ==

Github源碼地址:

https://github.com/autumnai/leaf

Leaf是一個(gè)基于Rust語言的直觀的跨平臺(tái)的深度學(xué)習(xí)乃至機(jī)器智能框架,它擁有一個(gè)清晰的架構(gòu),除了同屬Autumu AI的底層計(jì)算庫Collenchyma,Leaf沒有其他依賴庫??梢浦残苑浅:?,可以運(yùn)行在CPU、GPU和FPGA等設(shè)備上,可以支持任何操作系統(tǒng)的PC、服務(wù)器,甚至是沒有操作系統(tǒng)的嵌入式設(shè)備,并且同時(shí)支持OpenCL和CUDA。

== DSSTNE ==

Github源碼地址:

https://github.com/amzn/amazon-dsstne

DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亞馬遜開源的稀疏神經(jīng)網(wǎng)絡(luò)框架,在訓(xùn)練非常稀疏的數(shù)據(jù)時(shí)具有很大的優(yōu)勢。目前只支持全連接的神經(jīng)網(wǎng)絡(luò),不支持卷積網(wǎng)絡(luò)等。和Caffe類似,它也是通過寫一個(gè)JSON類型的文件定義模型結(jié)構(gòu),但是支持非常大的Layer(輸入和輸出節(jié)點(diǎn)都非常多)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本節(jié)對(duì)5個(gè)開源深度學(xué)習(xí)框架進(jìn)行對(duì)比研究,主要側(cè)重于3個(gè)維度研究:硬件支持率、速度和準(zhǔn)確率、社區(qū)活躍性。他們分別是:...
    Carlos_清流閱讀 2,798評(píng)論 1 4
  • 機(jī)器學(xué)習(xí)(Machine Learning)&深度學(xué)習(xí)(Deep Learning)資料(Chapter 2) 注...
    Albert陳凱閱讀 4,567評(píng)論 0 30
  • 31納什均衡應(yīng)用舉例 案例一,庫諾特(Cournot)寡頭競爭模型。 這個(gè)模型可以說是納什均衡最早的版本,它比納什...
    玩哲閱讀 8,173評(píng)論 4 68
  • 她說 我害怕獨(dú)自去流浪 他說 我陪你去遠(yuǎn)方 她說 我還是會(huì)恐慌 他說 我留給你左半邊肩膀 她說 我們在一起就是天堂...
    初初遇見閱讀 200評(píng)論 0 0
  • 可怕的并不是貧窮,甚至不是沒有意識(shí)到貧窮,而是那股酸氣和不努力。 1. 如果生在一個(gè)家境不太好,或者,日子過得捉襟...
    洛檸閱讀 825評(píng)論 0 3

友情鏈接更多精彩內(nèi)容