雅虎开源CaffeOnSpark:基于Hadoop/Spark的分布式深度学习
雅虎開源CaffeOnSpark:基于Hadoop/Spark的分布式深度學習
[日期:2016-02-26] | 來源:極客頭條?作者: | [字體:大 中 小] |
在基于Hadoop集群的大規模分布式深度學習一文中,雅虎介紹了其集Caffe和Spark之長開發CaffeOnSpark用于大規模分布式深度學習,并向github.com/BVLC/caffe貢獻了部分代碼。現在,雅虎機器學習團隊又在這篇tumblr文章上宣布將整個CaffeOnSpark開源作為Spark的深度學習包。
Github:yahoo/CaffeOnSpark(Apache 2.0 license)
許多現有的DL框架需要一個分離的集群進行深度學習,而一個典型的機器學習管道需要創建一個復雜的程序(如圖1)。分離的集群需要大型的數據集在它們之間進行傳輸,從而系統的復雜性和端到端學習的延遲不請自來。
圖1 分離集群上復雜程序的ML Pipeline
?
雅虎認為,深度學習應該與現有的支持特征工程和傳統(非深度)機器學習的數據處理管道在同一個集群中,創建CaffeOnSpark意在使得深度學習訓練和測試能被嵌入到Spark應用程序(如圖2)中。
圖2 單一集群上單程序的ML Pipeline
?
CaffeOnSpark:API&配置和CLI
CaffeOnSpark被設計成為一個Spark深度學習包。Spark MLlib支持各種非深度學習算法用于分類、回歸、聚類、推薦等,但目前缺乏深度學習這一關鍵能力,而CaffeOnSpark旨在填補這一空白。CaffeOnSpark API支持dataframes,以便易于連接準備使用Spark應用程序的訓練數據集,以及提取模型的預測或中間層的特征,用于MLLib或SQL數據分析。
圖3 CaffeOnSpark成為一個Spark深度學習package
?
使用CaffeOnSpark和MLlib的Scala應用如下:
1: def main(args: Array[String]): Unit = {2: val ctx = new SparkContext(new SparkConf())3: val cos = new CaffeOnSpark(ctx)4: val conf = new Config(ctx, args).init()5: val dl_train_source = DataSource.getSource(conf, true)6: cos.train(dl_train_source)7: val lr_raw_source = DataSource.getSource(conf, false)8: val extracted_df = cos.features(lr_raw_source)9: val lr_input_df = extracted_df.withColumn(“Label”, cos.floatarray2doubleUDF(extracted_df(conf.label))) 10: .withColumn(“Feature”, cos.floatarray2doublevectorUDF(extracted_df(conf.features(0)))) 11: val lr = new LogisticRegression().setLabelCol(“Label”).setFeaturesCol(“Feature”) 12: val lr_model = lr.fit(lr_input_df) 13: lr_model.write.overwrite().save(conf.outputPath) 14: }這段代碼演示了CaffeOnSpark和MLlib如何協同:
- L1-L4:初始化Spark上下文,并使用它來創建CaffeOnSpark和配置對象。
- L5-L6:使用CaffeOnSpark與HDFS上的一個訓練數據集進行DNN訓練。
- L7-L8:學習到的DL模型應用于從HDFS上的數據集提取特征。
- L9-L12:MLlib使用提取的特征進行非深度學習(用更具體的LR分類)。
- L13:可以保存分類模型到HDFS。
CaffeOnSpark使得深度學習步驟能夠無縫嵌入Spark應用。它消除了在傳統的解決方案不得不做的數據移動(如圖1所示),并支持直接在大數據集群上進行深度學習。直接訪問大數據和大規模計算能力對深度學習至關重要。
如同標準的CaffeCa,CaffeOnSpark用配置文件于求解器和神經網絡。正如例子中的神經網絡有一個MemoryData層有2個額外的參數:
- source_class指定數據源類
- source指定數據集的位置
最初發布的CaffeOnSpark有幾個內置的數據源類(包括com.yahoo.ml.caffe.LMDB的LMDB數據庫和com.yahoo.ml.caffe.SeqImageDataSource的Hadoop的序列文件)。用戶可以很容易地引入自定義的數據源類與現有的數據格式進行交互。
CaffeOnSpark應用程序將通過標準的Spark命令(如spark-submit)launch。這里有兩個spark-submit命令的例子。第一個命令使用CaffeOnSpark訓練一個DNN模型保存到HDFS上。第二個命令是一個定制的嵌入CaffeOnSpark及MLlib的應用。
第一個命令:
spark-submit \–files caffenet_train_solver.prototxt,caffenet_train_net.prototxt \–num-executors 2 \–class com.yahoo.ml.caffe.CaffeOnSpark \caffe-grid-0.1-SNAPSHOT-jar-with-dependencies.jar \-train -persistent \-conf caffenet_train_solver.prototxt \-model hdfs:///sample_images.model \-devices 2第二個命令:
spark-submit \–files caffenet_train_solver.prototxt,caffenet_train_net.prototxt \–num-executors 2 \–class com.yahoo.ml.caffe.examples.MyMLPipeline \ caffe-grid-0.1-SNAPSHOT-jar-with-dependencies.jar \-features fc8 \-label label \-conf caffenet_train_solver.prototxt \-model hdfs:///sample_images.model \-output hdfs:///image_classifier_model \-devices 2系統架構
圖4 CaffeOnSpark系統架構
?
CaffeOnSpark系統架構如圖4所示(和之前相比沒有變化)。Spark executor中,Caffe引擎在GPU設備或CPU設備上,通過調用一個細顆粒內存管理的JNI層。不同于傳統的Spark應用,CaffeOnSpark executors之間通過MPI allreduce style接口通信,通過TCP/以太網或者RDMA/Infiniband。這個Spark+MPI架構使得CaffeOnSpark能夠實現和專用深度學習集群相似的性能。
許多深度學習工作是長期運行的,處理潛在的系統故障很重要。CaffeOnSpark支持定期快照訓練狀態,因此job出現故障后能夠恢復到之前的狀態。
雅虎已經在多個項目中應用CaffeOnSpark,如Flickr小組通過在Hadoop集群上用CaffeOnSpark訓練數百萬張照片,顯著地改進圖像識別精度。現在深度學習研究者可以在一個AWS EC2云或自建的Spark集群上進行測試CaffeOnSpark。
總結
以上是生活随笔為你收集整理的雅虎开源CaffeOnSpark:基于Hadoop/Spark的分布式深度学习的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: IBM也要开源机器学习平台
- 下一篇: 大端(Big Endian)与小端(Li