開源深度學(xué)習(xí)平臺 TensorFlow、Caffe、MXNet……哪個最適合你?

鎂客 9年前 (2016-11-30)

與其他項目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。本文同時收錄其他開源深度學(xué)習(xí)框架介紹,包括最近被亞馬遜選中而備受關(guān)注的 MXNet。

【導(dǎo)讀】本文選自開源深度學(xué)習(xí)項目 Deeplearning4j (DL4J)博客,文章雖然著重介紹自家產(chǎn)品,但內(nèi)容仍然值得借鑒。與其他項目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。本文同時收錄其他開源深度學(xué)習(xí)框架介紹,包括最近被亞馬遜選中而備受關(guān)注的 MXNet。

開源深度學(xué)習(xí)平臺 TensorFlow、Caffe、MXNet……哪個最適合你?

Deeplearning4j (簡稱 DL4J)不是第一個開源的深度學(xué)習(xí)項目,但與此前的其他項目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。DL4J 是基于 JVM、聚焦行業(yè)應(yīng)用且提供商業(yè)支持的分布式深度學(xué)習(xí)框架,其宗旨是在合理的時間內(nèi)解決各類涉及大量數(shù)據(jù)的問題。它與 Hadoop 和 Spark 集成,可使用任意數(shù)量的 GPU 或 CPU 運(yùn)行。

目錄

   TensorFlow

   Theano、Pylearn2 及其生態(tài)系統(tǒng)

   Torch

   Caffe

   CNTK

   DSSTNE、MXNet

   許可

   速度

   DL4J:為什么用 Java?

   DL4J:生態(tài)系統(tǒng)

   DL4S:基于 Scala 語言的深度學(xué)習(xí)

   PaddlePaddle 等機(jī)器學(xué)習(xí)框架

TensorFlow

目前 TensorFlow 還不支持所謂的“內(nèi)聯(lián)(inline)”矩陣運(yùn)算,必須要復(fù)制矩陣才能對其進(jìn)行運(yùn)算。復(fù)制非常大的矩陣會導(dǎo)致成本全面偏高。TF 運(yùn)行所需的時間是最新深度學(xué)習(xí)工具的四倍。谷歌表示正在解決這一問題。

和大多數(shù)深度學(xué)習(xí)框架一樣,TensorFlow 是用一個 Python API 編寫的,通過 C/C++ 引擎加速。這種解決方案并不適合 Java 和 Scala 用戶群。

TensorFlow 的用途不止于深度學(xué)習(xí)。TensorFlow 其實還有支持強(qiáng)化學(xué)習(xí)和其他算法的工具。

谷歌似乎也已承認(rèn) TF 的目標(biāo)是招募人才。眾所周知,他們最近公布了為期一年的谷歌大腦(Google Brain)人才培訓(xùn)項目。真是明智的舉措。

TensorFlow 不提供商業(yè)支持,而谷歌也不太可能會從事支持開源企業(yè)軟件的業(yè)務(wù)。谷歌的角色是為研究者提供一種新工具。

和 Theano 一樣,TensforFlow 會生成計算圖(如一系列矩陣運(yùn)算,例如 z = simoid(x),其中 x 和 z 均為矩陣),自動求導(dǎo)。自動求導(dǎo)很重要,否則每嘗試一種新的神經(jīng)網(wǎng)絡(luò)設(shè)計就要手動編寫新的反向傳播算法,沒人愿意這樣做。在谷歌的生態(tài)系統(tǒng)中,這些計算圖會被谷歌大腦用于高強(qiáng)度計算,但谷歌還沒有開放相關(guān)工具的源代碼。TensorFlow 可以算是谷歌內(nèi)部深度學(xué)習(xí)解決方案的一半。從企業(yè)的角度看,許多公司需要思考的問題在于是否要依靠谷歌來提供這些工具。

TensorFlow 的利與弊

(+) Python + NumPy

(+) 與 Theano 類似的計算圖抽象化

(+) 編譯時間比 Theano 快很多

(+) 用 TensorBoard 進(jìn)行可視化

