深度学习框架的评估与比较
深度學(xué)習(xí)框架的評(píng)估與比較
?InfoQ 原文??http://www.infoq.com/cn/news/2016/01/evaluation-comparison-deep-learn 主題?TensorFlow人工智能無疑是計(jì)算機(jī)世界的前沿領(lǐng)域,而深度學(xué)習(xí)無疑又是人工智能的研究熱點(diǎn),那么現(xiàn)在都有哪些開源的深度學(xué)習(xí)工具,他們各自的優(yōu)缺點(diǎn)又是什么呢?最近zer0n?和?bamos?在GitHub上發(fā)表了一篇文章,對(duì)?Caffe?、?CNTK?、?TensorFlow?、Theano?和?Torch?等深度學(xué)習(xí)工具?從網(wǎng)絡(luò)、模型能力、接口、部署、性能、架構(gòu)、生態(tài)系統(tǒng)、跨平臺(tái)等方面做了比較?。
網(wǎng)絡(luò)和模型能力
Caffe可能是第一個(gè)主流的工業(yè)級(jí)深度學(xué)習(xí)工具,它開始于2013年底,具有出色的卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)。在計(jì)算機(jī)視覺領(lǐng)域Caffe依然是最流行的工具包,它有很多擴(kuò)展,但是由于一些遺留的架構(gòu)問題,它對(duì)遞歸網(wǎng)絡(luò)和語言建模的支持很差。此外,在Caffe中圖層需要使用C++定義,而網(wǎng)絡(luò)則使用Protobuf定義。
CNTK由深度學(xué)習(xí)熱潮的發(fā)起演講人創(chuàng)建,目前已經(jīng)發(fā)展成一個(gè)通用的、平臺(tái)獨(dú)立的深度學(xué)習(xí)系統(tǒng)。在CNTK中,網(wǎng)絡(luò)會(huì)被指定為向量運(yùn)算的符號(hào)圖,運(yùn)算的組合會(huì)形成層。CNTK通過細(xì)粒度的構(gòu)件塊讓用戶不需要使用低層次的語言就能創(chuàng)建新的、復(fù)雜的層類型。
TensorFlow是一個(gè)理想的RNN(遞歸神經(jīng)網(wǎng)絡(luò)) API和實(shí)現(xiàn),TensorFlow使用了向量運(yùn)算的符號(hào)圖方法,使得新網(wǎng)絡(luò)的指定變得相當(dāng)容易,但TensorFlow并不支持雙向RNN和3D卷積,同時(shí)公共版本的圖定義也不支持循環(huán)和條件控制,這使得RNN的實(shí)現(xiàn)并不理想,因?yàn)楸仨氁褂肞ython循環(huán)且無法進(jìn)行圖編譯優(yōu)化。
Theano支持大部分先進(jìn)的網(wǎng)絡(luò),現(xiàn)在的很多研究想法都來源于Theano,它引領(lǐng)了符號(hào)圖在編程網(wǎng)絡(luò)中使用的趨勢。Theano的符號(hào)API支持循環(huán)控制,讓RNN的實(shí)現(xiàn)更加容易且高效。
Torch對(duì)卷積網(wǎng)絡(luò)的支持非常好。在TensorFlow和Theano中時(shí)域卷積可以通過conv2d來實(shí)現(xiàn),但這樣做有點(diǎn)取巧;Torch通過時(shí)域卷積的本地接口使得它的使用非常直觀。Torch通過很多非官方的擴(kuò)展支持大量的RNN,同時(shí)網(wǎng)絡(luò)的定義方法也有很多種。但Torch本質(zhì)上是以圖層的方式定義網(wǎng)絡(luò)的,這種粗粒度的方式使得它對(duì)新圖層類型的擴(kuò)展缺乏足夠的支持。與Caffe相比,在Torch中定義新圖層非常容易,不需要使用C++編程,圖層和網(wǎng)絡(luò)定義方式之間的區(qū)別最小。
接口
Caffe支持?pycaffe?接口,但這僅僅是用來輔助命令行接口的,而即便是使用pycaffe?也必須使用protobuf定義模型。
CNTK的使用方式與Caffe相似,也是通過指定配置文件并運(yùn)行命令行,但CNTK沒有Python或者任何其他高級(jí)語言的接口。
TensorFlow支持Python和C++兩種類型的接口。用戶可以在一個(gè)相對(duì)豐富的高層環(huán)境中做實(shí)驗(yàn)并在需要本地代碼或低延遲的環(huán)境中部署模型。
Theano支持Python接口。
Torch運(yùn)行在LuaJIT上,與C++、C#以及Java等工業(yè)語言相比速度非常快,用戶能夠編寫任意類型的計(jì)算,不需要擔(dān)心性能,唯一的問題就是Lua并不是主流的語言。
模型部署
Caffe是基于C++的,因此可以在多種設(shè)備上編譯,具有跨平臺(tái)性,在部署方面是最佳選擇。
CNTK與Caffe一樣也是基于C++并且跨平臺(tái)的,大部分情況下部署非常簡單。但是它不支持ARM架構(gòu),這限制了它在移動(dòng)設(shè)備上的能力。
TensorFlow支持C++接口,同時(shí)由于它使用了Eigen而不是BLAS類庫,所以能夠基于ARM架構(gòu)編譯和優(yōu)化。TensorFlow的用戶能夠?qū)⒂?xùn)練好的模型部署到多種設(shè)備上,不需要實(shí)現(xiàn)單獨(dú)的模型解碼器或者加載Python/LuaJIT解釋器。但是TensorFlow并不支持Windows,因此其模型無法部署到Windows設(shè)備上。
Theano缺少底層的接口,并且其Python解釋器也很低效,對(duì)工業(yè)用戶而言缺少吸引力。雖然對(duì)大的模型其Python開銷并不大,但它的限制擺在那,唯一的亮點(diǎn)就是它跨平臺(tái),模型能夠部署到Windows環(huán)境上。
Torch的模型運(yùn)行需要LuaJIT的支持,雖然這樣做對(duì)性能的影響并不大,但卻對(duì)集成造成了很大的障礙,使得它的吸引力不如Caffe/CNTK/TensorFlow等直接支持C++的框架。
性能
在單GPU的場景下,所有這些工具集都調(diào)用了cuDNN,因此只要外層的計(jì)算或者內(nèi)存分配差異不大其表現(xiàn)都差不多。本文的性能測試是基于?Soumith@FB的ConvNets基準(zhǔn)測試?來做的。
Caffe簡單快速。
CNTK簡單快速。
TensorFlow僅使用了cuDNN v2,但即使如此它的性能依然要比同樣使用cuDNN v2的Torch要慢1.5倍,并且在批大小為128時(shí)訓(xùn)練GoogleNet還出現(xiàn)?了內(nèi)存溢出的問題?。
Theano在大型網(wǎng)絡(luò)上的性能與Torch7不相上下。但它的主要問題是啟動(dòng)時(shí)間特別長,因?yàn)樗枰獙/CUDA代碼編譯成二進(jìn)制,而TensorFlow并沒有這個(gè)問題。此外,Theano的導(dǎo)入也會(huì)消耗時(shí)間,并且在導(dǎo)入之后無法擺脫預(yù)配置的設(shè)備(例如?GPU0?)。
Torch非常好,沒有TensorFlow和Theano的問題。
另外,在多GPU方面,CNTK相較于其他的深度學(xué)習(xí)工具包表現(xiàn)更好,它實(shí)現(xiàn)了1-bit SGD和自適應(yīng)的minibatching。
架構(gòu)
Caffe的架構(gòu)在現(xiàn)在看來算是平均水準(zhǔn),它的主要痛點(diǎn)是圖層需要使用C++定義,而模型需要使用protobuf定義。另外,如果想要支持CPU和GPU,用戶還必須實(shí)現(xiàn)額外的函數(shù),例如?Forward_gpu?和?Backward_gpu?;對(duì)于自定義的層類型,還必須為其分配一個(gè)int類型的id,并將其添加到proto文件中。
TensorFlow的架構(gòu)清晰,采用了模塊化設(shè)計(jì),支持多種前端和執(zhí)行平臺(tái)。
Theano的架構(gòu)比較變態(tài),它的整個(gè)代碼庫都是Python的,就連C/CUDA代碼也要被打包為Python字符串,這使得它難以導(dǎo)航、調(diào)試、重構(gòu)和維護(hù)。
Torch7和nn類庫擁有清晰的設(shè)計(jì)和模塊化的接口。
跨平臺(tái)
Caffe、CNTK和Theano都能在所有的系統(tǒng)上運(yùn)行,而TensorFlow和Torch則不支持Windows。
感謝杜小芳對(duì)本文的審校。
給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,請(qǐng)郵件至editors@cn.infoq.com。也歡迎大家通過新浪微博(@InfoQ,@丁曉昀),微信(微信號(hào):?InfoQChina?)關(guān)注我們,并與我們的編輯和其他讀者朋友交流(歡迎加入InfoQ讀者交流群?(已滿),InfoQ讀者交流群(#2)??)。
總結(jié)
以上是生活随笔為你收集整理的深度学习框架的评估与比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSE命令示例代码(算术、逻辑、比较)
- 下一篇: Caffe上训练使用自己的数据