開(kāi)源深度學(xué)習框架對比
本節對5個(gè)開(kāi)源深度學(xué)習框架進(jìn)行對比研究,主要側重于3個(gè)維度研究:硬件支持率、速度和準確率、社區活躍性。他們分別是:TensorFlow、Caffe、Keras、Torch、DL4j 。
本文引用地址:http://dyxdggzs.com/article/201807/383883.htm2.3.1 硬件支持率
本節研究的硬件利用率指不同開(kāi)源深度學(xué)習框架對于不同CPU/GPU配置下對硬件的支持效率與通用性能表現。

表2.1展示了各框架對于不同硬件的通用支持性能。
2.3.2 速度和準確率
本節將梯度計算時(shí)間、前饋傳播和反饋傳播時(shí)間總和度量,不對各項進(jìn)行細分。且所有試驗數據基于CPU。
模型
本節選取全鏈接神經(jīng)網(wǎng)絡(luò )(Fully Connected Neural Network, FCNN)作為深度學(xué)習框架速度測試模型。FCNN被視為前饋多層感知網(wǎng)絡(luò ),意味著(zhù)網(wǎng)絡(luò )神經(jīng)元之間的連接是單向的,不包含環(huán)狀連接,因此容易獲得時(shí)間數據。FCNN最主要的用途在于進(jìn)行數據分類(lèi)工作,因此適合對不同框架下的準確率進(jìn)行對比。
數據集
本節選取MNIST手寫(xiě)數字圖片集作為FCNN的數據集對不同框架進(jìn)行測試。MNIST數據集由6000張訓練圖像集和1000張測試圖像集組成,均為28X28像素的手寫(xiě)數字圖片。
測試方法
本節目標在于對比測試FCNN類(lèi)型的神經(jīng)網(wǎng)絡(luò )在不同框架上的收斂所耗時(shí)間以及預訓練網(wǎng)絡(luò )在不同框架上對于分類(lèi)結果預測的準確性。主要考察以下方面:1.收斂速度;2.預測耗時(shí);3.分類(lèi)準確性;4.源代碼規模;
為了評估模型的可擴展性,采用不同的擴展性因子來(lái)度量上述1-3點(diǎn)。神經(jīng)網(wǎng)絡(luò )結構采用兩種尺度進(jìn)行測試:1.使用相同的神經(jīng)元數來(lái)改變網(wǎng)絡(luò )的“深度”(見(jiàn)圖2.10);2.使用相同的層數來(lái)改變網(wǎng)絡(luò )的“寬度”(見(jiàn)圖2.11);

圖2.9 “深度”改變了的神經(jīng)網(wǎng)絡(luò )

圖2.10 “寬度”改變了的神經(jīng)網(wǎng)絡(luò )
測試結果
圖2.11-圖2.14展示了FCNN基于各框架使 用Tanh非線(xiàn)性激活函數的情況下的訓練時(shí)間、預測時(shí)間和分類(lèi)準確度。所有試驗的Epoch設定為10。

圖2.11 基于Tanh激活的FCNN在改變“深度”情況下的訓練時(shí)間

圖2.12 基于Tanh激活的FCNN在改變“深度”情況下的預測時(shí)間

圖2.13 基于Tanh激活的FCNN在改變“深度”情況下的分類(lèi)準確率
類(lèi)似的,圖2.14-圖2.16展示了FCNN基于各框架使用ReLU非線(xiàn)形激活函數的情況下的訓練時(shí)間。

圖2.14 基于ReLU激活的FCNN在改變“深度”情況下的訓練時(shí)間

圖2.15 基于ReLU激活的FCNN在改變“深度”情況下的預測時(shí)間

圖2.16 基于ReLU激活的FCNN在改變“深度”情況下的分類(lèi)準確率
下面的試驗考察當網(wǎng)絡(luò )隱含層的尺寸(如神經(jīng)元個(gè)數)如圖2.10的方式改變時(shí),FCNN在不同框架上的速度、準確率的變化情況。試驗結果分別于圖2.17-圖2.19種一同樣的方式被展示。

圖2.17 基于ReLU激活的FCNN在改變“寬度”情況下的訓練時(shí)間

圖2.18 基于ReLU激活的FCNN在改變“寬度”情況下的預測時(shí)間

圖2.19 基于ReLU激活的FCNN在改變“寬度”情況下的分類(lèi)準確率
我們結合相關(guān)算法實(shí)現的代碼量與接口語(yǔ)言來(lái)衡量深度學(xué)習框架的復雜度。各框架的復雜度對比見(jiàn)表2.1和圖2.20所示。

表2.1 各框架的復雜性