(+) 同時支持?jǐn)?shù)據(jù)并行和模型并行

(-) 速度比其他框架慢

(-) 比 Torch 笨重許多;更難理解

(-) 已預(yù)定型的模型不多

(-) 計算圖純粹基于 Python,所以速度較慢

Theano及其生態(tài)系統(tǒng)

深度學(xué)習(xí)領(lǐng)域的學(xué)術(shù)研究者大多依賴 Theano,Theano 是深度學(xué)習(xí)框架中的元老,用 Python 編寫。Theano 和 NumPy 一樣,是處理多維數(shù)組的學(xué)習(xí)庫。Theano 可與其他學(xué)習(xí)庫配合使用,非常適合數(shù)據(jù)探索和研究活動。

現(xiàn)在已有大量基于 Theano 的開源深度學(xué)習(xí)庫,包括 Keras、 Lasagne 和 Blocks。這些學(xué)習(xí)庫試著在 Theano 有時不夠直觀的界面之上添加一層便于使用的 API。

相比之下,Deeplearning4j 的目標(biāo)是成為深度學(xué)習(xí)領(lǐng)域的 Scikit-learn,力求以可擴(kuò)展、多個 GPU 或 CPU 并行的方式讓盡可能多的控制點(diǎn)實現(xiàn)自動化,在需要時與 Hadoop 和 Spark 集成。

Theano 的 利與弊

   (+) Python + NumPy

   (+) 計算圖是良好的抽象化方式

   (+) RNN 與計算圖匹配良好

   (+) 高級的包裝界面(Keras、Lasagne)減少了使用時的麻煩

   (-) 原始的 Theano 級別偏低

   (-) 錯誤信息可能沒有幫助

   (-) 大型模型的編譯時間可能較長

   (-) 比 Torch 笨重許多;更難理解

   (-) 對已預(yù)定型模型的支持不夠完善

Torch

Torch 是用 Lua 編寫的計算框架,支持機(jī)器學(xué)習(xí)算法。谷歌 DeepMind、Facebook 等大型科技公司使用 Torch 的某些版本,由內(nèi)部團(tuán)隊專門負(fù)責(zé)定制自己的深度學(xué)習(xí)平臺。Lua 是上世紀(jì)九十年代早期在巴西開發(fā)的多范例腳本語言。

Torch7 雖然功能強(qiáng)大,但其設(shè)計并不適合在兩個群體中大范圍普及,即主要依賴 Python 的學(xué)術(shù)界,以及普遍使用 Java 的企業(yè)軟件工程師。Deeplearning4j用Java編寫,反映了我們對行業(yè)應(yīng)用和使用便利的重視。我們認(rèn)為可用性是阻礙深度學(xué)習(xí)實施工具廣泛普及的限制因素。我們認(rèn)為可擴(kuò)展性應(yīng)當(dāng)通過Hadoop和Spark這樣的開源分布式運(yùn)行時系統(tǒng)來實現(xiàn)自動化。我們還認(rèn)為,從確保工具正常運(yùn)作和構(gòu)建社區(qū)兩方面來看,提供商業(yè)支持的開源框架是最恰當(dāng)?shù)慕鉀Q方案。

Torch 的利與弊:

   (+) 大量模塊化組件,容易組合

   (+) 很容易編寫自己的層類型并在GPU上運(yùn)行

   (+) Lua.;) (大多數(shù)學(xué)習(xí)庫的代碼是Lua,容易讀取)

   (+) 有很多已預(yù)定型的模型!

   (-) Lua

   (-) 通常需要自己編寫定型代碼(即插即用相對較少)

   (-) 不適合遞歸神經(jīng)網(wǎng)絡(luò)

Caffe

Caffe 是一個廣為人知、廣泛應(yīng)用的機(jī)器視覺庫,將Matlab實現(xiàn)的快速卷積網(wǎng)絡(luò)移植到了 C 和 C++ 平臺上。Caffe 不適用于文本、聲音或時間序列數(shù)據(jù)等其他類型的深度學(xué)習(xí)應(yīng)用。與本文提到的其他一些框架相同,Caffe 選擇了 Python 作為其 API。

