Сохраните PySpark Pipeline в PMML и разверните его, используя Flask (ОШИБКА в приложении по запросу) - PullRequest
0 голосов
/ 03 марта 2020

Я пытался найти способ развернуть обученный конвейер PySpark в качестве API, и в итоге я остановился на Flask и PMML в качестве возможных решений.

Насколько я знаю, генерация файла PMML работает: я тренирую конвейер, используя ParamGridBuilder, получаю лучшую модель и выкладываю ее как файл .pmml .

Однако возникает проблема, когда я загружаю полученный файл в Flask. Я могу заставить API работать нормально; однако, когда я отправляю запрос, я получаю не ожидаемый результат (мнение, содержащееся в тексте), а следующую ошибку.

[2020-03-02 17:05:15,831] ERROR in app: Exception on /sentiment_analysis [GET]
Traceback (most recent call last):
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/users/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/users/sentiment_analysis.py", line 59, in hello_world
    resultado = evaluator.evaluate(df)
  File "/home/users/.local/lib/python3.6/site-packages/jpmml_evaluator/__init__.py", line 80, in evaluate
    javaArguments = self.backend.dict2map(arguments)
  File "/home/users/.local/lib/python3.6/site-packages/jpmml_evaluator/pyjnius.py", line 31, in dict2map
    raise ValueError()
ValueError
127.0.0.1 - - [02/Mar/2020 17:05:15] "GET /sentiment_analysis?text=test HTTP/1.1" 500 -

Вот версии соответствующего программного обеспечения и пакетов:

  • Python 3.6.4
  • Spark 2.4.4
  • pyspark2pmml 0.5.1
  • jpmml_evaluator 0.2.3
  • Flask 1.1.1
  • pyspark 2.4.4

Также ниже указан код Python, который я использую для загрузки модели в Flask.

from flask import Flask, request
import pandas as pd
from jpmml_evaluator import make_evaluator, pyjnius

app = Flask('sentiment_analysis')

@app.route("/sentiment_analysis")
def hello_world():

    text = request.args.get('text')

    pyjnius.jnius_configure_classpath()

    backend = pyjnius.PyJNIusBackend()

    evaluator = make_evaluator(backend, "test.pmml") \
        .verify()

    df = pd.DataFrame(columns=["TWEET"], data=[[text]])

    result = evaluator.evaluate(df)

    sentiment = result.collect()[0]['prediction']

    if int(sentiment) == 0:
        sentiment = 'negative'
    else:
        sentiment = 'positive'

    return 'The sentiment is: ' + sentiment, 200

app.run(host='0.0.0.0', port=5001)

Кто-нибудь знает, что здесь не так?

1 Ответ

1 голос
/ 03 марта 2020

Ваши аргументы DataFrame содержит сложный тип столбца; Выбранный вами Java бэкэнд (PyJNIus) не знает, как сопоставить это Python значение со значением Java.

Вещи, которые вы можете попробовать, если хотите продолжать идти по этому броску. Ваш собственный Flask API способ:

  • Обновите пакет jpmml_evaluator до последней версии. После 0.2.3 были добавлены новые преобразования стоимости. Более новая версия пакета должна точно указывать тип проблемного столбца c. См. Исходный код метода jpmml_evaluator.pyjnius.dict2map.
  • Выберите другой Java бэкэнд. В частности, попробуйте заменить PyJNIus на Py4J.
  • Замените сложный тип столбца на что-то более простое в вашем Python коде.

Учитывая все вышесказанное, вам будет гораздо лучше обслуживать свой Модели PySpark, использующие веб-сервис Openscoring REST. Существует актуальное учебное пособие по развертыванию Apache моделей конвейеров Spark ML в качестве веб-службы REST .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...