
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ù)來源于:
AlexNet (One Weird Trick paper) - Input 128x3x224x224

2.2 各深度學(xué)習(xí)框架簡介
== TensorFlow ==
Github源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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源碼地址:
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)都非常多)。