Deeplearning4j 和 Caffe 都可以用卷積網(wǎng)絡(luò)進(jìn)行圖像分類,這是最先進(jìn)的技術(shù)。與 Caffe 不同,Deeplearning4j 支持任意芯片數(shù)的 GPU 并行運(yùn)行,并且提供許多看似微不足道,卻能使深度學(xué)習(xí)在多個并行 GPU 集群上運(yùn)行得更流暢的功能。雖然在論文中被廣泛引述,但 Caffe 主要用于為其 Model Zoo 網(wǎng)站提供已預(yù)定型的模型。Deeplearning4j 正在開發(fā)將 Caffe 模型導(dǎo)入 Spark 的開發(fā)解析器。

Caffe 的利與弊:

   (+) 適合前饋網(wǎng)絡(luò)和圖像處理

   (+) 適合微調(diào)已有的網(wǎng)絡(luò)

   (+) 定型模型而無需編寫任何代碼

   (+) Python界面相當(dāng)有用

   (-) 需要用C++ / CUDA編寫新的GPU層

   (-) 不適合遞歸網(wǎng)絡(luò)

   (-) 用于大型網(wǎng)絡(luò)(GoogLeNet、ResNet)時過于繁瑣

CNTK

CNTK 是微軟的開源深度學(xué)習(xí)框架。CNTK 的全稱是“計算網(wǎng)絡(luò)工具包”。此學(xué)習(xí)庫包括前饋 DNN、卷積網(wǎng)絡(luò)和遞歸網(wǎng)絡(luò)。CNTK 提供基于 C++ 代碼的 Python API。雖然 CNTK 遵循一個比較寬松的許可協(xié)議,卻并未采用 ASF 2.0、BSD 或 MIT 等一些較為傳統(tǒng)的許可協(xié)議。

DSSTNE、MXNet

亞馬遜的深度可伸縮稀疏張量網(wǎng)絡(luò)引擎又稱 DSSTNE,是用于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)建模的學(xué)習(xí)庫。它是眾多最新的開源深度學(xué)習(xí)庫之一,在 Tensorflow 和 CNTK 之后發(fā)布。 DSSTNE 主要用 C++ 寫成,速度較快,不過吸引到的用戶群體規(guī)模尚不及其他學(xué)習(xí)庫。

由此,亞馬遜首席技術(shù)官 Werner Vogels 在上周二示,亞馬遜網(wǎng)絡(luò)服務(wù)公司(AWS)剛剛選擇 MXNet 作為其最主要的深度學(xué)習(xí)框架。

MXNet 同 Keras 一樣是高級庫,但它的優(yōu)勢在另外的方面。

MXNet 作為 2016 年的開源新秀之一,MXNet 值得注意的特征是其緊湊的大小和跨平臺的可移植性。亞馬遜 CTO Vogels 稱贊 MXNet 核心庫使用單一 C ++ 源文件,Android、iOS 都可以編譯。開發(fā)人員還可以使用多種語言:Python,C ++,R,Scala,Julia,Matlab和JavaScript。

一方面,使用 MXNet 構(gòu)建網(wǎng)絡(luò)比用 Keras 需要花更多功夫。由于教程少,學(xué)習(xí)的難度更大。但是,MXNet 支持超過 7 種不同的語言的優(yōu)勢彌補(bǔ)了這一點(diǎn),這些語言包括 C++、Python、R、Javascrip,甚至 Matlab。

MXNet 的另一個明顯的優(yōu)勢是支持分布式計算。這意味著如果你需要在多個 CPU 或 GPU 上訓(xùn)練模型以提高速度,MXNet 是很好的選擇。

可擴(kuò)展性也可能是亞馬遜被 MXNet 吸引最大的原因。Vogels 使用 Inception v3 圖像分析算法分析了 MXNet 訓(xùn)練吞吐量的基準(zhǔn),聲稱通過在多個 GPU 上運(yùn)行它獲得的加速是是呈高度線性的——在128個GPU上,MXNet 的運(yùn)行速度比在單個 GPU 上快109倍。

