作者 | 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.predict和model.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