- 原文地址:Publishing Machine Learning API with Python Flask
- 原文做者:Andrejus Baranovskis
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:sisibeloved
- 校對者:alictopo,zhmhhu
本文描述瞭如何經過 Python Flask REST API 向外界暴露機器學習模型。前端
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.predict 和 model.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 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。