許可

上述開源項目的另一區(qū)別在于其許可協(xié)議:Theano、Torch 和 Caffe 采用 BSD 許可協(xié)議,未能解決專利和專利爭端問題。Deeplearning4j 和 ND4J 采用 Apache 2.0 許可協(xié)議發(fā)布。該協(xié)議包含專利授權(quán)和防止報復(fù)性訴訟的條款,也就是說,任何人都可以自由使用遵循 Apache 2.0 協(xié)議的代碼創(chuàng)作衍生作品并為其申請專利,但如果對他人提起針對原始代碼(此處即 DL4J)的專利權(quán)訴訟,就會立即喪失對代碼的一切專利權(quán)。(換言之,這幫助你在訴訟中進(jìn)行自我防衛(wèi),同時阻止你攻擊他人。)BSD 一般不能解決這個問題。

速度

Deeplearning4j 依靠 ND4J 進(jìn)行基礎(chǔ)的線性代數(shù)運(yùn)算,事實表明其處理大矩陣乘法的速度至少是 NumPy 的兩倍。這正是 DL4J 被 NASA 的噴氣推進(jìn)實驗室所采用的原因之一。此外,Deeplearning4j 為多芯片運(yùn)行而優(yōu)化,支持采用 CUDA C 的 x86 和 GPU。

雖然 Torch7 和 DL4J 都采用并行運(yùn)行,DL4J 的并行運(yùn)行是自動化的。我們實現(xiàn)了從節(jié)點(diǎn)(worker nodes)和連接的自動化設(shè)置,讓用戶在 Spark、Hadoop 或 Akka 和 AWS 環(huán)境中建立大型并行網(wǎng)絡(luò)時可以繞過學(xué)習(xí)庫。Deeplearning4j 最適合快速解決具體問題。

DL4J:為什么用Java?

經(jīng)常有人問我們,既然有如此之多的深度學(xué)習(xí)用戶都專注于 Python,為什么還選擇 Java 來實施開源深度學(xué)習(xí)項目。的確,Python 有著優(yōu)越的語法要素,可以直接將矩陣相加,而無需像Java那樣先創(chuàng)建顯式類。Python 還有由 Theano、NumPy 等原生擴(kuò)展組成的廣泛的科學(xué)計算環(huán)境。

但 Java 也具備不少優(yōu)點(diǎn)。首先,Java 語言從根本上看要快于 Python。如不考慮依賴用Cython 加速的情況,任何用 Python 寫成的代碼在根本上速度都相對較慢。不可否認(rèn),運(yùn)算量最大的運(yùn)算都是用 C 或 C++ 語言編寫的。(此處所說的運(yùn)算也包括高級機(jī)器學(xué)習(xí)流程中涉及的字符和其他任務(wù)。)大多數(shù)最初用 Python 編寫的深度學(xué)習(xí)項目在用于生產(chǎn)時都必須重新編寫。Deeplearning4j 依靠 JavaCPP 從 Java 中調(diào)用預(yù)編譯的本地 C++ 代碼,大幅提升定型速度。

其次,大型企業(yè)主要使用 Java 或基于 JVM 的系統(tǒng)。在企業(yè)界,Java 依然是應(yīng)用范圍最廣的語言。Java 是 Hadoop、Hive、Lucene 和 Pig 的語言,而它們恰好都是解決機(jī)器學(xué)習(xí)問題的有用工具。也就是說,深度學(xué)習(xí)本可以幫助許多需要解決現(xiàn)實問題的程序員,但他們卻被語言屏障阻礙。我們希望提高深度學(xué)習(xí)對于這一廣大群體的可用性,這些新的用戶可以將深度學(xué)習(xí)直接付諸實用。

第三,為了解決 Java 缺少強(qiáng)大的科學(xué)計算庫的問題,我們編寫了 ND4J。ND4J 在分布式CPU 或 GPU 上運(yùn)行,可以通過 Java 或 Scala 的 API 進(jìn)行對接。

