python - org - ¿Cuál es la forma correcta de guardar / cargar modelos en Spark / PySpark?
pyspark tutorial español (4)
A partir de esta solicitud de extracción se fusionó el 28 de marzo de 2015 (un día después de la última edición de su pregunta) este problema se ha resuelto.
Solo necesita clonar / recuperar la última versión de GitHub ( git clone git://github.com/apache/spark.git -b branch-1.3
) y luego compilarla (siguiendo las instrucciones en spark/README.md
) con $ mvn -DskipTests clean package
.
Nota: Me encontré con problemas para construir Spark porque Maven estaba siendo poco convincente. $ update-alternatives --config mvn
ese problema usando $ update-alternatives --config mvn
y seleccionando la ''ruta'' que tenía Priority: 150, sea lo que sea lo que eso signifique. Explicación aquí .
Estoy trabajando con Spark 1.3.0 usando PySpark y MLlib y necesito guardar y cargar mis modelos. Uso un código como este (tomado de la documentación oficial)
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]))
Después de tratar de usar model0 obtengo un traceback largo, que termina con esto:
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)
Entonces mi pregunta es: ¿estoy haciendo algo mal? En cuanto a mis depuraciones, mis modelos se almacenan (localmente y en HDFS) y contienen muchos archivos con algunos datos. Tengo la sensación de que los modelos se guardan correctamente, pero probablemente no se carguen correctamente. También busqué en Google pero no encontré nada relacionado.
Parece que esta característica de guardar / carga se ha agregado recientemente en Spark 1.3.0 y debido a esto tengo otra pregunta: ¿cuál era la forma recomendada de guardar / cargar modelos antes de la versión 1.3.0? No he encontrado ninguna buena manera de hacer esto, al menos para Python. También probé Pickle, pero me enfrenté a los mismos problemas que se describen aquí. Guarde el modelo Apache Spark mllib en python
Me encuentro con esto también, parece un error. He informado para despertar a jira .
Una forma de guardar un modelo (en Scala, pero probablemente sea similar en Python):
// persist model to HDFS
sc.parallelize(Seq(model), 1).saveAsObjectFile("linReg.model")
El modelo guardado se puede cargar como sigue:
val linRegModel = sc.objectFile[LinearRegressionModel]("linReg.model").first()
Ver también la pregunta relacionada
Para más detalles ver ( ref )
Use pipeline en ML para entrenar el modelo, y luego use MLWriter y MLReader para guardar los modelos y leerlos de nuevo.
from pyspark.ml import Pipeline
from pyspark.ml import PipelineModel
pipeTrain.write().overwrite().save(outpath)
model_in = PipelineModel.load(outpath)