1. 程式人生 > >TensorFlow與主流深度學習框架對比

TensorFlow與主流深度學習框架對比

引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平臺上橫掃中日韓圍棋高手,取得60連勝,未嘗敗績。AlphaGo背後神祕的推動力就是TensorFlow——Google於2015年11月開源的機器學習及深度學習框架。 
TensorFlow在2015年年底一出現就受到了極大的關注,在一個月內獲得了GitHub上超過一萬顆星的關注,目前在所有的機器學習、深度學習專案中排名第一,甚至在所有的Python專案中也排名第一。本文將帶我們簡單瞭解下TensorFlow,並與其他主流深度學習框架進行了對比。 
本文選自《TensorFlow實戰》。

TensorFlow

  TensorFlow是相對高階的機器學習庫,使用者可以方便地用它設計神經網路結構,而不必為了追求高效率的實現親自寫C++或CUDA程式碼。它和Theano一樣都支援自動求導,使用者不需要再通過反向傳播求解梯度。其核心程式碼和Caffe一樣是用C++編寫的,使用C++簡化了線上部署的複雜度,並讓手機這種記憶體和CPU資源都緊張的裝置可以運行復雜模型(Python則會比較消耗資源,並且執行效率不高)。除了核心程式碼的C++介面,TensorFlow還有官方的Python、Go和Java介面,是通過SWIG(Simplified Wrapper and Interface Generator)實現的,這樣使用者就可以在一個硬體配置較好的機器中用Python進行實驗,並在資源比較緊張的嵌入式環境或需要低延遲的環境中用C++部署模型。SWIG支援給C/C++程式碼提供各種語言的介面,因此其他指令碼語言的介面未來也可以通過SWIG方便地新增。不過使用Python時有一個影響效率的問題是,每一個mini-batch要從Python中feed到網路中,這個過程在mini-batch的資料量很小或者運算時間很短時,可能會帶來影響比較大的延遲。現在TensorFlow還有非官方的Julia、Node.js、R的介面支援。 
  TensorFlow也有內建的TF.Learn和TF.Slim等上層元件可以幫助快速地設計新網路,並且相容Scikit-learn estimator介面,可以方便地實現evaluate、grid search、cross validation等功能。同時TensorFlow不只侷限於神經網路,其資料流式圖支援非常自由的演算法表達,當然也可以輕鬆實現深度學習以外的機器學習演算法。事實上,只要可以將計算表示成計算圖的形式,就可以使用TensorFlow。使用者可以寫內層迴圈程式碼控制計算圖分支的計算,TensorFlow會自動將相關的分支轉為子圖並執行迭代運算。TensorFlow也可以將計算圖中的各個節點分配到不同的裝置執行,充分利用硬體資源。定義新的節點只需要寫一個Python函式,如果沒有對應的底層運算核,那麼可能需要寫C++或者CUDA程式碼實現運算操作。 
  在資料並行模式上,TensorFlow和Parameter Server很像,但TensorFlow有獨立的Variable node,不像其他框架有一個全域性統一的引數伺服器,因此引數同步更自由。TensorFlow和Spark的核心都是一個數據計算的流式圖,Spark面向的是大規模的資料,支援SQL等操作,而TensorFlow主要面向記憶體足以裝載模型引數的環境,這樣可以最大化計算效率。 
  TensorFlow的另外一個重要特點是它靈活的移植性,可以將同一份程式碼幾乎不經過修改就輕鬆地部署到有任意數量CPU或GPU的PC、伺服器或者移動裝置上。相比於Theano,TensorFlow還有一個優勢就是它極快的編譯速度,在定義新網路結構時,Theano通常需要長時間的編譯,因此嘗試新模型需要比較大的代價,而TensorFlow完全沒有這個問題。TensorFlow還有功能強大的視覺化元件TensorBoard,能視覺化網路結構和訓練過程,對於觀察複雜的網路結構和監控長時間、大規模的訓練很有幫助。TensorFlow針對生產環境高度優化,它產品級的高質量程式碼和設計都可以保證在生產環境中穩定執行,同時一旦TensorFlow廣泛地被工業界使用,將產生良性迴圈,成為深度學習領域的事實標準。 
  除了支援常見的網路結構[卷積神經網路(Convolutional Neural Network,CNN)、迴圈神經網路(Recurent Neural Network,RNN)]外,TensorFlow還支援深度強化學習乃至其他計算密集的科學計算(如偏微分方程求解等)。TensorFlow此前不支援symbolic loop,需要使用Python迴圈而無法進行圖編譯優化,但最近新加入的XLA已經開始支援JIT和AOT,另外它使用bucketing trick也可以比較高效地實現迴圈神經網路。TensorFlow的一個薄弱地方可能在於計算圖必須構建為靜態圖,這讓很多計算變得難以實現,尤其是序列預測中經常使用的beam search。 
  TensorFlow的使用者能夠將訓練好的模型方便地部署到多種硬體、作業系統平臺上,支援Intel和AMD的CPU,通過CUDA支援NVIDIA的GPU(最近也開始通過OpenCL支援AMD的GPU,但沒有CUDA成熟),支援Linux和Mac,最近在0.12版本中也開始嘗試支援Windows。在工業生產環境中,硬體裝置有些是最新款的,有些是用了幾年的老機型,來源可能比較複雜,TensorFlow的異構性讓它能夠全面地支援各種硬體和作業系統。同時,其在CPU上的矩陣運算庫使用了Eigen而不是BLAS庫,能夠基於ARM架構編譯和優化,因此在移動裝置(Android和iOS)上表現得很好。 
  TensorFlow在最開始釋出時只支援單機,而且只支援CUDA 6.5和cuDNN v2,並且沒有官方和其他深度學習框架的對比結果。在2015年年底,許多其他框架做了各種效能對比評測,每次TensorFlow都會作為較差的對照組出現。那個時期的TensorFlow真的不快,效能上僅和普遍認為很慢的Theano比肩,在各個框架中可以算是墊底。但是憑藉Google強大的開發實力,很快支援了新版的cuDNN(目前支援cuDNN v5.1),在單GPU上的效能追上了其他框架。下圖為

