0

我正在尝试使用 Deeplearning4j 库在 Spark 上构建应用程序。我有一个集群,我将使用 spark-submit 命令运行我的 jar(使用 intelliJ 构建)。这是我的代码

package Com.Spark.Examples

import scala.collection.mutable.ListBuffer
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.canova.api.records.reader.RecordReader
import org.canova.api.records.reader.impl.CSVRecordReader
import org.deeplearning4j.nn.api.OptimizationAlgorithm
import org.deeplearning4j.nn.conf.MultiLayerConfiguration
import org.deeplearning4j.nn.conf.NeuralNetConfiguration
import org.deeplearning4j.nn.conf.layers.DenseLayer
import org.deeplearning4j.nn.conf.layers.OutputLayer
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.deeplearning4j.spark.impl.multilayer.SparkDl4jMultiLayer
import org.nd4j.linalg.lossfunctions.LossFunctions

object FeedForwardNetworkWithSpark {
  def main(args:Array[String]): Unit ={
    val recordReader:RecordReader = new CSVRecordReader(0,",")
    val conf = new SparkConf()
      .setAppName("FeedForwardNetwork-Iris")
    val sc = new SparkContext(conf)
    val numInputs:Int = 4
    val outputNum = 3
    val iterations =1
    val multiLayerConfig:MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
      .seed(12345)
      .iterations(iterations)
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
      .learningRate(1e-1)
      .l1(0.01).regularization(true).l2(1e-3)
      .list(3)
      .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(3).activation("tanh").weightInit(WeightInit.XAVIER).build())
      .layer(1, new DenseLayer.Builder().nIn(3).nOut(2).activation("tanh").weightInit(WeightInit.XAVIER).build())
      .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT).weightInit(WeightInit.XAVIER)
        .activation("softmax")
        .nIn(2).nOut(outputNum).build())
      .backprop(true).pretrain(false)
      .build
    val network:MultiLayerNetwork = new MultiLayerNetwork(multiLayerConfig)
    network.init
    network.setUpdater(null)
    val sparkNetwork:SparkDl4jMultiLayer = new
        SparkDl4jMultiLayer(sc,network)
    val nEpochs:Int = 6
    val listBuffer = new ListBuffer[Array[Float]]()
    (0 until nEpochs).foreach{i => val net:MultiLayerNetwork = sparkNetwork.fit("/user/iris.txt",4,recordReader)
      listBuffer +=(net.params.data.asFloat().clone())
      }
    println("Parameters vs. iteration Output: ")
    (0 until listBuffer.size).foreach{i =>
      println(i+"\t"+listBuffer(i).mkString)}
  }
}

这是我的 build.sbt 文件

name := "HWApp"

version := "0.1"

scalaVersion := "2.12.3"

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0" % "provided"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.10" % "1.6.0" % "provided"
libraryDependencies += "org.deeplearning4j" % "deeplearning4j-nlp" % "0.4-rc3.8"
libraryDependencies += "org.deeplearning4j" % "dl4j-spark" % "0.4-rc3.8"
libraryDependencies += "org.deeplearning4j" % "deeplearning4j-core" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "nd4j-x86" % "0.4-rc3.8" % "test"
libraryDependencies += "org.nd4j" % "nd4j-api" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "nd4j-jcublas-7.0" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "canova-api" % "0.0.0.14"

当我在 intelliJ 中看到我的代码时,它没有显示任何错误,但是当我在集群上执行应用程序时:我得到了这样的东西:

错误

我不知道它想从我这里得到什么。即使是一点帮助也将不胜感激。谢谢。

4

1 回答 1

0

我不确定你是如何得出这个版本列表的(我假设只是随机编译?请不要那样做。)

您正在使用 1.5 年前的 dl4j 版本,其依赖关系比不再存在的依赖关系早一年。

从头开始,按照我们的入门和示例,就像您对任何其他开源项目一样。

这些可以在这里找到: https ://deeplearning4j.org/quickstart

这里有示例项目: https ://github.com/deeplearnin4j/dl4j-examples

还有一些事情:Canova 不再存在,并且已重命名为 datavec 一年多。

所有 dl4j、datavec、nd4j、.. 版本必须相同。

如果您使用我们的任何 scala 模块,例如 spark,这些模块也必须始终具有相同的 scala 版本。

因此,您将 scala 2.12 与 scala 2.10 依赖项混合在一起,这是 scala no no(甚至不是 dl4j 特定的)。

Dl4j 最多只支持 scala 2.11。这主要是因为像 cdh 和 hortonworks 这样的 hadoop 发行版还不支持 scala 2.12。

编辑:要注意的另一件事是特定于 dl4j 的是我们如何制作 spark 版本。支持 Spark 1 和 2。您的工件 ID 应为:

dl4j-spark_${yourscala version}(通常是 2.10、2.11),具有如下依赖项:0.9.1_spark_${YOUR VERSION OF SPARK}

这也适用于我们的 NLP 模块。

为更多没有遵循我们入门的人编辑(请这样做,我们会保持最新状态):您还总是需要一个 nd4j 后端。通常这是 nd4j-native-platform 但如果您使用 gpus 可能是 cuda:nd4j-cuda-${YOUR CUDA VERSION}-platform

于 2017-09-12T06:06:43.063 回答