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