深度學習領域開源框架對比

深度學習領域開源的框架有很多,比如 caffe、TensorFlow、Theano、Torch,到底哪種框架更爲優秀呢?我的同學在例會上進行了詳細的介紹,後面總結成了這篇博文,轉載並總結之以更好的學習很好。原博文地址:http://blog.csdn.net/u010167269/article/details/51810613

主要與大家的分享來自這篇論文《Comparative Study of Deep Learning Software Frameworks》,這篇文章對現在流行的五個開源深度學習框架caffe、Neon、TensorFlow、Theano、Torch 做了比較,很嚴謹。作者也開源了他們的比較 Benchmarks 代碼:https://github.com/DL-Benchmarks/DL-Benchmarks

如果您急着看比較結果,可以從目錄直接跳到 Conclusion 部分


Abstract

五個開源框架:caffe、Neon、TensorFlow、Theano、Torch
比較的三方面:可擴展性(extensibility)、hardware utilization(硬件利用率)以及大家最關心的:速度(speed)

評估測試都是部署在單機上,對於多線程 CPU、GPU(Nvidia Titan X)都進行測試;
速度評估標準包括了梯度計算時間(gradient computation time)、前向傳播時間(forward time)
對於卷積網絡,作者還對這幾個深度框架支持的不同的卷積算法以及相應的性能表現做了實驗;

最後通過實驗,作者發現 Theano、Torch最具擴展性的深度學習框架
CPU 上的測試性能來看Torch 最優,其次是 Theano
GPU 上的性能表現,對於大規模卷積以及全連接網絡,還是 Torch 最優,其次是Neon
但是 Theano 在部署和訓練 LSTM 網絡中奪得拔籌;
caffe 是最容易測試評估性能的標準深度學習框架;
最後,TensorFlowTheano 有些相似,是比較靈活的框架,但是其性能表現,目前還跟上面的幾個框架比不起來。

但是,這篇文章發表的時候,TensorFlow 還只能用 cuDNN v.2 版本。現在怎麼樣,還需要做新的實驗。

Introduction

現在大多數成功的深度學習架構由幾種不同類型的網絡層組合而成,如 全連接層(fully connected layer)卷積層(convolutional layer)遞歸層(recurrent layer)。之後用各種隨機梯度下降算法(stochastic gradient descent algorithm),以及一些正則化技術(regularization),如dropout、weight decay

伴隨着深度學習的流行與成功,一些深度學習框架不斷涌現,包括但不限於:

不同的框架從不同的角度去部署、訓練深度學習算法。例如:caffe 強調使用的簡單性,所以在 caffe 中,在網絡中添加一個層很簡單。又如,Theano 可以自動求微分,可以方便的修改架構,以便研究與開發。

前不久,有人已經評測了幾種深度學習框架的性能:https://github.com/soumith/convnet-benchmarks,但是這個比較只是在卷積網絡架構上進行比較(並且忽視掉了與卷積無關測網絡層,如dropout 層、Softmax 層)。

這篇文章對評測比較實驗進行了擴展,從上面的一些開源架構中,選擇了五種有代表性的框架:caffe、Neon、TensorFlow、Theano、Torch
其中,caffe、Theano、Torch 是目前深度學習社區使用最多的框架。
本論文中加入 Neon 的評測,是因爲在上面的評測中,Neon 取得了卓越的性能表現。
而對 TensorFlow 進行評測,是因爲自從 TensorFlow 被 Google 開源之後,取得了耀眼的關注度,在 Github 上的Star 數量已經到27,362 了。而 caffe 也才 11,062Star 。在這篇文章進行評測的時候,TensorFlow 還沒有支持最新的 cuDNN v.3,還只支持 cuDNN v.2。但爲了評測的完整性,還是將 TensorFlow 加進入了。