最后,Java 是一種安全的網(wǎng)絡(luò)語言,本質(zhì)上具有跨平臺的特點(diǎn),可在 Linux 服務(wù)器、Windows 和 OSX 桌面、安卓手機(jī)上運(yùn)行,還可通過嵌入式 Java 在物聯(lián)網(wǎng)的低內(nèi)存?zhèn)鞲衅魃线\(yùn)行。Torch 和 Pylearn2 通過 C++ 進(jìn)行優(yōu)化,優(yōu)化和維護(hù)因而存在困難,而 Java 則是“一次編寫,隨處運(yùn)行”的語言,適合需要在多個平臺上使用深度學(xué)習(xí)系統(tǒng)的企業(yè)。

DL4J:生態(tài)系統(tǒng)

生態(tài)系統(tǒng)也是為 Java 增添人氣的優(yōu)勢之一。Hadoop 是用 Java 實施的;Spark 在Hadoop 的 Yarn 運(yùn)行時中運(yùn)行;Akka 等開發(fā)庫讓我們能夠為 Deeplearning4j 開發(fā)分布式系統(tǒng)??傊?,對幾乎所有應(yīng)用而言,Java 的基礎(chǔ)架構(gòu)都經(jīng)過反復(fù)測試,用 Java 編寫的深度學(xué)習(xí)網(wǎng)絡(luò)可以靠近數(shù)據(jù),方便廣大程序員的工作。Deeplearning4j 可以作為 YARN 的應(yīng)用來運(yùn)行和預(yù)配。

Scala、Clojure、Python 和 Ruby 等其他通行的語言也可以原生支持 Java。我們選擇Java,也是為了盡可能多地覆蓋主要的程序員群體。

雖然 Java 的速度不及 C 和 C++,但它仍比許多人想象得要快,而我們建立的分布式系統(tǒng)可以通過增加節(jié)點(diǎn)來提升速度,節(jié)點(diǎn)可以是 GPU 或者 CPU。也就是說,如果要速度快,多加幾盒處理器就好了。

最后,我們也在用 Java 為 DL4J 打造 NumPy 的基本應(yīng)用,其中包括 ND-Array。我們相信 Java 的許多缺點(diǎn)都能很快克服,而其優(yōu)勢則大多會長期保持。

DL4S:基于 Scala 語言的深度學(xué)習(xí)

我們在打造 Deeplearning4j 和 ND4J 的過程中特別關(guān)注 Scala,因為我們認(rèn)為 Scala 具有成為數(shù)據(jù)科學(xué)主導(dǎo)語言的潛力。用 Scala API 為 JVM 編寫數(shù)值運(yùn)算、向量化和深度學(xué)習(xí)庫可以幫助整個群體向?qū)崿F(xiàn)這一目標(biāo)邁進(jìn)。

PaddlePaddle 等機(jī)器學(xué)習(xí)框架

上文提到的深度學(xué)習(xí)框架都是比較專業(yè)化的框架,此外還有許多通用型的機(jī)器學(xué)習(xí)框架。這里列舉主要的幾種:

   sci-kit learn-Python的默認(rèn)開源機(jī)器學(xué)習(xí)框架。

   Apache Mahout-Apache的主打機(jī)器學(xué)習(xí)框架。Mahout可實現(xiàn)分類、聚類和推薦。

   SystemML-IBM的機(jī)器學(xué)習(xí)框架,可進(jìn)行描述性統(tǒng)計、分類、聚類、回歸、矩陣參數(shù)化和生存分析,還包括支持向量機(jī)。

   微軟DMTK-微軟的分布式機(jī)器學(xué)習(xí)工具包。分布式詞嵌入和LDA。

   百度 PaddlePaddle

【編者按】本文轉(zhuǎn)自新智元。文章來源: deeplearning4j.org 等。

最后,記得關(guān)注微信公眾號:鎂客網(wǎng)(im2maker),更多干貨在等你!

鎂客網(wǎng)


科技 | 人文 | 行業(yè)

微信ID:im2maker
長按識別二維碼關(guān)注

硬科技產(chǎn)業(yè)媒體

關(guān)注技術(shù)驅(qū)動創(chuàng)新

分享到