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

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

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架構git

  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的模型結構可視化 
                     github

主流深度學習框架對比

  TensorFlow擁有產品級的高質量代碼,有Google強大的開發、維護能力的加持,總體架構設計也很是優秀。相比於一樣基於Python的老牌對手Theano,TensorFlow更成熟、更完善,同時Theano的不少主要開發者都去了Google開發TensorFlow(例如書籍Deep Learning的做者Ian Goodfellow,他後來去了OpenAI)。Google做爲巨頭公司有比高校或者我的開發者多得多的資源投入到TensorFlow的研發,能夠預見,TensorFlow將來的發展將會是飛速的,可能會把大學或者我的維護的深度學習框架遠遠甩在身後。 
  深度學習研究的熱潮持續高漲,各類開源深度學習框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch七、MXNet、Leaf、Theano、DeepLearning四、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實戰》,點此連接可在博文視點官網查看此書。 
                      圖片描述算法

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

相關文章
相關標籤/搜索