https://github.com/soumith/convnet-benchmarks給出的各個框架在AlexNet上單GPU的效能評測。 
【圖4】
  目前在單GPU的條件下,絕大多數深度學習框架都依賴於cuDNN,因此只要硬體計算能力或者記憶體分配差異不大,最終訓練速度不會相差太大。但是對於大規模深度學習來說,巨大的資料量使得單機很難在有限的時間完成訓練。這時需要分散式計算使GPU叢集乃至TPU叢集平行計算,共同訓練出一個模型,所以框架的分散式效能是至關重要的。TensorFlow在2016年4月開源了分散式版本,使用16塊GPU可達單GPU的15倍提速,在50塊GPU時可達到40倍提速,分散式的效率很高。目前原生支援的分散式深度學習框架不多,只有TensorFlow、CNTK、DeepLearning4J、MXNet等。不過目前TensorFlow的設計對不同裝置間的通訊優化得不是很好,其單機的reduction只能用CPU處理,分散式的通訊使用基於socket的RPC,而不是速度更快的RDMA,所以其分散式效能可能還沒有達到最優。 
  Google 在2016年2月開源了TensorFlow Serving19,這個元件可以將TensorFlow訓練好的模型匯出,並部署成可以對外提供預測服務的RESTful介面,如圖2-2所示。有了這個元件,TensorFlow就可以實現應用機器學習的全流程:從訓練模型、除錯引數,到打包模型,最後部署服務,名副其實是一個從研究到生產整條流水線都齊備的框架。這裡引用TensorFlow內部開發人員的描述:“TensorFlow Serving是一個為生產環境而設計的高效能的機器學習服務系統。它可以同時執行多個大規模深度學習模型,支援模型生命週期管理、演算法實驗,並可以高效地利用GPU資源,讓TensorFlow訓練好的模型更快捷方便地投入到實際生產環境”。除了TensorFlow以外的其他框架都缺少為生產環境部署的考慮,而Google作為廣泛在實際產品中應用深度學習的巨頭可能也意識到了這個機會,因此開發了這個部署服務的平臺。TensorFlow Serving可以說是一副王牌,將會幫TensorFlow成為行業標準做出巨大貢獻。 
