wir derzeit eine Vorhersage-Engine testen basierend auf Spark-Implementierung von LDA in Python: https://spark.apache.org/docs/2.2.0/ml-clustering.html#latent-dirichlet-allocation-lda https://spark.apache.org/docs/2.2.0/api/python/pyspark.ml.html#pyspark.ml.clustering.LDA (wir das pyspark.ml Paket verwenden, nicht pyspark.mllib)Serve Echtzeit-Vorhersagen mit ausgebildeten Spark-ML-Modell
Wir konnten erfolgreich ein Modell auf einem Spark-Cluster trainieren (mit Google Cloud Dataproc). Jetzt versuchen wir, das Modell zu verwenden, um Echtzeitvorhersagen als eine API (z. B. eine Kolbenanwendung) zu liefern.
Was wäre der beste Ansatz, um dies zu erreichen?
Unser Hauptproblem ist, dass es scheint, dass wir die gesamte Spark-Umgebung zurückbringen müssen, um das trainierte Modell zu laden und die Transformation auszuführen. Bisher haben wir versucht, laufen Spark in lokalen Modus für jede empfangene Anforderung aber dieser Ansatz hat uns:
- Schlechte Leistungen (Zeit, um die SparkSession zu Spin-up, um die Modelle laden, führen die Transformation ...)
- Schlechte Skalierbarkeit (Unfähigkeit gleichzeitige Anforderungen zu verarbeiten)
Der ganze Ansatz scheint ziemlich schwer, gäbe es eine einfachere Alternative zu sein, oder sogar eine, die Funken nicht brauchen würde, überhaupt zu bedeuten?
Unten sind vereinfachte Code der Training und Vorhersage Schritte.
Trainings-Code
def train(input_dataset):
conf = pyspark.SparkConf().setAppName("lda-train")
spark = SparkSession.builder.config(conf=conf).getOrCreate()
# Generate count vectors
count_vectorizer = CountVectorizer(...)
vectorizer_model = count_vectorizer.fit(input_dataset)
vectorized_dataset = vectorizer_model.transform(input_dataset)
# Instantiate LDA model
lda = LDA(k=100, maxIter=100, optimizer="em", ...)
# Train LDA model
lda_model = lda.fit(vectorized_dataset)
# Save models to external storage
vectorizer_model.write().overwrite().save("gs://...")
lda_model.write().overwrite().save("gs://...")
Prediction Code
def predict(input_query):
conf = pyspark.SparkConf().setAppName("lda-predict").setMaster("local")
spark = SparkSession.builder.config(conf=conf).getOrCreate()
# Load models from external storage
vectorizer_model = CountVectorizerModel.load("gs://...")
lda_model = DistributedLDAModel.load("gs://...")
# Run prediction on the input data using the loaded models
vectorized_query = vectorizer_model.transform(input_query)
transformed_query = lda_model.transform(vectorized_query)
...
spark.stop()
return transformed_query