Spark與深度學習框架——H2O、deeplearning4j、SparkNet

2021-03-02 博文視點Broadview

小編說:你可能對使用Spark服務比較感興趣。Spark已經提供了很多功能,也有一個好用的界面,而且背後有強大的社區,開發者十分活躍,這也是人們對Spark寄予厚望的原因。深度學習是當前正在進行中的Spark項目之一。本文我們將介紹一些Spark能用的深度學習框架。

深度學習因其高準確率及通用性,成為機器學習中最受關注的領域。這種算法在2011—2012年期間出現,並超過了很多競爭對手。最開始,深度學習在音頻及圖像識別方面取得了成功。此外,像機器翻譯之類的自然語言處理或者畫圖也能使用深度學習算法來完成。深度學習是自1980年以來就開始被使用的一種神經網絡。神經網絡被看作能進行普適近似(universal approximation)的一種機器。換句話說,這種網絡能模仿任何其他函數。例如,深度學習算法能創建一個識別動物圖片的函數:給一張動物的圖片,它能分辨出圖片上的動物是一隻貓還是一隻狗。深度學習可以看作是組合了許多神經網絡的一種深度結構。

與其他已有的機器學習算法相比,深度學習需要大量參數及訓練數據。這也是我們介紹能在Spark上運行的深度學習框架的原因。要想在企業環境中穩定地進行深度學習的訓練,必須要有一個可靠而快速的分布式引擎。Spark被視為目前最適合運行深度學習算法的平臺,是因為:

本文我們將介紹一些Spark能用的深度學習框架。這些框架和深度學習一樣,都是比較新的庫。很可能你在使用它們的過程中遇到一些bug或者缺少一些操作工具,但是報告問題(issue)及發送補丁將會使它更加成熟。