【圖5】

                      TensorFlow Serving架構

  TensorBoard是TensorFlow的一組Web應用,用來監控TensorFlow執行過程,或視覺化Computation Graph。TensorBoard目前支援5種視覺化:標量(scalars)、圖片(images)、音訊(audio)、直方圖(histograms)和計算圖(Computation Graph)。TensorBoard的Events Dashboard可以用來持續地監控執行時的關鍵指標,比如loss、學習速率(learning rate)或是驗證集上的準確率(accuracy);Image Dashboard則可以展示訓練過程中使用者設定儲存的圖片,比如某個訓練中間結果用Matplotlib等繪製(plot)出來的圖片;Graph Explorer則可以完全展示一個TensorFlow的計算圖,並且支援縮放拖曳和檢視節點屬性。TensorBoard的視覺化效果如圖2-3和圖2-4所示。 
【圖6】


                     TensorBoard的loss標量的視覺化 
                      
【圖7】
                     TensorBoard的模型結構視覺化 
                     

主流深度學習框架對比

  TensorFlow擁有產品級的高質量程式碼,有Google強大的開發、維護能力的加持,整體架構設計也非常優秀。相比於同樣基於Python的老牌對手Theano,TensorFlow更成熟、更完善,同時Theano的很多主要開發者都去了Google開發TensorFlow(例如書籍Deep Learning的作者Ian Goodfellow,他後來去了OpenAI)。Google作為巨頭公司有比高校或者個人開發者多得多的資源投入到TensorFlow的研發,可以預見,TensorFlow未來的發展將會是飛速的,可能會把大學或者個人維護的深度學習框架遠遠甩在身後。 
  深度學習研究的熱潮持續高漲,各種開源深度學習框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlow卻殺出重圍,在關注度和使用者數上都佔據絕對優勢,大有一統江湖之勢。 
【圖1】
  上圖為各個開源框架在GitHub上的資料統計(資料統計於2017年1月3日),可以看到TensorFlow在star數量、fork數量、contributor數量這三個資料上都完勝其他對手。究其原因,主要是Google在業界的號召力確實強大,之前也有許多成功的開源專案,以及Google強大的人工智慧研發水平,都讓大家對Google的深度學習框架充滿信心,以至於TensorFlow在2015年11月剛開源的第一個月就積累了10000+的star。其次,TensorFlow確實在很多方面擁有優異的表現,比如設計神經網路結構的程式碼的簡潔度,分散式深度學習演算法的執行效率,還有部署的便利性,都是其得以勝出的亮點。如果一直關注著TensorFlow的開發進度,就會發現基本上每星期TensorFlow都會有1萬行以上的程式碼更新,多則數萬行。產品本身優異的質量、快速的迭代更新、活躍的社群和積極的反饋,形成了良性迴圈,可以想見TensorFlow未來將繼續在各種深度學習框架中獨佔鰲頭。 
  觀察可以發現,Google、Microsoft、Facebook等巨頭都參與了這場深度學習框架大戰,此外,還有畢業於伯克利大學的賈揚清主導開發的Caffe,蒙特利爾大學Lisa Lab團隊開發的Theano,以及其他個人或商業組織貢獻的框架。另外,可以看到各大主流框架基本都支援Python,目前Python在科學計算和資料探勘領域可以說是獨領風騷。雖然有來自R、Julia等語言的競爭壓力,但是Python的各種庫實在是太完善了,Web開發、資料視覺化、資料預處理、資料庫連線、爬蟲等無所不能,有一個完美的生態環境。僅在資料挖據工具鏈上,Python就有NumPy、SciPy、Pandas、Scikit-learn、XGBoost等元件,做資料採集和預處理都非常方便,並且之後的模型訓練階段可以和TensorFlow等基於Python的深度學習框架完美銜接。 
  下面對主流的深度學習框架TensorFlow、Caffe、CNTK、Theano、Torch在各個維度進行了評分。 