在對這些框架進行評估時,考慮以下三個方面:

  • 可擴展型(Extensibility): 一是對於不同類型的網絡層:全連接層(fully-connected layer)卷積層(convolutional layer)遞歸層(recurrent layer)的組合能力;二是對於不同訓練過程支持的能力,如非監督逐層預訓練(unsupervised layer-wise pre-training)監督訓練(supervised learning);三是對於不同卷積層的支持能力,如支持不支持FFT-based 算法
  • 硬件利用率(Hardware Utilization): 這些框架對於硬件資源的結合、調用情況。如對於 多線程 CPU 的支持使用、對於 GPU 調用的設置情況。
  • 速度(speed): 這些框架在訓練方面、部署方面的速度表現性能。

這項研究可以便於深度學習個人與企業,瞭解深度學習框架的強項、弱項,以便於可以根據自身的需求來使用這些開源框架。
此外,本文還探究了深度學習框架當前的一些不足與限制,以便在未來能夠得到解決。

Overview of the deep learning frameworks

這裏有一個深度學習框架列表,總結了目前幾乎所有的深度學習框架:http://deeplearning.net/software_links/。現在這些框架有些已經成熟了,在 CUDA 的幫助下,能夠非常高效地訓練具有數百萬個參數的神經網絡。
下面的 表1 展示了 Google groups 中使用者的數量,以及每個深度學習框架在 Github 倉庫中貢獻者的數量(截至2016.02.08):

這裏寫圖片描述

可以看見,使用者與貢獻者最多的是:caffe、Theano、Torch,這也是本文選擇這三個框架做評測的原因之一。

表2 展示了這幾個深度學習框架的通用屬性:

這裏寫圖片描述


Benchmarking Setup

Evaluation Metrics

作者用下面的兩個評估標準來評測五個開源深度學習框架的性能:

  • 前向傳播時間(Forward Time): 給定一個數據集、神經網絡,將輸入數據通過網絡處理後,產生相應的輸出數據,這個過程走過的時間,就是前向傳播的時間。如果我們要將深度網絡部署在實際生活中應用,前向傳播時間就非常重要。
  • 梯度計算時間(Gradient Computation Time): 對於給定的 input batch,每一個 parameter 得到一個對應的梯度的時間,這個時間消耗也被納入評測標準。注意到,對於大多數的框架(如:Torch),梯度計算時間是指調用forward 函數、backward 函數,這兩個函數計算所用時間之和。但是對於 Theano,梯度計算時間是指調用 Theano 編譯生成的梯度計算函數,這個函數隱式地執行了 forwardbackward 過程。另外,梯度計算時間不包含計算完梯度後,對梯度進行更新的時間。

因爲對於 Theano ,一開始是需要花費時間去編譯生成前向傳播函數、梯度計算函數。

事實上,這個正是 Theano 被衆多使用者“噴“的地方,因爲速度實在是太…慢…了…我使用過 Theano 這個,但感覺還好,可能我的工程不是很大吧,但是這個確實是個問題。之後 Theano 執行的時候就一點也不慢了。因爲這個過程是 Theano 將 Python 代碼 編譯爲 C 代碼,所以調用的時候,速度很快。

System setup

本實驗都是在單機上完成的,操作系統爲 Ubuntu 14.04,CPU 爲 Intel Xeon CPU E5-1650 v2 @3.5GHz,GPU 爲Nvidia GeForce GTX Titan X/PCIe/SSE2,32G 的 DDR3 內存,SSD 硬盤。

使用的框架版本、依賴庫及其版本:

  • OpenCV 3.0
  • OpenBLAS 0.2.14
  • caffe 使用的 commit ID:8c8e832
  • Neon 版本:1.0.0.rc1 (2015-09-08),commit ID:a6766f
  • TensorFlow 版本:0.6.0,使用 pip install 安裝的
  • Theano 版本:0.7.0.dev,commit ID:662ea98
  • Torch7,commit ID:8c8e832,fbcunn 的 commit ID:5bb9785
  • caffe、Theano、Torch 的 CUDA 版本爲 CUDA 7.5,cuDNN 版本爲 cuDNN v3。TensorFlow 的 CUDA 版本爲 CUDA 7.0,cuDNN 版本爲 cuDNN v2
  • Data arrays 是按照 float32 存儲

