在生產環境中部署機器學習模型是數據工程中常常被忽視的領域。網上的大多數教程/博客都側重於構建、訓練和調整機器學習模型。若是它不能用於實際的預測,那麼它又有什麼用呢? 接下來了解一下有哪些部署選項吧:
評估選項
在生產中部署機器學習模型時,有多種選擇。其中一種流行的方法是使用Azure Machine Learning Studio等雲服務設計和訓練模型,這些服務具備使用拖放工具構建和訓練模型的能力。此外,將這些模型做爲Web服務發佈只需點擊幾下便可。此類設置的附加優點在於,該部署會隨着應用程序使用量的增長而自動擴展。
雖然短期看起來很方便,但從長遠來看,這種設置可能會有問題。當咱們想要將應用程序從第三方雲平臺遷移並將其部署在咱們的服務器上時,就有難度了。因爲這些工具與其各自的雲平臺緊密集成,所以這種設置不可移植。此外,隨着應用程序的擴展,雲計算的成本多是一個使人望而卻步的因素。
若是咱們構建自定義REST-API做爲機器學習模型的終點,則能夠避免這些問題。特別是,本文將使用基於Python的Flask Web框架來爲模型構建API,而後將這個flask應用程序整齊地集成到Docker映像中來進行部署。Docker顯然適合解決這個問題,由於應用程序的全部依賴項均可以打包在容器中,而且能夠經過必要時刻簡單地部署更多容器來實現可伸縮性。這種部署架構本質上是可擴展的、成本有效的和便攜的。
Docker:Docker是一種開源的容器化技術,容許開發人員將應用程序與依賴庫打包在一塊兒,並將其與底層操做系統隔離開來。與VM不一樣,docker不須要每一個應用程序的Guest虛擬機操做系統,所以能夠維護輕量級資源管理系統。與容器相比,虛擬機更重量級,所以容器能夠相對快速地旋轉,同時具備較低的內存佔用,這有助於未來咱們的應用程序和模型的可伸縮性。
Jenkins:Jenkins多是最受歡迎的持續集成和持續交付工具,大約擁有1400個插件,可自動構建和部署項目。Jenkins提供了一個在其管道中添加GitHub web-hook的規定,這樣每次開發人員將更改推送到GitHub存儲庫時,它都會自動開始爲修改後的模型運行驗證測試,並構建docker鏡像來進行部署。
ngrok:ngrok是一個免費工具,可將公共URL傳送到本地運行的應用程序它會生成一個能夠在GitHub web-hook中用於觸發推送事件的URL。
Flask:Flask是一個用Python編寫的開源Web框架,內置開發服務器和調試器。雖然有許多能夠替代Web框架來建立REST API,但Flask的簡單性備受青睞。
部署
你可能想知道「我進入了什麼樣的環狀土地?」但我保證接下來的步驟將變得簡單實用。到目前爲止,咱們已經瞭解了部署體系結構中的不一樣組件以及每一個組件的功能的簡要說明。在本節中,將介紹部署模型的詳細步驟。
部署過程能夠暫時分爲四個部分:構建和保存模型、使用REST API公開模型,將模型打包在容器內以及配置持續集成工具。
在繼續下一步以前,使用如下命令將GitHub存儲庫複製到本地計算機。 此存儲庫包含全部代碼文件,可用做部署自定義模型的參考。python
git clone git@github.com:EkramulHoque/docker-jenkins-flask-tutorial.git
注:雖然以上提到的步驟適用於Windows操做系統,但修改這些命令以在Mac或Unix系統上運行應該是很簡單的。
訓練和保存模型
在本例中,使用來自scikit-learn的鳶尾花數據集來構建咱們的機器學習模型。在加載數據集後,提取用於模型訓練的特徵(x)和目標(y)。爲了進行預測,先建立一個名爲「labels」的字典,其中包含目標的標籤名稱,這裏將決策樹分類器用做模型。你能夠在sklearn隨意嘗試其餘分類器 ,經過調用模型上的方法來生成測試數據的預測標籤。
咱們使用pickle庫將模型導出爲pickle文件,並將模型保存在磁盤上。從文件加載模型後,咱們將樣本數據做爲模型的輸入並預測其目標變量。git
#!/usr/bin/env python # coding: utf-8 import pickle from sklearn import datasets iris=datasets.load_iris() x=iris.data y=iris.target #labels for iris dataset labels ={ 0: "setosa", 1: "versicolor", 2: "virginica" } #split the data set from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.5) #Using decision tree algorithm from sklearn import tree classifier=tree.DecisionTreeClassifier() classifier.fit(x_train,y_train) predictions=classifier.predict(x_test) #export the model pickle.dump(classifier, open('model.pkl','wb')) #load the model and test with a custom input model = pickle.load( open('model.pkl','rb')) x = [[6.7, 3.3, 5.7, 2.1]] predict = model.predict(x) print(labels[predict[0]])
構建REST API:
Flask web框架幫助咱們建立與模型通訊所需的HTTP端點,咱們使用pickle.load()方法從磁盤讀取保存的模型。
Flask提供了一個route()裝飾器,它告訴應用程序哪一個URL應該調用相關的函數。它接受2個參數,即「rule」和「options」。 'rule'參數表示綁定到函數的URL,'options'是要轉發到Rule對象的參數列表。
在示例中,'/ api'URL綁定到predict()函數。所以,當咱們發出POST請求時,它會調用以JSON格式接收特徵向量的函數。而後將「特徵」向量傳遞到模型中,該模型對」特徵」向量進行預測,而後以JSON格式返回標籤。
請注意,Flask類的run()方法是在本地開發服務器上運行應用程序。在這裏,將主機傳遞爲'0.0.0.0',以便在docker容器中公開它。你能夠在docker配置設置中查看更多相關信息。github
from flask import Flask, request, jsonify import json import pickle import pandas as pd import numpy as np app = Flask(__name__) # Load the model model = pickle.load(open('model.pkl','rb')) labels ={ 0: "versicolor", 1: "setosa", 2: "virginica" } @app.route('/api',methods=['POST']) def predict(): # Get the data from the POST request. data = request.get_json(force=True) predict = model.predict(data['feature']) return jsonify(predict[0].tolist()) if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
打包
爲了容許Docker託管咱們的API,咱們須要指定一組容許Docker構建映像的指令。這組指令能夠保存在Dockerfile中,該文件包含了可在命令行上調用來建立Docker鏡像的全部命令。
如今開始建立Dockerfile,先打開文本編輯器並將其另存爲「Dockerfile」,不帶後綴或前綴。web
FROM ubuntu:16.04 FROM python:3.6.5 RUN apt-get update -y && \ apt-get install -y python-pip python-dev # We copy just the requirements.txt first to leverage Docker cache COPY ./requirements.txt /app/requirements.txt WORKDIR /app RUN pip install -r requirements.txt COPY . /app CMD python /app/model.py && python /app/server.py
工做目錄現包含如下文件:
•model.py用於訓練和構建模型;
•server.py來管理請求和服務器;
•Dockerfile包含docker鏡像的說明;
•requirements.txt包含API所需的庫;
持續集成
到目前爲止,咱們已經建立了Flask API,完成了一個Dockerfile並將項目推送到git存儲庫中。做爲先決條件,須要安裝這3個應用程序--Docker,Ngrok和Jenkins。本節中的視頻將演示以前在架構圖中提到的整個過程。
結論
在這篇博客中,咱們深刻研究了使用Docker,Flask和Jenkins部署機器學習模型的過程。 咱們但願對你在生產中部署本身的機器學習模型時有所幫助。能夠在此處找到本文中提供的代碼的GitHub。docker
原文連接
本文爲雲棲社區原創內容,未經容許不得轉載。json