當前位置:
首頁 > 科技 > 如何使用SparkNet進行分布式深度神經網路訓練

如何使用SparkNet進行分布式深度神經網路訓練

GIF/1.7M

圖:pixabay

「機器人圈」導覽:訓練深度神經網路需要花費寶貴的時間和資源。而Matthew Mayo現在提出一種訓練深度神經網路的新方法。通過利用現有的分布式批處理框架,SparkNet可以快速有效地訓練神經網路。下面就和機器人圈一起來了解一下吧。

現如今,深度學習是機器學習中最熱門的一種方法,與此同時,它還在繼續取得顯著成果。

深度神經網路在不斷地被證實是一門既有用又具有創新性的學科技術。該技術已經證明了其在之前停滯不前的研究領域中取得重大進展的能力,並迫使一些任不得不去反問,它是否可能是機器學習的頂點。雖然不是魔術(但也可能是從魔鬼那獲得的),但深度學習確實是一個複雜的學習領域,並且有時甚至會讓最博學的人感到驚訝。

深度神經網路也可以花費寶貴的時間和資源來進行訓練。以前的嘗試是為了促進集群訓練環境中的參數協調,而諸如Theano這樣的主要框架旨在讓它們的軟體包在短期內充分利用分布式GPU集群。但是,如何利用現有的批處理分布式框架來訓練這些網路呢?

諸如Hadoop或Spark這樣的分布式數據處理框架,在過去十年中得到了廣泛應用並獲得成功。而最初的MapReduce範式及其派生的處理演算法,衍生技術和支持工具已經成為現代數據科學和分析的主要內容,並且沒有顯示出控制的跡象。而在開放環境下,Apache Spark實現的普遍存在性可以為深度神經網路的大規模訓練提供理想的工具,當然,前提是如果這樣的框架確實能夠被利用的話。

AMP實驗室,而這就是我們介紹SparkNet的地方,加州大學伯克利分校AMP實驗室的開發人員簡單介紹了 「可擴展的分布式深度網路訓練演算法」是如何實現的。他們還指出它所具有的可能的賣點:它適用於諸如Spark這樣的框架,並且可以在有限的帶寬環境中進行有效的工作。而SparkNet是建立在Spark和Caffe之上的。

SparkNet概述

SparkNet最初是由Moritz,Nishihara,Stoica和Jordan(2015)在本文中引入的。它是一個是開源軟體。除了可擴展的分布式深度神經網路訓練演算法的核心概念,SparkNet還包括一個介面,用於讀取Spark的數據抽象——稱為彈性分布式數據集(RDD),這是一個與Caffe深度學習框架進行交互的Scala介面(它是用C ++編寫的)和一個輕量級張量庫。

也許最重要的是,開發人員聲稱,通過將深度學習整合到現有的數據處理流程中,可以實現許多其他好處。諸如Spark之類的框架將允許通過單個系統進行清理,預處理和其他與數據有關的任務,並且數據集可以保存在整個處理過程中的內存中,從而消除昂貴的磁碟寫入。

SparkNet的硬體要求是很低的。除此之外,SparkNet的並行隨機梯度(SGD)演算法要求節點間的通信達到最小。開發人員還強調,他們的目標不是要簡單優於現有的計算框架,而是提供一個完全不同的範例,而這恰好是在一個受歡迎的的批處理框架(如Apache Spark)上實現的,而且其性能幾乎和專業化深入學習框架類似,並且具有上述所提及之外的額外好處。

梯度下降並行化方案可以看到Spark工作節點之間的數據分割,並且在每一次迭代時,主節點向所有工作人員廣播模型參數。每個工作人員在其數據子集上運行預定數量的SGD迭代,直到最大時間長度。而所得到的參數會被發送到主節點上,在那裡它們將被平均轉換為新的模型參數。

顯然,這種方法可能需要在SGD發生之前進行重要的廣播和收集參數,因此對架構進行調整是很有必要的。 SparkNet的作者在其論文中提出了這樣的調整建議,並提供了實驗結果。

雖然該文章僅側重於梯度下降,但作者聲稱SparkNet可以與任何Caffe解算器一起工作。

Caffe是用C ++編寫的,因此 wrapper 用於它與SparkNet之間的交互。而Java API是用來調用此C wrapper的。 雖然可以直接調用Java API,但建議你通過使用Scala CaffeNet類來使用它從而促進Spark操作(Spark本身是用Scala編寫的)。 Caffe通過自定義JavaDataLayer從Spark RDD中讀取數據。

使用SparkNet

為了能夠正確實現SparkNet,你首先需要一個Spark集群。然後,SparkNet作業將通過spark-submit進行提交。

而你如果想要根據報告自行構建軟體的話,你需要Scala構建工具(SBT)和CUDA版本7,以及上述提到的現有的Apache Spark群集。你將在SparkNet構建期間免費獲得Caffe。點擊(這裡和這裡)你將獲得位於GitHub中的構建SparkNet的簡單直接的說明。

模型是在Caffe NetParameter對象中進行定義的,而求解器是在Caffe SolverParameter對象中定義的。通過SparkNet的Scala介面,描述特定深度神經網路規範的NetParameter對象可以定義為如下代碼(來自SparkNet repo):