【圖2 圖3】
圖片描述
  本文選自《TensorFlow實戰》,點此連結可在博文視點官網檢視此書。 
                      圖片描述

想及時獲得更多精彩文章,可在微信中搜索“博文視點”或者掃描下方二維碼並關注。
                       圖片描述

相關推薦

TensorFlow主流深度學習框架對比

引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平臺上橫掃中日韓圍棋高手,取得60連勝,未嘗敗績。AlphaGo背後神祕的推動力就是TensorFlow——Google於2015年11月開源的機器學習及深度學習框架。 TensorFlow在2015年年底一出現就受到了極大的關注,在一個

2_初學者快速掌握主流深度學習框架Tensorflow、Keras、Pytorch學習程式碼(20181211)

初學者快速掌握主流深度學習框架Tensorflow、Keras、Pytorch學習程式碼 一、TensorFlow 1、資源地址: 2、資源介紹: 3、配置環境: 4、資源目錄: 二、Keras

TensorFlow 實戰Google深度學習框架》中MNIST數字識別問題程式的實現思考

書上的程式: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data __author__: str = 'zhangkun' INPUT_NODE = 784

2017深度學習最新報告及8大主流深度學習框架超詳細對比(內含PPT)

​ 深度學習領軍人物 Yoshua Bengio 主導的蒙特利爾大學深度學習暑期學校目前“深度學習”部分的報告已經全部結束。 本年度作報告的學術和行業領袖包括有來自DeepMind、谷歌大腦、蒙特利爾大學、牛津大學、麥吉爾大學、多倫多大學等等。覆蓋的主題包括:時間遞迴神經網路、自然語言處理、生成模型、大腦

Tensorflow 實戰Google深度學習框架》PDF版

roc mage com size 深度學習框架 pdf 深度學習 ext flow 鏈接:https://pan.baidu.com/s/1Jf8LWJXWUnfpNly0KagVMA《Tensorflow 實戰Google深度學習框架》PDF版

TensorFlow實戰Google深度學習框架 (第2版) 》中文版PDF和源代碼

分享 flow shadow 源代碼 ges ado text href 第2版 下載:https://pan.baidu.com/s/1aD1Y2erdtppgAbk8c63xEw 更多最新的資料:http://blog.51cto.com/3215120 《Tensor

TensorFlow-實戰Google深度學習框架 筆記(上)

當我 日誌 不一定 rain 如何 validate .config 存儲 構建 TensorFlow TensorFlow 是一種采用數據流圖(data flow graphs),用於數值計算的開源軟件庫。在 Tensorflow 中,所有不同的變量和運算都是儲存在計算圖

分享《TensorFlow實戰Google深度學習框架 (第2版) 》中文版PDF和源代碼

