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