Results and Discussion

評測實驗一是在 MNIST 數據集、ImageNet 數據集上訓練 棧式自編碼(stacked auto-encoder network)網絡,卷積網絡,二是在 IMDB review 數據集上訓練 LSTM 網絡。

注意,使用原始的框架,以及將這個深度學習框架結合基於 CUDA 包,這兩者的測試結果可能會差別很大。
如在 Torch 中,我們可以用 Nvidia cuDNN 庫,或者用 cunn 庫,或者使用 fbcunn 庫(Facebook AI 研究組開發的 深度學習 CUDA 擴展庫,包括 FFT-based 卷積)。
在 Theano 中,我們可以直接使用 cuDNN 或者 conv-fft 實施卷積操作,conv-fft 是 FFT-based 的 Theano 實現。


LeNet

第一個基準測試實驗是在 MNIST 數據集,在 LeNet 網絡上進行實驗。與原始的 LeNet 不同,這裏將原先的 Sigmoid 激活函數換成了ReLU 激活函數,將原先的RBF 網絡 換成了 Softmax logistic loss layer

LeNet 是第一個正式的卷積神經網絡模型,在 LeCun 的 Paper 上:《Gradient-based learning applied to document recognition》,引用量5368 次。
LeNet 包括兩個 卷積 - 池化(conv-pooling) 層,兩個 全連接層(fully connected layer),如下圖所示:

下表展示了五個深度學習框架的梯度計算、前向傳播過程在 CPU、GPU 上的平均處理時間。其中, batch size 設置爲64

這裏寫圖片描述

對於 CPU 的實驗統計時間,CPU 線程使用的個數也被統計在表格中。其中的 Neon 不能使用多線程,因此 Neon 的 CPU 實驗時間統計只有但線程的結果。對於 caffe,caffe 的多線程使用的個數,需要在安裝的時候決定好。這裏是12 個線程,因此 caffe 的 CPU 實驗只有 12 線程的時間統計結果。
TensorFlow、Theano、Torch 可以靈活地選擇使用的 CPU 線程數,因此他們的 CPU 的實驗時間有多個結果。
因爲我們的機器有 6 個物理核,但用 Hpyer-Threading 的技術,可以使用 12 個線程。因此,我們統計 6 線程、12 線程的實驗結果。

當用 GPU 進行實驗時,對於每個深度學習框架,使用基礎的卷積加速庫(如:cuDNN),並指明版本(版本越高,速度越快)。Neon 使用自己的 GPU/CPU backend。

從結果中可以看出,對於訓練 LeNet,GPU的效率相比較於 CPU,是碾壓性的。而且,對於更大的數據量,更大的網絡模型,GPU 的這種優勢將會更明顯。

CPU 階段的實驗來看,Torch 的表現最好,而 Neon 的表現最差。對於 GPU 的實驗看,cuDNN 的加速效果要明顯好於 conv-fft 。LeCun 的一篇 Paper 《Fast Training of Convolutional Networks Through FFT》提到,一般來說,FFT-based 的性能表現,高度取決於input 的 size,以及kernel size

梯度計算的時間最好的是 Theano,只有 1.4s,當然,Torch 的表現也很棒,1.7s。而對於前向傳播的時間,Theano 以及 Torch 打了個平手。之前耀眼的 TensorFlow 在 GPU 實驗中的表現是最差的。可能的原因是 TensorFlow 使用的是 cuDNN v.2 版本,而 caffe、Theano、Torch 使用的是 cuDNN v.3 版本。

還應該注意到 MNIST 是相對較小的一個數據集,可以很容易的“放進“ CPU 的內存,或者 GPU 的顯存中。因此,Theano、Torch、Neon 是一次性的將數據全部讀入顯存中。這樣避免了後來將數據從本地拷貝到 GPU 中所造成的延遲。