圖2.20 復雜性的代碼行表現
2.3.3 社區活躍度
速度是衡量源深度學(xué)習框架性能的一個(gè)重要指標,同時(shí),對各開(kāi)源深度學(xué)習框架的貢獻者數量和開(kāi)源社區的活躍度也同等重要。無(wú)論對于學(xué)術(shù)研究或是工業(yè)項目開(kāi)發(fā)與部署,社區活躍度與知識獲取與開(kāi)發(fā)成本關(guān)系十分密切。
GitHub社區項目的Watch、Star、Fork數量可反映出各深度學(xué)習框架的活躍度(如圖2.21-2.23所示)。其中Watch反應了各框架的瀏覽量,Star數量代表社區使用者對框架的點(diǎn)贊數,Fork則指框架被拷貝的數量。

圖2.21 GitHub社區各開(kāi)源深度學(xué)習框架的Watch數

圖2.22 GitHub社區各開(kāi)源深度學(xué)習框架的Star數

圖2.23 GitHub社區各開(kāi)源深度學(xué)習框架的Fork數
當跳出深度學(xué)習框架本身,在GitHub檢索基于各框架的項目、筆記、討論時(shí),圖2.24-圖2.26展示出了基于各框架的項目的活躍情況。

圖2.24 GitHub社區基于各開(kāi)源深度學(xué)習框架的repositories

圖2.25 GitHub社區基于各開(kāi)源深度學(xué)習框架的Commits

圖2.26 GitHub社區基于各開(kāi)源深度學(xué)習框架的Commits
2.3.3 工業(yè)表現能力
開(kāi)源深度學(xué)習框架不僅對學(xué)術(shù)研究提供了有力的支持,同時(shí)也為工業(yè)界解決任務(wù)提供了眾多解決方案。本節將從模型表達能力、接口、部署、性能和架構等方面度量各開(kāi)源框架在工業(yè)生產(chǎn)領(lǐng)域的表現。

圖2.27 各框架支持語(yǔ)言

