Nous testons actuellement un moteur de prédiction basée sur la mise en œuvre de Spark de LDA en 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 (nous utilisons le paquet pyspark.ml, non pyspark.mllib)Serve prédictions en temps réel avec le modèle Spark formé ML
Nous avons réussi à former un modèle sur un cluster Spark (en utilisant Google Cloud Dataproc). Nous essayons maintenant d'utiliser le modèle pour servir des prédictions en temps réel en tant qu'API (par exemple une application de flacon).
Quelle serait la meilleure approche pour y parvenir? Notre principal point douloureux est qu'il nous semble nécessaire de ramener tout l'environnement Spark afin de charger le modèle formé et d'exécuter la transformation. Jusqu'à présent, nous avons essayé de courir Spark en mode local pour chaque demande, mais a reçu cette approche nous a donné:
- mauvaises performances (temps de spin-le SparkSession, charger les modèles, exécutez la transformation ...)
- évolutivité médiocre (incapacité à traiter les demandes simultanées)
L'approche globale semble assez lourd, y aurait-il une alternative plus simple, ou même qui ne serait pas besoin d'impliquer Spark du tout?
Le code ci-dessous est un code simplifié des étapes d'apprentissage et de prédiction.
Code de formation
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://...")
Code de prédiction
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