使用Python Flask发布机器学习API

2019-06-21 17:01:08 浏览数 (1)

作者 | Andrejus Baranovskis

来源 | Towards Data Science

编辑 | 代码医生团队

Flask很有趣易于设置,就像在Flask 网站上所说的那样。这个Python的微框架提供了一种使用REST端点注释Python功能的强大方法。正在使用Flask发布ML模型API,以供第三方业务应用程序访问。

此示例基于XGBoost。

为了更好的代码维护,建议使用单独的Jupyter笔记本,其中将发布ML模型API。导入Flask模块和Flask CORS:

代码语言:javascript复制
from flask import Flask, jsonify, request

from flask_cors import CORS, cross_origin

import pickle

import pandas as pd

模型在Pima Indians糖尿病数据库上进行训练。CSV数据可以从这里下载。要构建Pandas数据帧变量作为模型预测函数的输入,需要定义一个数据集列数组:

https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv

代码语言:javascript复制
# Get headers for payload

headers = ['times_pregnant', 'glucose', 'blood_pressure', 'skin_fold_thick', 'serum_insuling', 'mass_index', 'diabetes_pedigree', 'age']

使用Pickle加载以前训练过的和保存过的模型:

代码语言:javascript复制
# Use pickle to load in the pre-trained model

with open(f'diabetes-model.pkl', 'rb') as f:

model = pickle.load(f)

测试运行并检查模型是否运行良好总是一个好习惯。使用列名称数组和数据数组构造数据框(使用新数据,训练或测试数据集中不存在的数据)。调用两个函数 -model.predictmodel.predict_proba。通常更喜欢model.predict_proba,它返回描述0/1可能性的概率,这有助于根据某个范围(例如0.25到0.75)解释结果。使用样本有效负载构建Pandas数据帧,然后执行模型预测:

代码语言:javascript复制
# Test model with data frame

input_variables = pd.DataFrame([[1, 106, 70, 28, 135, 34.2, 0.142, 22]],

                                columns=headers,

                                dtype=float,

                                index=['input'])

# Get the model's prediction

prediction = model.predict(input_variables)

print("Prediction: ", prediction)

prediction_proba = model.predict_proba(input_variables)

print("Probabilities: ", prediction_proba)

Flask API确保启用CORS,否则API调用将无法在其他主机上运行。在要通过REST API公开的函数之前编写注释。提供端点名称和支持的REST方法(本例中为POST)。从请求中检索有效载荷数据,构造Pandas数据帧并执行模型predict_proba函数:

代码语言:javascript复制
app = Flask(__name__)

CORS(app)

@app.route("/katana-ml/api/v1.0/diabetes", methods=['POST'])

def predict():

    payload = request.json['data']

    values = [float(i) for i in payload.split(',')]



    input_variables = pd.DataFrame([values],

                                columns=headers,

                                dtype=float,

                                index=['input'])

    # Get the model's prediction

    prediction_proba = model.predict_proba(input_variables)

    prediction = (prediction_proba[0])[1]



    ret = '{"prediction":'   str(float(prediction))   '}'



    return ret

# running REST interface, port=5000 for direct test

if __name__ == "__main__":

app.run(debug=False, host='0.0.0.0', port=5000)

响应JSON字符串被构造并作为函数结果返回。在Docker容器中运行Flask,这就是为什么使用0.0.0.0作为它运行的主机。端口5000被映射为外部端口,这允许来自外部的呼叫。

虽然它可以直接在Jupyter笔记本中启动Flask界面,但建议将其转换为Python脚本并从命令行作为服务运行。使用Jupyter nbconvert命令转换为Python脚本:

代码语言:javascript复制
jupyter nbconvert — to python diabetes_redsamurai_endpoint_db.ipynb

带有Flask端点的Python脚本可以作为PM2流程管理器的后台进程启动。这允许将端点作为服务运行并在不同端口上启动其他进程。PM2启动命令:

代码语言:javascript复制
pm2 start diabetes_redsamurai_endpoint_db.py

pm2 monit有助于显示有关正在运行的进程的信息:

ML模型分类从Postman到Flask服务的端点的REST API调用:

更多信息:

带源代码的GitHub

https://github.com/abaranovskis-redsamurai/automation-repo

以前关于XGBoost模型训练的帖子

https://bit.ly/2Hs38C5

0 人点赞