https://github.com/Hydrospheredata/hydro-serving
от вопрос уже есть ответ здесь:
Как обслуживать модель Spark MLlib? 3 ответаВ настоящее время мы тестируем механизм прогнозирования, основанный на реализации LDA Spark в 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 (мы используем пакет pyspark.ml, а не pyspark.mllib)
Мы смогли успешно обучить модели в кластере Spark (используя Google Cloud Dataproc). Теперь мы пытаемся использовать модель для предоставления прогнозов в режиме реального времени в качестве API (например, приложения колбы).
Каков наилучший подход для достижения этого?
Наша главная проблема в том, что нам кажется, что нам нужно вернуть всю среду Spark, чтобы загрузить обученную модель и запустить преобразование. До сих пор мы пробовали запускать Spark в локальном режиме для каждого полученного запроса, но этот подход дал нам:
Плохая производительность (время раскручивать SparkSession, загружать модели, запускать трансформацию ...)Плохая масштабируемость (невозможность обрабатывать параллельные запросы)Весь подход кажется довольно тяжелым, будет ли более простая альтернатива или даже такая, которая вообще не должна будет подразумевать Spark?
Ниже приведены упрощенные коды шагов обучения и прогнозирования.
Учебный код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://...")
Код прогноза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