表2.2 各框架工業(yè)能力評分(GitHub)
網(wǎng)絡(luò )和模型能力
Caffe在計算機視覺(jué)領(lǐng)域是最流行的工具包,有很多擴展,但對遞歸網(wǎng)絡(luò )和語(yǔ)言建模的支持很差。此外,在Caffe中圖層需要使用C++定義,而網(wǎng)絡(luò )則使用Protobuf定義。
TensorFlow是一個(gè)理想的RNN API和實(shí)現,向量運算的圖方法使得新網(wǎng)絡(luò )的指定變得相當容易,但其并不支持雙向RNN和3D卷積,同時(shí)公共版本的圖定義也不支持循環(huán)和條件控制,這使得RNN的實(shí)現并不理想,因為必須要使用Python循環(huán)且無(wú)法進(jìn)行圖編譯優(yōu)化。
Theano支持大部分先進(jìn)的網(wǎng)絡(luò ),很多研究想法都來(lái)源于Theano,它引領(lǐng)了符號圖在編程網(wǎng)絡(luò )中使用的趨勢。Theano的符號API支持循環(huán)控制,讓RNN的實(shí)現更加容易且高效。
Torch對卷積網(wǎng)絡(luò )的支持非常好,通過(guò)時(shí)域卷積的本地接口使得它的使用非常直觀(guān)。Torch通過(guò)很多非官方的擴展支持大量的RNN,同時(shí)網(wǎng)絡(luò )的定義方法也有很多種。但Torch本質(zhì)上是以圖層的方式定義網(wǎng)絡(luò )的,這種粗粒度的方式使得它對新圖層類(lèi)型的擴展缺乏足夠的支持。與Caffe相比,在Torch中定義新圖層非常容易,不需要使用C++編程,圖層和網(wǎng)絡(luò )定義方式之間的區別最小。
接口
Caffe支持pycaffe接口,但這僅僅是用來(lái)輔助命令行接口的,而即便是使用pycaffe也必須使用protobuf定義模型。
TensorFlow支持Python和C++兩種類(lèi)型的接口。用戶(hù)可以在一個(gè)相對豐富的高層環(huán)境中做實(shí)驗并在需要本地代碼或低延遲的環(huán)境中部署模型。
Theano支持Python接口。
Torch運行在LuaJIT上,與C++、C#以及Java等工業(yè)語(yǔ)言相比速度非???,用戶(hù)可編寫(xiě)任意類(lèi)型的計算而不需要擔心性能,但Lua并非主流語(yǔ)言。
模型部署
Caffe基于C++,可在多種設備上編譯,具有跨平臺性,是部署項目的最佳選擇。
TensorFlow支持C++接口,同時(shí)能夠基于A(yíng)RM架構編譯和優(yōu)化。用戶(hù)可將成熟模型部署在多種設備上而不需實(shí)現單獨的模型解碼器或者加載Python/LuaJIT解釋器。
Theano缺少底層的接口,并且其Python解釋器也很低效。
Torch的模型運行需要LuaJIT的支持,對集成造成了很大的障礙。
性能
Caffe 簡(jiǎn)單快速。
TensorFlow僅使用了cuDNN v2,但即使如此它的性能依然要比同樣使用cuDNN v2的Torch要慢1.5倍,并且在批大小為128時(shí)訓練GoogleNet還出現了內存溢出的問(wèn)題。
Theano在大型網(wǎng)絡(luò )上的性能與Torch7不相上下。但其因需要將C/CUDA代碼編譯成二進(jìn)制而啟動(dòng)時(shí)間過(guò)長(cháng)。此外,Theano的導入也會(huì )消耗時(shí)間,并且在導入之后無(wú)法擺脫預配置的設備。
Torch非常好,沒(méi)有TensorFlow和Theano的問(wèn)題。
架構
Caffe的主要劣勢是圖層需要使用C++定義,而模型需要使用protobuf定義。此外,如果想要支持CPU和GPU,用戶(hù)還必須實(shí)現額外的函數;對于自定義的層類(lèi)型,還須為其分配id,并將其添加到proto文件中。
TensorFlow的架構清晰,采用了模塊化設計,支持多種前端和執行平臺。
Theano 的整個(gè)代碼庫都使用Python,連C/CUDA代碼也要被打包為Python字符串,這使其難以導航、調試、重構和維護。
Torch7和nn類(lèi)庫擁有清晰的設計和模塊化的接口。
2.2.4 結論
1. 各深度學(xué)習框架對于硬件的利用情況:
多線(xiàn)程CPU的情況下Torch使用的最廣泛;
TensorFlow在多GPU的條件下最為靈活可用;
2. 各深度學(xué)習框架對于速度:
在網(wǎng)絡(luò )“深度”改變的情況下,Keras具有最快的訓練速度,TensorFlow具有最快的預測響應速度;
在網(wǎng)絡(luò )“寬度”改變的情況下,Caffe具有最快的訓練速度,TensorFlow在“寬度”改變較小的情況下具有最快的預測響應速度,“寬度”改變較大時(shí)Keras具有最快的響應速度,TensorFlow緊隨其后;
3. 各深度學(xué)習框架對于準確率:
在網(wǎng)絡(luò )“深度”改變的情況下,TensorFlow和Torch的分類(lèi)準確率隨網(wǎng)絡(luò )“深度”的增加而下降;
在網(wǎng)絡(luò )“寬度”改變的情況下,TensorFlow的分類(lèi)預測準確率相對穩定,超越CaffeTorch;
無(wú)論在網(wǎng)絡(luò )“深度”或是“寬度”改變的情況下,Keras對分類(lèi)預測的準確率十分穩定,且超越其他框架,具有最佳的預測準確率;
4. 各深度學(xué)習框架的社區活躍度:
TensorFlow可以定義為“最流行”、“最被認可”的開(kāi)源深度學(xué)習框架。其在GitHub上無(wú)論是Star數、Fork數,或是檢索基于TensorFlow的項目數,都大大超過(guò)其他框架,甚至超越其他框架資源的總和。
5. 各深度學(xué)習框架的工業(yè)表達能力:
Caffe具有優(yōu)秀的模型表達能力和工業(yè)部署能力,尤其是計算機視覺(jué)方面,但對RNN和語(yǔ)言建模的支持很差。Caffe適用于視覺(jué)任務(wù)處理,尤其是基于深度學(xué)習的工業(yè)項目,其具有無(wú)可爭議的生產(chǎn)穩定性;但其缺乏靈活性,這使得對網(wǎng)絡(luò )結構的改變比其他框架麻煩,且Caffe的文檔十分匱乏,代碼閱讀困難高于其他框架。
Tensorflow具有很好的模型表達能力、優(yōu)秀的接口和清晰的內部框架,適用于工業(yè)項目部署,但其速度性能不具備優(yōu)勢;TensorFlow支持分布式計算,使得硬件設備的性能得到最充分發(fā)揮;其代碼的可讀性和社區活躍度使得無(wú)論是學(xué)術(shù)研究或工業(yè)生產(chǎn)變得容易;
Keras具有良好的速度性能、模型表達能力,使用簡(jiǎn)潔、方便—只需幾行代碼就能構建一個(gè)神經(jīng)網(wǎng)絡(luò )。Keras具有完整的文檔,使得學(xué)習和使用十分容易—即便不熟悉Python。其更適用于學(xué)術(shù)研究、實(shí)驗或輕量級工業(yè)任務(wù)(如獲取特征值);
Torch具有十分優(yōu)秀的速度性能,但其使用Lua語(yǔ)言;
DL4j兼容JVM,也適用 Java、Clojure和 Scala;
評論