[譯] 使用 Python Flask 框架發佈機器學習 API

本文描述瞭如何經過 Python Flask REST API 向外界暴露機器學習模型。前端

Source: Pixabay

Flask 正如其官方網站所述,充滿樂趣且易於安裝。確實,這個 Python 的微框架提供了一種使用 REST 端點註釋 Python 函數的有效方式。目前我使用 Flask 發佈機器學習模型 API,以供第三方業務應用程序訪問。python

此示例基於 XGBoost。android

爲了更佳的代碼維護性,我建議使用一個單獨的 Jupyter notebook 發佈機器學習模型 API。導入 Flask 和 Flask CORS 模塊:ios

from flask import Flask, jsonify, request
from flask_cors import CORS, cross_origin

import pickle
import pandas as pd
複製代碼

該模型使用皮馬印第安人糖尿病數據集(Pima Indians Diabetes Database)訓練。CSV 數據能夠從這兒下載。要構建一個 Pandas 數據幀類型的變量來做爲模型預測函數的輸入,咱們須要定義一個包含數據集的列名的數組:git

# 獲取請求頭中的 payload
headers = ['times_pregnant', 'glucose', 'blood_pressure', 'skin_fold_thick', 'serum_insuling', 'mass_index', 'diabetes_pedigree', 'age']
複製代碼

使用 Pickle 加載預訓練模型:github

# 使用 Pickle 加載預訓練模型
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)的結果。最後使用一個示例 payload 構建 Pandas 數據幀,而後執行模型預測:json

# 用數據幀測試模型
input_variables = pd.DataFrame([[1, 106, 70, 28, 135, 34.2, 0.142, 22]],
                                columns=headers, 
                                dtype=float,
                                index=['input'])

# 獲取模型的預測結果
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)。從請求中獲取 payload 數據,接着是構造 Pandas 數據幀並執行模型 predict_proba 函數:flask

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'])

    # 獲取模型的預測結果
    prediction_proba = model.predict_proba(input_variables)
    prediction = (prediction_proba[0])[1]
    
    ret = '{"prediction":' + str(float(prediction)) + '}'
    
    return ret

# 運行 REST 接口,port=5000 用於直接測試
if __name__ == "__main__":
    app.run(debug=False, host='0.0.0.0', port=5000)
複製代碼

函數結果被構形成 JSON 字符串並做爲響應返回。我在 Docker 容器中運行 Flask,這就是爲何使用 0.0.0.0 做爲它運行的主機 IP。端口 5000 被映射爲外部端口,能夠容許來自外部的調用。後端

雖然直接在 Jupyter notebook 中啓動 Flask 接口也是可行的,但我仍是建議將其轉換爲 Python 腳本並做爲服務從命令行運行。使用 Jupyter nbconvert 命令將其轉換爲 Python 腳本:api

jupyter nbconvert — to python diabetes_redsamurai_endpoint_db.ipynb

Flask 程序能夠利用 PM2 進程管理器從後臺啓動。這種方式能夠將端點做爲服務啓動,而且能啓用多個運行在不一樣端口的進程(用於負載均衡)。PM2 啓動命令:

pm2 start diabetes_redsamurai_endpoint_db.py

pm2 monit 可以展現運行中的進程的信息:

用 Postman 調用 Flask 提供的機器學習分類模型 REST API:

更多信息:

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索