val netParam = NetParam ("LeNet",

RDDLayer("data", shape=List(batchsize, 1, 28, 28), None),

RDDLayer("label", shape=List(batchsize, 1), None),

ConvolutionLayer("conv1", List("data"), kernel=(5,5),

numOutput=20),

PoolingLayer("pool1", List("conv1"), pooling=Pooling.Max,

kernel=(2,2), stride=(2,2)),

ConvolutionLayer("conv2", List("pool1"), kernel=(5,5),

numOutput=50),

PoolingLayer("pool2", List("conv2"), pooling=Pooling.Max,

kernel=(2,2), stride=(2,2)),

InnerProductLayer("ip1", List("pool2"), numOutput=500),

ReLULayer("relu1", List("ip1")),

InnerProductLayer("ip2", List("relu1"), numOutput=10),

SoftmaxWithLoss("loss", List("ip2", "label"))

)

有關這些圖層及其定義的更多信息,請參見Caffe Layer Catalog。當然,對於那些在Caffe上經驗豐富的或者對神經網路極其了解的人來說,上述內容是很容易進行理解的。

以下是分布式訓練示例的示例Scala代碼(來自SparkNet論文):

var trainData = loadData(. . .)

var trainData = preprocess(trainData).cache()

var nets = trainData.foreachPartition(data => {

var net = Net(netParams)

net.setTrainingData(data)

net)

var weights = initialWeights(. . .)

for (i

var broadcastWeights = broadcast(weights)

nets.map(net => net.setWeights(broadcastWeights.value))

weights = nets.map(net => {

net.train(50)

// an average of WeightCollection objects

net.getWeights()}).mean()

}

和任何優秀的深度學習項目一樣,SparkNet包含了在CIFAR應用程序形式上類似於「Hello World」的實際機器學習設備。而讓它運行是很簡單的。首先你要得到CIFAR數據:

$ SPARKNET_HOME/caffe/data/cifar10/get_cifar10.sh

然後提交作業 spark-submit:

$ SPARK_HOME/bin/spark-submit --class apps.CifarApp

SparkNetPreview/target/scala-2.10/sparknetpreview-assembly-0.1-SNAPSHOT.jar 5

討論

作為目前正在進行的一種小型但數量越來越多的集群深度學習方案之一,如果你決定用SparkNet來訓練你的神經網路,那麼你可能會很容易上手並掌握良好的手段,因為它是由負責其主要組成部分的實驗室開發的( Spark和Caffe)。

如果你決定嘗試一下,那麼你應該記得SparkNet並沒有和Spark(或任何其他分布式批處理系統)或Caffe(或任何其他深度學習框架)競爭;它的目標是提供一個替代範例,將神經網路的訓練裝配成更大的數據處理流程。如果這只是一個你想小試牛刀的示例,SparkNet是值得一試的。

應該指出的是,SparkNet不是Spark上深度網路訓練的唯一現有工具。HeteroSpark在今年3月的Spark Summit 2015上展示的是「用於深度學習演算法的異構CPU / GPU Spark平台」。演示的幻燈片可以在這裡,而點擊視頻可以進行查看。

就像越有名氣,才越具有吸引力一樣,一種稱為 H2O"s Sparkling Water 在Spark-slash-deep-learning空間里活躍著。這個自稱為 「殺手級應用程序」的Sparkling Water允許在Spark群集中進行可擴展的機器學習,包括深度學習。在「KDnuggets」文章中可以找到使用Sparkling Water打擊犯罪的記錄。Sparkling Water可以在H2O的GitHub頁面上找到。

SparkNet的論文概述了額外的相關工作和以前的作品。雖然有一些要考慮的事項,但是重複一遍,SparkNet是由同一個實驗室開發的,該實驗室已經成功開發和維護了其2個核心組成部分,特別是Spark和Caffe。雖然我對AMP Labs沒有任何個人興趣,也沒有任何證據支持這個(或其他)觀點,但是組合這些特定的深度學習和分布式處理工具的小組似乎是合乎邏輯的,而這具有將他們整合到其他任意地方的機會。僅憑這一點,我打算對SparkNet進一步測試。

作者:Matthew Mayo

來源:KDnuggets

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

如何使用深度學習重建高解析度音頻?
CANs重磅發布,機器生成的「藝術作品」比人類藝術家更受歡迎
賽迪顧問孫會峰:2017最全機器人和人工智慧投融資榜單就在這
RAIC雷克大會召開 機器人—人工智慧定義未來
中國人工智慧產業創新聯盟在京成立 近200家成員單位參與

TAG:機器人圈 |

您可能感興趣

用於運行和訓練深度神經網路的開源 C+庫——nGraph
教你使用Keras on Google Colab微調深度神經網路
從AlexNet到MobileNet,帶你入門深度神經網路
基於注意力機制的深度網路HydraPlus-Net
當Node.js遇上OpenCV深度神經網路
谷歌YouTube推薦系統的深度神經網路應用
Yoshua Bengio團隊通過在網路「隱藏空間」中使用降噪器以提高深度神經網路的「魯棒性」
深度學習訓練決策,Waymo披露ChauffeurNet進展
使用Keras進行深度學習:(五)RNN和雙向RNN講解及實踐
CDPR與Digital Scapes將展開深度合作
使用Caicloud TaaS 平台落地深度學習演算法實戰
教程 | 如何使用 Kubernetes 輕鬆部署深度學習模型
如何使用 Kubernetes 輕鬆部署深度學習模型
無需深度學習框架,如何從零開始用Python構建神經網路
用Python 進行深度學習
基於 Jetson在Aerial 系統內進行深度學習
LV 路易威登Nano Speedy、Nano Noe手袋深度測評報告
白話深度殘差網路ResNet
入門必看 | 深度Q-learning簡介【RL系列】
Nvidia發布GPU上的Kubernetes以加速深度學習負載