H2O是用h2o.ai開發的具有可擴展性的機器學習框架,它不限於深度學習。H2O支持許多API(例如,R、Python、Scala和Java)。當然它是開源軟體,所以要研究它的代碼及算法也很容易。H2O框架支持所有常見的資料庫及文件類型,可以輕鬆將模型導出為各種類型的存儲。深度學習算法是在另一個叫作sparkling-water的庫中實現的(http://h2o.ai/product/sparkling-water/)。它主要由h2o.ai開發。要運行sparkling-water,需要使用Spark 1.3或以上的版本。

安裝

1.首先需要從h2o網站下載最新的sparking-water。(http://h2o-release.s3.amazonaws.com/sparkling-water/rel-1.3/1/index.html)

2.把它指向Spark的安裝目錄。

$ export Spark_HOME=/path/to/your/spark

3.啟動sparkling-shell,這個接口與spark-shell類似。

$ cd ~/Downloads

$ unzip Sparkling-water-1.3.1.zip

$ cd Sparkling-water-1.3.1

$ bin/Sparkling-shell

sparkling-water源碼中包含幾個例子。不幸的是,有些例子在Spark 1.5.2版本上無法正常運行。深度學習的demo也有相同的問題。你得等待這些問題被解決,或者自己寫幾個能在Spark運行的補丁。

deeplearning4j是由Skymind開發的,Skymind是一家致力於為企業進行商業化深度學習的公司。deeplearning4j框架是創建來在Hadoop及Spark上運行的。這個設計用於商業環境而不是許多深度學習框架及庫目前所大量應用的研究領域。Skymind是主要的支持者,但deeplearning4j是開源軟體,因此也歡迎大家提交補丁。deeplearning4j框架中實現了如下算法:

○ 受限玻爾茲曼機(Restricted Boltzmann Machine)

○ — 卷積神經網絡(Convolutional Neural Network)

○ — 循環神經網絡(Recurrent Neural Network)

○ — 遞歸自編碼器(Recursive Autoencoder)

○ — 深度信念網絡(Deep-Belief Network)

○ — 深度自編碼器(Deep Autoencoder)

○ — 棧式降噪自編碼(Stacked Denoising Autoencoder)

這裡要注意的是,這些模型能在細粒度級別進行配置。你可以設置隱藏的層數、每個神經元的激活函數以及迭代的次數。deeplearning4j提供了不同種類的網絡實現及靈活的模型參數。Skymind也開發了許多工具,對於更穩定地運行機器學習算法很有幫助。下面列出了其中的一些工具。

 Canova (https://github.com/deeplearning4j/Canoba)是一個向量庫。機器學習算法能以向量格式處理所有數據。所有的圖片、音頻及文本數據必須用某種方法轉換為向量。雖然訓練機器學習模型是十分常見的工作,但它會重新造輪子還會引起bug。Canova能為你做這種轉換。Canova當前支持的輸入數據格式為:

-- CSV

--原始文本格式(推文、文檔)

--圖像(圖片、圖畫)

--定製文件格式(例如MNIST)

○ 由於Canova主要是用Java編寫的,所以它能運行在所有的JVM平臺上。因此,可以在Spark集群上使用它。即使你不做機器學習,Canova對你的機器學習任務可能也會有所裨益。

○ nd4j (https://github.com/deeplearning4j/nd4j)有點像是一個numpy,Python中的SciPy工具。此工具提供了線性代數、向量計算及操縱之類的科學計算。它也是用Java編寫的。你可以根據自己的使用場景來搭配使用這些工具。需要注意的一點是,nd4j支持GPU功能。由於現代計算硬體還在不斷發展,有望達到更快速的計算。

○ dl4j-spark-ml (https://github.com/deeplearning4j/dl4j-spark -ml)是一個Spark包,使你能在Spark上輕鬆運行deeplearning4j。使用這個包,就能輕鬆在Spark上集成deeplearning4j,因為它已經被上傳到了Spark包的公共代碼庫 (http://spark-packages.org/package/ deeplearning4j/dl4j-Spark-ml)。

因此,如果你要在Spark上使用deeplearning4j,我們推薦通過dl4j-spark-ml包來實現。與往常一樣,必須下載或自己編譯Spark源碼。這裡對Spark版本沒有特別要求,就算使用最早的版本也可以。deeplearning4j項目準備了樣例存儲庫。要在Spark上使用deeplearning4j,dl4j-Spark-ml-examples是可參考的最佳示例(https:// github.com/deeplearning4j/dl4j-Spark-ml-examples)。下面列出如何下載及編譯這個代碼庫。

$ git clone git@github.com:deeplearning4j/dl4j-spark-mlexamples.git$ cd dl4j-Spark-ml-examples$ mvn clean package -DSpark.version=1.5.2 \                      -DHadoop.version=2.6.0

編譯類位於target目錄下,但是可以通過bin/run-example腳本運行這些例子。當前有三種類型的例子:

○ ml.JavaIrisClassfication——鳶尾花(iris flower)數據集分類。

○ ml.JavaLfwClassfication——LFW人臉資料庫分類。

○ ml.JavaMnistClassfication——MNIST手寫數據分類。

我們選擇第3個例子,對MNIST手寫數據集運行分類模型的訓練。在運行這個示例之前,需要從MNIST站點下載訓練數據(http://yann.lecun.com/exdb/ mnist/)。或者,你可以使用下面的命令下載:

$ wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz$ gunzip train-images-idx3-ubyte
$ wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz$ gunzip train-labels-idx1-ubyte
And the put the two files on data direcotry under dj4j-spark-ml-examples.
$ mv train-images-idx3-ubyte \            /path/to/dl4j-spark-ml-examples/data$ mv train-labels-idx1-ubyte \            /path/to/dj4j-spark-ml-examples/data

差不多可以開始運行訓練進程了。你需要注意的最後一點是Spark executor及driver的內存大小,因為 MNIST數據集和它的訓練模型將會很大。它們要用到大量內存,因此我們建議你提前修改bin/run-example腳本中設置的內存大小。可以通過如下命令修改bin/run-example腳本的最後一行:

exec spark-submit \
       --packages "deeplearning4j:dl4j-spark-ml:0.4-rc0" \
       --master $EXAMPLE_MASTER \
       --class $EXAMPLE_CLASS \
       --driver-memory 8G \            --executor-memory 8G \          "$SPARK_EXAMPLES_JAR" \        "$@"

現在開始訓練:

$ MASTER=local[4] bin/run-example ml.JavaMnistClassfication

為了指定本地Spark的master配置,我們已經在bin/run-example腳本的前面設置了MASTER環境變量。這種訓練需要花一些時間,由你的環境及機器規格決定。這個例子運行了一種叫作「卷積神經網絡」的神經網絡。其參數細節是通過MultiLayerConfiguration類設置的。由於deeplearning4j有一個Java接口,就算你不習慣Spark的Scala語言也沒關係,它是很容易引入的。下面簡單解釋一下這個例子中的卷積神經網絡參數。

○ seed——此神經網絡會使用像初始網絡參數這樣的隨機參數,這個種子就用於產生這些參數。有了這個種子參數,在開發機器學習模型的過程中更容易進行測試與調試。

○ batchSize——像遞度下降之類的迭代算法,在更新模型之前會匯總一些更新值,batchSize指定進行更新值計算的樣本數。

○ iterations——由一個迭代進程保持模型參數的更新。這個參數決定了此迭代處理的次數。通常來說,迭代越長,收斂的概率越高。

○ optimizationAlgo——運行前述的迭代進程,必須用到幾種方法。隨機梯度下降(Stochastic Gradient Descent,SGD)是目前為止最先進的方法,這種方法相對來講不會落入局部最小值,還能持續搜索全局最小值。

○ layer——它是深度學習算法的核心配置。這個深度學習神經網絡有幾個名為layer的網絡組。這個參數決定了在每一層中使用哪種類型的層。例如,在卷積神經網絡的案例中,ConvolutionLayer被用於從輸入的圖像中提取出特徵。這個層能學習一個給定的圖片有哪種類型的特徵。在一開始就放置這個層,將改善整個神經網絡預測的精確性。每個層也能用給定的參數進行配置。

new ConvolutionLayer.Builder(10, 10)             .nIn(nChannels)               .nOut(6)                        .weightInit(WeightInit.DISTRIBUTION)                                           .activation("sigmoid")              *build())

神經網絡的概念圖

上圖展現了神經網絡的通用結構。由於ConvolutionalLayer也是一種神經網絡,兩種網絡的部件基本上是相同的。神經網絡有一個輸入(x)及輸出(y)。它們都是向量格式的數據。在上圖中,輸入為一個四維向量,而輸出也是一個四維向量。輸出向量y是怎樣計算出來的呢?每層都有一個參數矩陣。在本例中,它們用W表示。xW相乘得到下一個向量。為了增強這個模型的表達,這個向量被傳給某個非線性激活函數(σ),例如邏輯sigmoid函數(logistic sigmoid function)、Softmax函數。使用這個非線性函數,神經網絡就能逼近任意類型的函數。然後用z與另一個參數矩陣W相乘,並再次應用激活函數σ 。

你可以看到ConvolutionLayer的每個配置。nIn及nOut是輸入向量vector(x)及輸出向量vector(z)的維度。activation是這個層的激活函數,由邏輯sigmoid函數與修正線性單元所選擇。根據你的問題,輸入及輸出的維度能被立即確定。其他參數應當通過網格搜索來優化,這一點將在後面講述。

每一層(layer)的選擇我們自己常常是很難決定的。這需要了解一些知識,而且對要解決的特定問題要有一定的研究。deeplearning4j項目也提供了一份介紹性文檔(http://deeplearning4j.org/convolutionalnets.html)。雖然理解這份文檔需要一點數學及線性代數知識,但它仍然是描述卷積神經網絡工作原理的最簡單的文檔。

在這裡我們無法描述機器學習的全部細節。但是通常來說,這些算法主要用於圖像識別、文本處理及垃圾郵件過濾等場景。deeplearning4j的官方站點上(http://deeplearning4j.org)不僅有對如何deeplearning4j的介紹,也有對深度學習的一般討論,你還能學到前沿的技術與概念。

SparkNet由加州大學伯克利分校AMP實驗室於2015年11月發布。而Spark最早就是由AMP實驗室開發的。因此,說SparkNet 是「運行在Spark上的官方機器學習庫」一點兒也不為過。此庫提供了讀取RDD的接口,以及兼容深度學習框架Caffe(http://caffe.berkeleyvision.org/)的接口。SparkNet通過採用隨機梯度下降(Stochastic Gradient Descent)獲得了簡單的並行模式。SparkNet job能通過Spark-submit提交。你可以很輕鬆地使用這個新庫。

SparkNet的架構很簡單。SparkNet負責分布式處理,而核心的學習過程則委託給Caffe框架。SparkNet通過Java native訪問Caffee框架提供的C API。Caffee是用C++實現的,Caffe的C包裝器寫在SparkNet的libcaffe目錄下。所以SparkNet的整體代碼庫相對較小。Java代碼(CaffeLibrary.java)進一步包裝了這個庫。為了在Scala世界裡使用CaffeLibrary,Caffe還提供了CaffeNet。下圖展現了CaffeNet的層級。

CaffeNet層次結構

如果你熟悉Scala,那麼開發SparkNet的應用程式時只需要考慮CaffeNet。而且你也可以使用Spark RDD。它是通過一個JavaDataLayer C++代碼的包裝器來實現的。除此之外,SparkNet能加載Caffe格式的模型文件。這個擴展通常是通過.prototxt來設置的:

val netParameter        = ProtoLoader.loadNetPrototxt(sparkNetHome          + "your-caffemodel.prototxt")

替換模型的輸入,你可以在Spark上訓練自己的數據。SparkNet還提供了實用程序:

val newNetParameter =         ProtoLoader.replaceDataLayers(netParameter,            trainBatchSize, testBatchSize,            numChannels, height, width)

顧名思義,每個參數的含義定義了每個階段的批量大小和輸入大小(訓練、測試等)。這些參數的細節都可以在Caffe官方文檔中進行確認(http://caffe. berkeleyvision.org/tutorial/net_layer_blob.html)。換句話說,使用SparkNet,你就可以在Spark上通過Scala語言輕鬆使用Caffe。如果你已經能熟練使用Caffe,那麼SparkNet對你而言可能會很容易上手。

本文選自《Spark:大數據集群計算的生產實踐》,了解本書詳情請點擊閱讀原文


喜歡請分享至朋友圈

了解更多本書詳情請點擊閱讀原文

長按二維碼輕鬆關注

點擊閱讀原文,即可快速抵達本書詳情頁!

相關焦點

  • ...Java工程師轉型AI的秘密法寶——深度學習框架Deeplearning4j...
    雷鋒網AI研習社按:深度學習是人工智慧發展最為迅速的領域之一,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源深度學習框架。目前研究人員使用的深度學習框架有 TensorFlow、Torch 、Caffe、Theano、Deeplearning4j等,而Deeplearning4j是為數不多以Java/JVM為基礎,能與Apache Spark無縫結合,支持CPU/GPU集群分布式計算的開源框架。本文就來為大家詳細介紹一下深度學習框架Deeplearning4j的重要組件,不同環境下的操作用法及實例分享。
  • 【專知-Deeplearning4j深度學習教程01】分布式Java開源深度學習框架DL4j安裝使用: 圖文+代碼
    為此,我們推出來自中科院自動化所專知小組博士生Hujun創作的-分布式Java開源深度學習框架Deeplearning4j學習教程,第一篇,Deeplearning4j配置使用。Tensorflow、Caffe等框架的模型都可以被轉換為Keras模型,Deeplearning4j內置了Keras模型導入的支持,因此Deeplearning4j可以支持大部分流行深度學習框架模型的導入。
  • Java 工程師快速入門深度學習,從 Deeplearning4j 開始
    這些都是以 Python 和 C/C++ 語言為主,而在目前企業項目中,無論是 Web 應用、Andriod 開發還是大數據應用,Java 語言都佔有很大的比例。此外,我們必須看到,越來越多的從事傳統 Java 應用開發的工程師嘗試將 AI 技術融入到項目中,或者自身在嘗試轉型 AI 領域。
  • 開發者必備:基於 Linux 生態的十大AI開源框架盤
    Deeplearning4j:為Java用戶量身定製Deeplearning4j(Deep Learning For Java)是Java和Scala環境下的一個開源分布式的深度學習項目,由總部位於美國舊金山的商業智能和企業軟體公司Skymind牽頭開發,並得到了騰訊的投資。
  • 百度開源移動端深度學習框架mobile-deep-learning(MDL)
    2017 年 9 月 25 日,百度在 GitHub 開源了移動端深度學習框架 mobile-deep-learning(MDL)的全部代碼以及腳本,希望這個項目在社區的帶動下能夠更好地發展。寫在前面深度學習技術已經在網際網路的諸多方向產生影響,每天科技新聞中關於深度學習和神經網絡的討論越來越多。
  • 開發者必備:基於Linux生態的十大AI開源框架盤點
    Deeplearning4j:為Java用戶量身定製Deeplearning4j(Deep Learning For Java)是Java和Scala環境下的一個開源分布式的深度學習項目,由總部位於美國舊金山的商業智能和企業軟體公司Skymind牽頭開發,並得到了騰訊的投資
  • 深度學習(Deep Learning) 學習資料
  • 八個面向開發人員的機器學習平臺
    H2OH2O(https://www.h2o.ai/)是由H2O.ai為Python,R和Java程式語言設計的。人們通過使用自己熟悉的語言,就可以輕鬆地將預測分析等機器學習應用於各種實例。Eclipse Deeplearning4j(https://projects.eclipse.org/proposals/eclipse-deeplearning4j)Eclipse Deeplearning4j是針對Java虛擬機構建的開源庫。
  • 18個值得收藏的機器學習平臺
    Eclipse Deeplearning4jEclipse Deeplearning4j是為Java虛擬機構建的開源庫。以深度學習為核心,該工具面向那些需要在分布式CPU和GPU上工作的業務環境中構建深度神經網絡的開發人員。與Hadoop等文件系統一起工作的Scala,Clojure和Java程式設計師都會喜歡Eclipse Deeplearning4j。
  • 16個GitHub值得收藏的深度學習框架
    16個GitHub值得收藏的深度學習框架 工程師3 發表於 2018-05-10 12:13:00 深度學習是一種基於對數據進行表證學習的機器學習方法,近些年不斷發展並廣受歡迎
  • 深度學習——你需要了解的八大開源框架
    作為當下最熱門的話題,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源深度學習框架。目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow、Torch 、Caffe、Theano、Deeplearning4j等,這些深度學習框架被應用於計算機視覺、語音識別、自然語言處理與生物信息學等領域,並獲取了極好的效果。
  • 最前沿的深度學習論文、架構及資源分享
    深度卷積神經網絡在圖像、語音及NLP領域取得了巨大的成功,從學習和分享的角度出發,本篇文章整理了自2013年以來關於CNN相關的最新的資源,包括重要的論文、書籍、視頻教程、Tutorial、理論、模型庫和開發庫。文末附連結版資源地址。重要的論文:    1.
  • 機器學習(Machine Learning)&深度學習(Deep Learning)資料(之一)
    《Deep Learning in Neural Networks: An Overview》 介紹:這是瑞士人工智慧實驗室Jurgen Schmidhuber寫的最新版本《神經網絡與深度學習綜述》本綜述的特點是以時間排序,從1940年開始講起,到60-80年代,80-90年代,一直講到2000年後及最近幾年的進展。涵蓋了deep learning裡各種tricks,引用非常全面.
  • 大牛的《深度學習》筆記,Deep Learning速成教程
    為什麼擁有大數據的網際網路公司爭相投入大量資源研發深度學習技術。聽起來感覺deeplearning很牛那樣。那什麼是deep learning?為什麼有deep learning?它是怎麼來的?又能幹什麼呢?
  • ​大牛的《深度學習》筆記,Deep Learning速成教程
    為什麼擁有大數據的網際網路公司爭相投入大量資源研發深度學習技術。聽起來感覺deeplearning很牛那樣。那什麼是deep learning?為什麼有deep learning?它是怎麼來的?但是,一個痴心的老先生Hinton,他堅持了下來,並最終(和其它人一起Bengio、Yann.lecun等)提成了一個實際可行的deep learning框架。Deep learning與傳統的神經網絡之間有相同的地方也有很多不同。
  • 十個值得一試的開源深度學習框架 - OSCHINA - 中文開源技術交流社區
    無疑,來自Google軍火庫的TensorFlow必然是開源深度學習軟體中的明星產品,登陸GitHub當天就成為最受關注的項目,當周獲得評星數就輕鬆超過1萬個。對於希望在應用中整合深度學習功能的開發者來說,GitHub上其實還有很多不錯的開源項目值得關注,首先我們推薦目前規模人氣最高的TOP3:一、Caffe。
  • ​機器學習(Machine Learning)&深度學習(Deep Learning)資料(之二精選161-315網址)
    Aho-Corasick算法利用添加了返回邊的Trie樹,能夠在線性時間內完成匹配。但如果匹配十萬個正則表達式呢?這時候可以用到把多個正則優化成Trie樹的方法,如日本人寫的Regexp::Trie171.《Deep learning Reading List》介紹:深度學習閱讀清單172.《
  • 新書推薦 | Deep Reinforcement Learning
    深度強化學習是實現智能決策的關鍵技術之一,對人工智慧、機器人、認知科學、金融、資源調配、等重大應用需求和研究方向有重要的意義。深度學習是基於深度神經網絡的機器學習方法。深度強化學習是強化學習和深度學習的結合體,隨著近幾十年來深度學習發展的熱潮,深度強化學習作為一個新的重要學科分支吸引了越來越多的科研和產業人員的關注。