深度學習框架的評估與比較

轉自深度學習微信公衆號

本文來自:InfoQ

http://www.infoq.com/cn/news/2016/01/evaluation-comparison-deep-learn

 

人工智能無疑是計算機世界的前沿領域,而深度學習無疑又是人工智能的研究熱點,那麼現在都有哪些開源的深度學習工具,他們各自的優缺點又是什麼呢?最近zer0n和bamos在GitHub上發表了一篇文章,對Caffe、CNTK、TensorFlow、Theano和Torch等深度學習工具從網絡、模型能力、接口、部署、性能、架構、生態系統、跨平臺等方面做了比較。

                            網絡和模型能力

Caffe可能是第一個主流的工業級深度學習工具,它開始於2013年底,具有出色的卷積神經網絡實現。在計算機視覺領域Caffe依然是最流行的工具包,它有很多擴展,但是由於一些遺留的架構問題,它對遞歸網絡和語言建模的支持很差。此外,在Caffe中圖層需要使用C++定義,而網絡則使用Protobuf定義。

CNTK由深度學習熱潮的發起演講人創建,目前已經發展成一個通用的、平臺獨立的深度學習系統。在CNTK中,網絡會被指定爲向量運算的符號圖,運算的組合會形成層。CNTK通過細粒度的構件塊讓用戶不需要使用低層次的語言就能創建新的、複雜的層類型。

TensorFlow是一個理想的RNN(遞歸神經網絡) API和實現,TensorFlow使用了向量運算的符號圖方法,使得新網絡的指定變得相當容易,但TensorFlow並不支持雙向RNN和3D卷積,同時公共版本的圖定義也不支持循環和條件控制,這使得RNN的實現並不理想,因爲必須要使用Python循環且無法進行圖編譯優化。

Theano支持大部分先進的網絡,現在的很多研究想法都來源於Theano,它引領了符號圖在編程網絡中使用的趨勢。Theano的符號API支持循環控制,讓RNN的實現更加容易且高效。

Torch對卷積網絡的支持非常好。在TensorFlow和Theano中時域卷積可以通過conv2d來實現,但這樣做有點取巧;Torch通過時域卷積的本地接口使得它的使用非常直觀。Torch通過很多非官方的擴展支持大量的RNN,同時網絡的定義方法也有很多種。但Torch本質上是以圖層的方式定義網絡的,這種粗粒度的方式使得它對新圖層類型的擴展缺乏足夠的支持。與Caffe相比,在Torch中定義新圖層非常容易,不需要使用C++編程,圖層和網絡定義方式之間的區別最小。

                              接口

Caffe支持pycaffe接口,但這僅僅是用來輔助命令行接口的,而即便是使用pycaffe也必須使用protobuf定義模型。

CNTK的使用方式與Caffe相似,也是通過指定配置文件並運行命令行,但CNTK沒有Python或者任何其他高級語言的接口。

TensorFlow支持Python和C++兩種類型的接口。用戶可以在一個相對豐富的高層環境中做實驗並在需要本地代碼或低延遲的環境中部署模型。

Theano支持Python接口。

Torch運行在LuaJIT上,與C++、C#以及Java等工業語言相比速度非常快,用戶能夠編寫任意類型的計算,不需要擔心性能,唯一的問題就是Lua並不是主流的語言。

                              模型部署

Caffe是基於C++的,因此可以在多種設備上編譯,具有跨平臺性,在部署方面是最佳選擇。

CNTK與Caffe一樣也是基於C++並且跨平臺的,大部分情況下部署非常簡單。但是它不支持ARM架構,這限制了它在移動設備上的能力。

TensorFlow支持C++接口,同時由於它使用了Eigen而不是BLAS類庫,所以能夠基於ARM架構編譯和優化。TensorFlow的用戶能夠將訓練好的模型部署到多種設備上,不需要實現單獨的模型解碼器或者加載Python/LuaJIT解釋器。但是TensorFlow並不支持Windows,因此其模型無法部署到Windows設備上。

Theano缺少底層的接口,並且其Python解釋器也很低效,對工業用戶而言缺少吸引力。雖然對大的模型其Python開銷並不大,但它的限制擺在那,唯一的亮點就是它跨平臺,模型能夠部署到Windows環境上。

Torch的模型運行需要LuaJIT的支持,雖然這樣做對性能的影響並不大,但卻對集成造成了很大的障礙,使得它的吸引力不如Caffe/CNTK/TensorFlow等直接支持C++的框架。

                               性能

在單GPU的場景下,所有這些工具集都調用了cuDNN,因此只要外層的計算或者內存分配差異不大其表現都差不多。本文的性能測試是基於Soumith@FB的ConvNets基準測試來做的。

Caffe簡單快速。

CNTK簡單快速。

TensorFlow僅使用了cuDNN v2,但即使如此它的性能依然要比同樣使用cuDNN v2的Torch要慢1.5倍,並且在批大小爲128時訓練GoogleNet還出現了內存溢出的問題。

Theano在大型網絡上的性能與Torch7不相上下。但它的主要問題是啓動時間特別長,因爲它需要將C/CUDA代碼編譯成二進制,而TensorFlow並沒有這個問題。此外,Theano的導入也會消耗時間,並且在導入之後無法擺脫預配置的設備(例如GPU0)。

Torch非常好,沒有TensorFlow和Theano的問題。

另外,在多GPU方面,CNTK相較於其他的深度學習工具包表現更好,它實現了1-bit SGD和自適應的minibatching。

                              架構

Caffe的架構在現在看來算是平均水準,它的主要痛點是圖層需要使用C++定義,而模型需要使用protobuf定義。另外,如果想要支持CPU和GPU,用戶還必須實現額外的函數,例如Forward_gpuBackward_gpu;對於自定義的層類型,還必須爲其分配一個int類型的id,並將其添加到proto文件中。

TensorFlow的架構清晰,採用了模塊化設計,支持多種前端和執行平臺。

Theano的架構比較變態,它的整個代碼庫都是Python的,就連C/CUDA代碼也要被打包爲Python字符串,這使得它難以導航、調試、重構和維護。

Torch7和nn類庫擁有清晰的設計和模塊化的接口。

                              跨平臺

Caffe、CNTK和Theano都能在所有的系統上運行,而TensorFlow和Torch則不支持Windows。

發佈了32 篇原創文章 · 獲贊 17 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章