我正在尝试使用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中看到我的代码时,它没有显示任何错误,但是当我在集群上执行应用程序时:我有这样的事情:
我不知道它对我有什么要求。即使是一点帮助也将受到赞赏。感谢。
答案 0 :(得分: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 1和Spark 2。您的工件ID应为:
dl4j-spark _ $ {yourscala version}(通常为2.10,2.11) 具有依赖性: 0.9.1_spark _ $ {你的SPARK版本}
这也适用于我们的NLP模块。
为更多没有关注我们入门的人编辑(请执行此操作,我们保持最新):您还需要一个nd4j后端。通常这是nd4j-native-platform但是如果你使用gpus可能是cuda: nd4j-cuda - $ {你的CUDA VERSION} -platform