2015-03-25 4 views
11

Ich arbeite mit Spark 1.3.0 mit PySpark und MLlib und ich muss meine Modelle speichern und laden. Ich verwende Code wie folgt (von der offiziellen documentation genommen)Was ist der richtige Weg zum Speichern von Modellen in Spark PySpark

from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating 

data = sc.textFile("data/mllib/als/test.data") 
ratings = data.map(lambda l: l.split(',')).map(lambda l: Rating(int(l[0]), int(l[1]), float(l[2]))) 
rank = 10 
numIterations = 20 
model = ALS.train(ratings, rank, numIterations) 
testdata = ratings.map(lambda p: (p[0], p[1])) 
predictions = model.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2])) 
predictions.collect() # shows me some predictions 
model.save(sc, "model0") 

# Trying to load saved model and work with it 
model0 = MatrixFactorizationModel.load(sc, "model0") 
predictions0 = model0.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2])) 

Nachdem ich versuche zu verwenden model0 ich eine lange Zurückverfolgungs bekommen, die mit diesem endet:

Py4JError: An error occurred while calling o70.predict. Trace: 
py4j.Py4JException: Method predict([class org.apache.spark.api.java.JavaRDD]) does not exist 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:333) 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:342) 
    at py4j.Gateway.invoke(Gateway.java:252) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:207) 
    at java.lang.Thread.run(Thread.java:745) 

Also meine Frage ist - bin ich etwas falsch machen? Soweit ich debugged meine Modelle gespeichert sind (lokal und auf HDFS) und sie enthalten viele Dateien mit einigen Daten. Ich habe das Gefühl, die Modelle korrekt gespeichert werden, aber wahrscheinlich werden sie nicht richtig geladen. Ich habe auch gegoogelt, aber nichts gefunden.

Sieht aus wie diese Funktion save \ load wurde kürzlich in Spark 1.3.0 hinzugefügt und aus diesem Grund habe ich eine andere Frage - Was war die empfohlene Methode zum Speichern \ laden Modelle vor der Version 1.3.0? Ich habe keine guten Möglichkeiten gefunden, zumindest für Python. Ich habe auch versucht Pickle, aber mit den gleichen Problemen konfrontiert wie hier beschrieben Save Apache Spark mllib model in python

Antwort

2

ich in diese laufen auch - es sieht aus wie ein Bug. Ich habe zu spark jira berichtet.

+0

Vielen Dank! Sieht so aus, als wäre das ein Python Bindings Bug. – artemdevel

5

Ab this pull request fusioniert am 28. März 2015 (ein Tag nach der letzten Bearbeitung Ihrer Frage) Dieses Problem wurde behoben.

Sie müssen nur klonen/holen Sie die neueste Version von GitHub (git clone git://github.com/apache/spark.git -b branch-1.3) dann bauen (gemäß den Anweisungen in spark/README.md) mit $ mvn -DskipTests clean package.

Hinweis: Ich hatte Schwierigkeiten, Spark zu bauen, weil Maven sich nicht wohl fühlte. Ich löste dieses Problem, indem ich $ update-alternatives --config mvn verwendete und den 'Pfad' auswählte, der Priorität hatte: 150, was auch immer das bedeutet. Explanation here.

+0

Ja, ich habe diese PR gesehen, danke! Aber ich habe noch nicht versucht, Spark selbst zu bauen. Auch Dank für einen Tipp für Maven :) – artemdevel

6

Eine Möglichkeit, ein Modell zu speichern (in Scala, aber wahrscheinlich ist ähnlich in Python):

// persist model to HDFS 
sc.parallelize(Seq(model), 1).saveAsObjectFile("linReg.model") 

Saved Modell kann dann wie geladen werden:

val linRegModel = sc.objectFile[LinearRegressionModel]("linReg.model").first() 

Siehe auch im Zusammenhang question

weitere Details finden (ref)

0

Verwenden pi pelletieren Sie in ML, um das Modell zu trainieren, und verwenden Sie dann MLWriter und MLReader, um Modelle zu speichern und zurückzulesen.

from pyspark.ml import Pipeline 
from pyspark.ml import PipelineModel 

pipeTrain.write().overwrite().save(outpath) 
model_in = PipelineModel.load(outpath) 
+1

Dank, aber diese Frage ist sehr alt :) viele Dinge haben sich seit der Zeit änderte sie gefragt wurde. – artemdevel

Verwandte Themen