在 Theano 中,這個可以用 shared variables 來完成。
在 Torch 中,可以調用 cuda( ) 函數來完成
在 Neon 中,可以使用 DataIterator class
在 TensorFlow 中,這個可以在定義變量的時候,通過設置合適的參數來完成
在 caffe 中,將整個訓練數據集拷貝到顯存中,可以用 MemoryData layer

下圖展示了五個深度學習框架在 GPU 上,用不同的 batch size,各自 batch size 的梯度計算時間,前向傳播時間的統計:

這裏寫圖片描述

從圖中可以看出,當 batch size 較小時,Theano 的梯度計算時間最短,而當 batch size 較大時,Neon 的梯度計算時間最短。
而在前向傳播實驗中,Theano 不管 batch size 的大小,其前向傳播時間都最短,而且隨着 batch size 的變大,其優勢更明顯。
caffe、Torch的表現,隨着 batch size 的變大,其性能下降的很明顯。TensorFlow 表現一直很“穩定“ — 性能都最差,尤其是當batch size 越小的時候。

AlexNet

在這一部分的實驗中,我們將用 ImageNet 去訓練 AlexNet 。其實也有很多最新的、更大的網絡模型,如 GoogleNet,Oxford Net 等等。但是因爲 AlexNet 是第一個大幅提升 ImageNet 比賽結果的深度網絡模型(2012 年 ImageNet 比賽),而且 AlexNet 非常流行,很具代表性。

AlexNet 前 5 層是卷積層,後 3 層是全連接層,最後一個全連接層的 output 是一個具有 1000 輸出的  

圖像被 crop224×224。並沒有做數據增廣處理(data augmentation,如:random cropping,transformation)。

這個 AlexNet 網絡模型,caffe 的版本、Neon 的版本在它們的 Github 倉庫中就有,但是 Neon 不支持 Grouping 層、LRN 層。
TensorFlow 的版本改編自:https://github.com/soumith/convnet-benchmarks,同樣的,TensorFlow 目前還不支持Grouping 層。
Theano 的版本改編自 《Theano-based Large-scale Visual Recognition with Multiple GPUs》這篇文章裏的,不過沒有用 GPU 並行。

更具體的,實現每個框架的 AlexNet 的時候, 我們沒有使用 dimshuffle 操作 。
Theano 在 GPU 上的卷積操作,本文既調用了 來自 cuDNN 庫裏的 dnn.dnn_conv 函數,又使用了 pylearn2 中的 cuda-convnet 接口裏面的對應的卷積操作函數 。對於後者,本文標記爲:cuconv
對於 Torch,跟上面的 LeNet 一樣,我們既使用了 cuDNN 卷積卷積加速庫,又使用了 cunn 庫、fbcunn 庫,並分別做了時間消耗統計。

由於 fbcunn 庫,當 stride lengths 大於 1 的時候,不支持。所以實現這個版本的 AlexNet 的時候,一開始的卷積操作,我們使用了 cuDNN 的庫函數,剩下的卷積操作,我們使用 fbcunn 庫來完成。此外,fbcunn 庫、cunn 庫不支持 grouping 層。

下面的表,展示了當 batch size 等於 256 的時候,五個深度學習框架的 AlexNet 訓練的效率統計:

這裏寫圖片描述

爲了更好的比較,每個框架的數據加載時間、數據預處理時間(mean normalization)被我們去除掉了。
我們還彙報了 GPU 顯存使用的峯值,來展示每個框架的的效率。
在 CPU 實驗中,Torch 的性能最好,與上面 LeNet 的測試結果相似。使用 GPU 時的加速效果比 LeNet 中更明顯(提高了至少 25×)。同時,Torch 在 GPU 上的 梯度計算 性能最好(上面 LeNet 實驗時 Theano,不過那時候 Torch 與 Theano 相差無幾)。但是在前向傳播 中,Neon 的性能最好,但是 Torch 也緊隨其後,與之相差無幾(Neon 中的沒有 LRN 層,同時 grouping 設置爲1)。
與 LeNet 相似,TensorFlow 效果最差…

