摘要: 一杯茶的功夫部署完成机器学习模型!
在生产环境中部署机器学习模型是数据工程中常常被忽视的领域。网上的大多数教程/博客都侧重于构建、训练和调整机器学习模型。若是它不能用于实际的预测,那么它又有什么用呢? 接下来了解一下有哪些部署选项吧:python
在生产中部署机器学习模型时,有多种选择。其中一种流行的方法是使用Azure Machine Learning Studio等云服务设计和训练模型,这些服务具备使用拖放工具构建和训练模型的能力。此外,将这些模型做为Web服务发布只需点击几下便可。此类设置的附加优点在于,该部署会随着应用程序使用量的增长而自动扩展。
虽然短期看起来很方便,但从长远来看,这种设置可能会有问题。当咱们想要将应用程序从第三方云平台迁移并将其部署在咱们的服务器上时,就有难度了。因为这些工具与其各自的云平台紧密集成,所以这种设置不可移植。此外,随着应用程序的扩展,云计算的成本多是一个使人望而却步的因素。git
若是咱们构建自定义REST-API做为机器学习模型的终点,则能够避免这些问题。特别是,本文将使用基于Python的Flask Web框架来为模型构建API,而后将这个flask应用程序整齐地集成到Docker映像中来进行部署。Docker显然适合解决这个问题,由于应用程序的全部依赖项均可以打包在容器中,而且能够经过必要时刻简单地部署更多容器来实现可伸缩性。这种部署架构本质上是可扩展的、成本有效的和便携的。github
Docker:Docker是一种开源的容器化技术,容许开发人员将应用程序与依赖库打包在一块儿,并将其与底层操做系统隔离开来。与VM不一样,docker不须要每一个应用程序的Guest虚拟机操做系统,所以能够维护轻量级资源管理系统。与容器相比,虚拟机更重量级,所以容器能够相对快速地旋转,同时具备较低的内存占用,这有助于未来咱们的应用程序和模型的可伸缩性。web
Jenkins:Jenkins多是最受欢迎的持续集成和持续交付工具,大约拥有1400个插件,可自动构建和部署项目。Jenkins提供了一个在其管道中添加GitHub web-hook的规定,这样每次开发人员将更改推送到GitHub存储库时,它都会自动开始为修改后的模型运行验证测试,并构建docker镜像来进行部署。
ngrok:ngrok是一个免费工具,可将公共URL传送到本地运行的应用程序它会生成一个能够在GitHub web-hook中用于触发推送事件的URL。
Flask:Flask是一个用Python编写的开源Web框架,内置开发服务器和调试器。虽然有许多能够替代Web框架来建立REST API,但Flask的简单性备受青睐。docker
你可能想知道“我进入了什么样的环状土地?”但我保证接下来的步骤将变得简单实用。到目前为止,咱们已经了解了部署体系结构中的不一样组件以及每一个组件的功能的简要说明。在本节中,将介绍部署模型的详细步骤。json
部署过程能够暂时分为四个部分:构建和保存模型、使用REST API公开模型,将模型打包在容器内以及配置持续集成工具。
在继续下一步以前,使用如下命令将GitHub存储库复制到本地计算机。 此存储库包含全部代码文件,可用做部署自定义模型的参考。flask
git clone git@github.com:EkramulHoque/docker-jenkins-flask-tutorial.git
注:虽然以上提到的步骤适用于Windows操做系统,但修改这些命令以在Mac或Unix系统上运行应该是很简单的。ubuntu
在本例中,使用来自scikit-learn的鸢尾花数据集来构建咱们的机器学习模型。在加载数据集后,提取用于模型训练的特征(x)和目标(y)。为了进行预测,先建立一个名为“labels”的字典,其中包含目标的标签名称,这里将决策树分类器用做模型。你能够在sklearn随意尝试其余分类器 ,经过调用模型上的方法来生成测试数据的预测标签。
咱们使用pickle库将模型导出为pickle文件,并将模型保存在磁盘上。从文件加载模型后,咱们将样本数据做为模型的输入并预测其目标变量。api
#!/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配置设置中查看更多相关信息。
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”,不带后缀或前缀。
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
工做目录现包含如下文件:
到目前为止,咱们已经建立了Flask API,完成了一个Dockerfile并将项目推送到git存储库中。做为先决条件,须要安装这3个应用程序--Docker,Ngrok和Jenkins。本节中的视频将演示以前在架构图中提到的整个过程。
在这篇博客中,咱们深刻研究了使用Docker,Flask和Jenkins部署机器学习模型的过程。 咱们但愿对你在生产中部署本身的机器学习模型时有所帮助。能够在此处找到本文中提供的代码的GitHub。
本文为云栖社区原创内容,未经容许不得转载。