将PySpark管道保存到PMML并使用Flask部署它(请求时应用程序中出现错误)

2024-04-26 14:59:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图找到一种方法,将经过培训的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_评估器0.2.3
  • 烧瓶1.1.1
  • pyspark 2.4.4

另外,下面是我用来将模型加载到Flask中的Python代码

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)

有人知道这里出了什么问题吗


Tags: inpyappflaskhomeevaluatorrequestlib
1条回答
网友
1楼 · 发布于 2024-04-26 14:59:38

您的参数DataFrame包含复杂的列类型;您选择的Java后端(PyJNIus)不知道如何将此Python值映射到Java值

如果你想继续以你自己的方式继续下去,你可以尝试的事情:

  • jpmml_evaluator包更新为最新版本。0.2.3之后增加了新的价值转换。更新的软件包版本应该确切地告诉您有问题的列类型是什么。请参阅^{}方法的源代码
  • 选择不同的Java后端。具体来说,试着用Py4J替换PyJNIus
  • 用Python代码中更简单的内容替换复杂的列类型

综合考虑,您最好使用OpenRESTWeb服务为您的PySpark模型提供服务。有一个关于deploying Apache Spark ML pipeline models as a REST web service的最新教程

相关问题 更多 >