技術分享 roc orf 中文版 RoCE term col vpd pan 下載:(https://pan.baidu.com/s/1mrEiGC2B3h6p1iOZuOkGlw) 《TensorFlow實戰Google深度學習框架(第2版)》中文版PDF和源代碼中文版P

Tensorflow 實戰Google深度學習框架 第五章 5.2.1Minister數字識別 原始碼

1 import os 2 import tab 3 import tensorflow as tf 4 5 print "tensorflow 5.2 " 6 7 from tensorflow.examples.tutorials.mnist import input

Tensorflow 實戰Google深度學習框架 第五章 5.2.1Minister數字識別 源代碼

sting var initial testin def after depend reduce sky 1 import os 2 import tab 3 import tensorflow as tf 4 5 print "tensorflow

TensorFlow實戰Google深度學習框架(第2版)》+《TensorFlow實戰_黃文堅》

代碼 tex ref 深度學習框架 term 第2版 ogl type google 資源鏈接:https://pan.baidu.com/s/1n-ydbsnvKag4jWgpHRGIUA《TensorFlow實戰Google深度學習框架(第2版)》中文版PDF和源代碼帶

王權富貴書評:《TensorFlow實戰Google深度學習框架第二版》(鄭澤宇 樑博文 顧思宇 著)

一本介紹TensorFlow的書,比較基礎,但是還是寫的不好。這本是我TensorFlow的啟蒙書,我硬著頭皮看完的,目前還沒發現比這本書好的。 推薦指數:**                   

TensorFlow+實戰Google深度學習框架學習筆記(12)------Mnist識別和卷積神經網路LeNet

一、卷積神經網路的簡述 卷積神經網路將一個影象變窄變長。原本【長和寬較大,高較小】變成【長和寬較小,高增加】 卷積過程需要用到卷積核【二維的滑動視窗】【過濾器】,每個卷積核由n*m(長*寬)個小格組成,每個小格都有自己的權重值, 長寬變窄:過濾器的長寬決定的 高度變高:過濾器的個數決定的 &nb

TensorFlow+實戰Google深度學習框架學習筆記(13)------Mnist識別和卷積神經網路AlexNet

一、AlexNet:共8層:5個卷積層(卷積+池化)、3個全連線層,輸出到softmax層,產生分類。  論文中lrn層推薦的引數:depth_radius = 4,bias = 1.0 , alpha = 0.001 / 9.0 , beta = 0.75 lrn現在僅在AlexNet中使用,

TensorFlow+實戰Google深度學習框架學習筆記(13)------Mnist識別和卷積神經網絡AlexNet

net dev adding 筆記 learn 明顯 lex test info 一、AlexNet:共8層:5個卷積層(卷積+池化)、3個全連接層,輸出到softmax層,產生分類。 論文中lrn層推薦的參數:depth_radius = 4,bias = 1.0 ,

TensorFlow+實戰Google深度學習框架學習筆記(14)------VGGNet

一、VGGNet:5段卷積【每段有2~3個卷積層+最大池化層】【每段過濾器個數:64-128-256-512-512】 每段的2~3個卷積層串聯在一起的作用: 2個3×3的卷積層串聯的效果相當於一個5×5的卷積層,即一個畫素會跟周圍5×5的畫素產生關聯。【28*28的輸入經過一次5*5得到24*24,s=

Tensorflow實戰Google深度學習框架 第1-3章總結

Tensorflow實戰Google深度學習框架 第1章 深度學習簡介 深度學習在NLP上的應用: 1.語言模型 2.機器翻譯 3.詞性標註 4.實體識別 5.情感分析 6.廣告推薦 7.搜尋排序 語料庫: WordNet, ConceptN

【轉載】深度學習框架對比

 深度學習研究的熱潮持續高漲,各種開源深度學習框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlo

TensorFlow實戰Google深度學習框架》——4.2.1 經典損失函式(交叉熵、均方差)

目錄 1、交叉熵 1、交叉熵 交叉熵是分類問題中使用比較廣的一種損失函式,刻畫了兩個概率分佈之間的距離。 給定兩個概率分佈p和q,通過q來表示p的交叉熵為: 交叉熵刻畫的是兩個概率分佈之間的距離,然而神經網路的輸出卻不一定是一個概率分佈。Softmax迴歸就

Deepo:幾乎包含所有主流深度學習框架的Docker映象

背景 最近實驗室要參加一個目標檢測的比賽,這段時間一直在跑ssd模型,最開始根據作者給的文件成功編譯後,可以在VOC資料集上進行訓練。由於要用比賽官方的資料集,因此做了幾天的資料集,然後拿自己的資料集訓練的時候,出現了以下報錯:Check failed: a <= b (0 vs. -1.