開源深度學(xué)習(xí)平臺(tái) TensorFlow、Caffe、MXNet……哪個(gè)最適合你?
與其他項(xiàng)目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。本文同時(shí)收錄其他開源深度學(xué)習(xí)框架介紹,包括最近被亞馬遜選中而備受關(guān)注的 MXNet。
【導(dǎo)讀】本文選自開源深度學(xué)習(xí)項(xiàng)目 Deeplearning4j (DL4J)博客,文章雖然著重介紹自家產(chǎn)品,但內(nèi)容仍然值得借鑒。與其他項(xiàng)目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。本文同時(shí)收錄其他開源深度學(xué)習(xí)框架介紹,包括最近被亞馬遜選中而備受關(guān)注的 MXNet。
Deeplearning4j (簡稱 DL4J)不是第一個(gè)開源的深度學(xué)習(xí)項(xiàng)目,但與此前的其他項(xiàng)目相比,DL4J 在編程語言和宗旨兩方面都獨(dú)具特色。DL4J 是基于 JVM、聚焦行業(yè)應(yīng)用且提供商業(yè)支持的分布式深度學(xué)習(xí)框架,其宗旨是在合理的時(shí)間內(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ù)制矩陣才能對(duì)其進(jìn)行運(yùn)算。復(fù)制非常大的矩陣會(huì)導(dǎo)致成本全面偏高。TF 運(yùn)行所需的時(shí)間是最新深度學(xué)習(xí)工具的四倍。谷歌表示正在解決這一問題。
和大多數(shù)深度學(xué)習(xí)框架一樣,TensorFlow 是用一個(gè) Python API 編寫的,通過 C/C++ 引擎加速。這種解決方案并不適合 Java 和 Scala 用戶群。
TensorFlow 的用途不止于深度學(xué)習(xí)。TensorFlow 其實(shí)還有支持強(qiáng)化學(xué)習(xí)和其他算法的工具。
谷歌似乎也已承認(rèn) TF 的目標(biāo)是招募人才。眾所周知,他們最近公布了為期一年的谷歌大腦(Google Brain)人才培訓(xùn)項(xiàng)目。真是明智的舉措。
TensorFlow 不提供商業(yè)支持,而谷歌也不太可能會(huì)從事支持開源企業(yè)軟件的業(yè)務(wù)。谷歌的角色是為研究者提供一種新工具。
和 Theano 一樣,TensforFlow 會(huì)生成計(jì)算圖(如一系列矩陣運(yùn)算,例如 z = simoid(x),其中 x 和 z 均為矩陣),自動(dòng)求導(dǎo)。自動(dòng)求導(dǎo)很重要,否則每嘗試一種新的神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)就要手動(dòng)編寫新的反向傳播算法,沒人愿意這樣做。在谷歌的生態(tài)系統(tǒng)中,這些計(jì)算圖會(huì)被谷歌大腦用于高強(qiáng)度計(jì)算,但谷歌還沒有開放相關(guān)工具的源代碼。TensorFlow 可以算是谷歌內(nèi)部深度學(xué)習(xí)解決方案的一半。從企業(yè)的角度看,許多公司需要思考的問題在于是否要依靠谷歌來提供這些工具。
TensorFlow 的利與弊
(+) Python + NumPy
(+) 與 Theano 類似的計(jì)算圖抽象化
(+) 編譯時(shí)間比 Theano 快很多
(+) 用 TensorBoard 進(jìn)行可視化
(+) 同時(shí)支持?jǐn)?shù)據(jù)并行和模型并行
(-) 速度比其他框架慢
(-) 比 Torch 笨重許多;更難理解
(-) 已預(yù)定型的模型不多
(-) 計(jì)算圖純粹基于 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ù)探索和研究活動(dòng)。
現(xiàn)在已有大量基于 Theano 的開源深度學(xué)習(xí)庫,包括 Keras、 Lasagne 和 Blocks。這些學(xué)習(xí)庫試著在 Theano 有時(shí)不夠直觀的界面之上添加一層便于使用的 API。
相比之下,Deeplearning4j 的目標(biāo)是成為深度學(xué)習(xí)領(lǐng)域的 Scikit-learn,力求以可擴(kuò)展、多個(gè) GPU 或 CPU 并行的方式讓盡可能多的控制點(diǎn)實(shí)現(xiàn)自動(dòng)化,在需要時(shí)與 Hadoop 和 Spark 集成。
Theano 的 利與弊
(+) Python + NumPy
(+) 計(jì)算圖是良好的抽象化方式
(+) RNN 與計(jì)算圖匹配良好
(+) 高級(jí)的包裝界面(Keras、Lasagne)減少了使用時(shí)的麻煩
(-) 原始的 Theano 級(jí)別偏低
(-) 錯(cuò)誤信息可能沒有幫助
(-) 大型模型的編譯時(shí)間可能較長
(-) 比 Torch 笨重許多;更難理解
(-) 對(duì)已預(yù)定型模型的支持不夠完善
Torch
Torch 是用 Lua 編寫的計(jì)算框架,支持機(jī)器學(xué)習(xí)算法。谷歌 DeepMind、Facebook 等大型科技公司使用 Torch 的某些版本,由內(nèi)部團(tuán)隊(duì)專門負(fù)責(zé)定制自己的深度學(xué)習(xí)平臺(tái)。Lua 是上世紀(jì)九十年代早期在巴西開發(fā)的多范例腳本語言。
Torch7 雖然功能強(qiáng)大,但其設(shè)計(jì)并不適合在兩個(gè)群體中大范圍普及,即主要依賴 Python 的學(xué)術(shù)界,以及普遍使用 Java 的企業(yè)軟件工程師。Deeplearning4j用Java編寫,反映了我們對(duì)行業(yè)應(yīng)用和使用便利的重視。我們認(rèn)為可用性是阻礙深度學(xué)習(xí)實(shí)施工具廣泛普及的限制因素。我們認(rèn)為可擴(kuò)展性應(yīng)當(dāng)通過Hadoop和Spark這樣的開源分布式運(yùn)行時(shí)系統(tǒng)來實(shí)現(xiàn)自動(dòng)化。我們還認(rèn)為,從確保工具正常運(yùn)作和構(gòu)建社區(qū)兩方面來看,提供商業(yè)支持的開源框架是最恰當(dāng)?shù)慕鉀Q方案。
Torch 的利與弊:
(+) 大量模塊化組件,容易組合
(+) 很容易編寫自己的層類型并在GPU上運(yùn)行
(+) Lua.;) (大多數(shù)學(xué)習(xí)庫的代碼是Lua,容易讀?。?/p>
(+) 有很多已預(yù)定型的模型!
(-) Lua
(-) 通常需要自己編寫定型代碼(即插即用相對(duì)較少)
(-) 不適合遞歸神經(jīng)網(wǎng)絡(luò)
Caffe
Caffe 是一個(gè)廣為人知、廣泛應(yīng)用的機(jī)器視覺庫,將Matlab實(shí)現(xiàn)的快速卷積網(wǎng)絡(luò)移植到了 C 和 C++ 平臺(tái)上。Caffe 不適用于文本、聲音或時(shí)間序列數(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í)在多個(gè)并行 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)時(shí)過于繁瑣
CNTK
CNTK 是微軟的開源深度學(xué)習(xí)框架。CNTK 的全稱是“計(jì)算網(wǎng)絡(luò)工具包”。此學(xué)習(xí)庫包括前饋 DNN、卷積網(wǎng)絡(luò)和遞歸網(wǎng)絡(luò)。CNTK 提供基于 C++ 代碼的 Python API。雖然 CNTK 遵循一個(gè)比較寬松的許可協(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 一樣是高級(jí)庫,但它的優(yōu)勢在另外的方面。
MXNet 作為 2016 年的開源新秀之一,MXNet 值得注意的特征是其緊湊的大小和跨平臺(tái)的可移植性。亞馬遜 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 的另一個(gè)明顯的優(yōu)勢是支持分布式計(jì)算。這意味著如果你需要在多個(gè) CPU 或 GPU 上訓(xùn)練模型以提高速度,MXNet 是很好的選擇。
可擴(kuò)展性也可能是亞馬遜被 MXNet 吸引最大的原因。Vogels 使用 Inception v3 圖像分析算法分析了 MXNet 訓(xùn)練吞吐量的基準(zhǔn),聲稱通過在多個(gè) GPU 上運(yùn)行它獲得的加速是是呈高度線性的——在128個(gè)GPU上,MXNet 的運(yùn)行速度比在單個(gè) GPU 上快109倍。
許可
上述開源項(xiàng)目的另一區(qū)別在于其許可協(xié)議:Theano、Torch 和 Caffe 采用 BSD 許可協(xié)議,未能解決專利和專利爭端問題。Deeplearning4j 和 ND4J 采用 Apache 2.0 許可協(xié)議發(fā)布。該協(xié)議包含專利授權(quán)和防止報(bào)復(fù)性訴訟的條款,也就是說,任何人都可以自由使用遵循 Apache 2.0 協(xié)議的代碼創(chuàng)作衍生作品并為其申請(qǐng)專利,但如果對(duì)他人提起針對(duì)原始代碼(此處即 DL4J)的專利權(quán)訴訟,就會(huì)立即喪失對(duì)代碼的一切專利權(quán)。(換言之,這幫助你在訴訟中進(jìn)行自我防衛(wèi),同時(shí)阻止你攻擊他人。)BSD 一般不能解決這個(gè)問題。
速度
Deeplearning4j 依靠 ND4J 進(jìn)行基礎(chǔ)的線性代數(shù)運(yùn)算,事實(shí)表明其處理大矩陣乘法的速度至少是 NumPy 的兩倍。這正是 DL4J 被 NASA 的噴氣推進(jìn)實(shí)驗(yàn)室所采用的原因之一。此外,Deeplearning4j 為多芯片運(yùn)行而優(yōu)化,支持采用 CUDA C 的 x86 和 GPU。
雖然 Torch7 和 DL4J 都采用并行運(yùn)行,DL4J 的并行運(yùn)行是自動(dòng)化的。我們實(shí)現(xiàn)了從節(jié)點(diǎn)(worker nodes)和連接的自動(dòng)化設(shè)置,讓用戶在 Spark、Hadoop 或 Akka 和 AWS 環(huán)境中建立大型并行網(wǎng)絡(luò)時(shí)可以繞過學(xué)習(xí)庫。Deeplearning4j 最適合快速解決具體問題。
DL4J:為什么用Java?
經(jīng)常有人問我們,既然有如此之多的深度學(xué)習(xí)用戶都專注于 Python,為什么還選擇 Java 來實(shí)施開源深度學(xué)習(xí)項(xiàng)目。的確,Python 有著優(yōu)越的語法要素,可以直接將矩陣相加,而無需像Java那樣先創(chuàng)建顯式類。Python 還有由 Theano、NumPy 等原生擴(kuò)展組成的廣泛的科學(xué)計(jì)算環(huán)境。
但 Java 也具備不少優(yōu)點(diǎn)。首先,Java 語言從根本上看要快于 Python。如不考慮依賴用Cython 加速的情況,任何用 Python 寫成的代碼在根本上速度都相對(duì)較慢。不可否認(rèn),運(yùn)算量最大的運(yùn)算都是用 C 或 C++ 語言編寫的。(此處所說的運(yùn)算也包括高級(jí)機(jī)器學(xué)習(xí)流程中涉及的字符和其他任務(wù)。)大多數(shù)最初用 Python 編寫的深度學(xué)習(xí)項(xiàng)目在用于生產(chǎn)時(shí)都必須重新編寫。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)實(shí)問題的程序員,但他們卻被語言屏障阻礙。我們希望提高深度學(xué)習(xí)對(duì)于這一廣大群體的可用性,這些新的用戶可以將深度學(xué)習(xí)直接付諸實(shí)用。
第三,為了解決 Java 缺少強(qiáng)大的科學(xué)計(jì)算庫的問題,我們編寫了 ND4J。ND4J 在分布式CPU 或 GPU 上運(yùn)行,可以通過 Java 或 Scala 的 API 進(jìn)行對(duì)接。
最后,Java 是一種安全的網(wǎng)絡(luò)語言,本質(zhì)上具有跨平臺(tái)的特點(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)行”的語言,適合需要在多個(gè)平臺(tái)上使用深度學(xué)習(xí)系統(tǒng)的企業(yè)。
DL4J:生態(tài)系統(tǒng)
生態(tài)系統(tǒng)也是為 Java 增添人氣的優(yōu)勢之一。Hadoop 是用 Java 實(shí)施的;Spark 在Hadoop 的 Yarn 運(yùn)行時(shí)中運(yùn)行;Akka 等開發(fā)庫讓我們能夠?yàn)?Deeplearning4j 開發(fā)分布式系統(tǒng)。總之,對(duì)幾乎所有應(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)勢則大多會(huì)長期保持。
DL4S:基于 Scala 語言的深度學(xué)習(xí)
我們?cè)诖蛟?Deeplearning4j 和 ND4J 的過程中特別關(guān)注 Scala,因?yàn)槲覀冋J(rèn)為 Scala 具有成為數(shù)據(jù)科學(xué)主導(dǎo)語言的潛力。用 Scala API 為 JVM 編寫數(shù)值運(yùn)算、向量化和深度學(xué)習(xí)庫可以幫助整個(gè)群體向?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可實(shí)現(xiàn)分類、聚類和推薦。
SystemML-IBM的機(jī)器學(xué)習(xí)框架,可進(jìn)行描述性統(tǒng)計(jì)、分類、聚類、回歸、矩陣參數(shù)化和生存分析,還包括支持向量機(jī)。
微軟DMTK-微軟的分布式機(jī)器學(xué)習(xí)工具包。分布式詞嵌入和LDA。
百度 PaddlePaddle
【編者按】本文轉(zhuǎn)自新智元。文章來源: deeplearning4j.org 等。
最后,記得關(guān)注微信公眾號(hào):鎂客網(wǎng)(im2maker),更多干貨在等你!
硬科技產(chǎn)業(yè)媒體
關(guān)注技術(shù)驅(qū)動(dòng)創(chuàng)新