下面的圖,展示了在 GPU 實驗上(無 LRN 層,grouping 設置爲 1),當batch size 的大小設置不同的值時,五個深度學習框架的性能表現:

這裏寫圖片描述

前向傳播 性能測試上,Neon、Torch 的性能表現一直很優異,時間都最短。但是在 梯度計算 測試中,Neon 最好。

GPU 的使用效率上,caffe、Theano、Torch 的GPU使用效率都差不多(當使用 cuDNN 的時候),但是 Neon 的使用效率最高。TensorFlow 的消耗最大。

在本實驗中,還注意到,caffe 中使用的 LMDB 數據庫的性能相比較於 Neon 的,Theano 的,Torch 的數據讀取,更高效,因爲它支持 併發讀取(concurrent read) 。caffe 還使用了 pre-fetching 來消除 IO 延遲。所以,Neon、Theano、Torch 在以後的改進中,可以加入對 LMDB 數據讀取、pre-fetching 的支持。

論文中接下去在 棧式自編碼網絡(stacked autoencoders)長短期記憶網絡(LSTM)中的實驗,由於我對這兩種網絡研究不深,所以先擱下,以後有機會再寫。

Conclusions

通過上面的實驗,以 梯度計算時間(gradient computation time)前向傳播時間(forward time) 爲基準,比較了五個較爲有影響力的深度學習框架:caffe、Theano、Neon、Torch 以及 TensorFlow 的性能。總結如下:

  • Theano、Torch 是兩個最具有擴展性的深度學習框架,無論在支持的各種網絡層種類數量上,或者是在支持的各種庫上。symbolic differentiation 是 Theano 中對於 非標準深度網絡架構(non-standard deep architecture) 提供的最有用的特性。Torch 正在補上這個空缺,可以參考這個博客:https://blog.twitter.com/2015/autograd-for-torch
  • 在 CPU 上 training 以及 deploy,對於任何的網絡模型,Torch 的性能都最優,其次是 Theano,Neon 的在 CPU 上的性能最差
  • 在 GPU 上 deploy 已經訓練好的卷積和全連接網絡(也就是 前向傳播過程),Torch 也是最適合的,其次是 Theano
  • 在 GPU 上 training 卷積和全連接網絡,Theano 在小網絡模型(LeNet)的表現最好,在大網絡模型(AlexNet)上,Torch 性能最佳。Neon 在大網絡模型上也非常有優勢
  • Torch 受益於它衆多的擴展庫及文檔(這個確實,Torch 的文檔閱讀性很強,Theano 也不錯),還有 Torch 的錯誤調試工具也很有優勢
  • TensorFlow 是非常具有擴展性的一個深度學習框架,尤其是在不同情況的各種設備上,進行深度學習框架部署時,更方便穩定。但是在單機上,它的表現就不具有那麼強的競爭力了

Postscript

看完這篇文章後,我發現其實本文還少了一個很重要的框架:MXnet 。MXnet 是由DMLC 團隊 開發的,主要貢獻者有 發明XGBoost陳天奇 等等大神。在一些測試中,它的性能已經優於上面的幾個框架,而且它也支持分佈式,能夠運行 Torch 的所有代碼(我看 MXnet 的一個作者的微博上說的…沒試過…)。

MXnet 與 caffe、TensorFlow 之間的對比,我推薦一篇博客吧,像上文中那樣具體的實驗分析在這裏就先不寫了。博客地址:http://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html,個人感覺現在 MXnet 就是 model 太少了,不像 caffe,都有 Caffe Model Zoo ……

另外,再推薦一篇 Github 上的文章:https://github.com/zer0n/deepframeworks,也是對 Caffe、CNTK、TensorFlow、Theano、Torch 做了比對。從Modeling CapabilityInterfacesModel DeploymentPerformanceArchitecture 這幾個方面做了比較。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章