只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型


在生产环境中部署机器学习模型是数据工程中经常被忽视的领域。网上的大多数教程/博客都侧重于构建、训练和调整机器学习模型。如果它不能用于实际的预测,那么它又有什么用呢? 接下来了解一下有哪些部署选项吧:
评估选项
在生产中部署机器学习模型时,有多种选择。其中一种流行的方法是使用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存储库复制到本地计算机。 此存储库包含所有代码文件,可用作部署自定义模型的参考。

git clone git@github.com:EkramulHoque/docker-jenkins-flask-tutorial.git

注:虽然以上提到的步骤适用于Windows操作系统,但修改这些命令以在Mac或Unix系统上运行应该是很简单的。
训练和保存模型
在本例中,使用来自scikit-learn的鸢尾花数据集来构建我们的机器学习模型。在加载数据集后,提取用于模型训练的特征(x)和目标(y)。为了进行预测,先创建一个名为“labels”的字典,其中包含目标的标签名称,这里将决策树分类器用作模型。你可以在sklearn随意尝试其他分类器 ,通过调用模型上的方法来生成测试数据的预测标签。
我们使用pickle库将模型导出为pickle文件,并将模型保存在磁盘上。从文件加载模型后,我们将样本数据作为模型的输入并预测其目标变量。

#!/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 npapp = 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.txtWORKDIR /appRUN pip install -r requirements.txtCOPY . /appCMD 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。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刚发布!新型病毒下,程序员可在家免费学习了!

亲爱的CSDN家人们:疫情当前,这个春节有点“寒”。截止1月31号24时,新型冠状病毒在全国已确诊11791名(数字取自:人民日报8:40分发布信息),疑似病例已1w,受其影响,全国各地…

阿里巴巴的微服务开源之路

2019阿里云峰会北京开发者专场 侠之大者,为国为民。 在金庸小说中,郭靖和黄蓉是“侠之大者,为国为民”的典范,他们以布衣之身帮助宋军守护襄阳十余年。 技术的世界里,并无大小之分。 但当一群程序员由服务公司内部…

一文纵览自然语言生成的发展

人们对人工智能的兴趣随着科幻电影的诞生和发展变得愈发浓厚。每当我们听到“人工智能”这个词,便会联想到《终结者》、《黑客帝国》、《我,机器人》等电影。 机器人具有独立思考的能力在目前看来还比较遥远,但机器学习和自然语言理解领域已经…

java生成html表格数据_使用Java将表格数据导出成Excel格式

前言:本文使用后台处理的办法导出前端表格中显示的数据。引入依赖org.apache.poipoi3.17书写PoiUtilspublic classPoiUtils {public static ResponseEntity exportExcel(List marketList) throwsIOException {HttpHeaders headersnull;//创建文档HSSFWorkbook workb…

基于机器学习场景,如何搭建特征数据管理中台?

「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | 陈迪豪,第四范式资深架构师编辑 | Jane来源 | AI科技大本营(ID:rgznai100)一、机器学习场景与高性能特征管理中台理想的机器学习场景是给到数据&…

十年再出发!阿里云智能总裁张建锋演讲全记录

3月21日,“十年再出发”阿里云峰会于国家会议中心正式召开。阿里云智能总裁张建锋(行癫)携核心管理团队首次悉数亮相,并对阿里云做了全面的战略解读。以下是演讲全文。 张建锋:今天是我们阿里云智能升级之后第一次和大…

java简单题目_Java考点知识简单练习题

Java考点知识简单练习题Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。下面是小编为大家搜索整理的java考试强化训练题&#xff0c…

抗疫进展:多家科研机构联合筛选出五种可能有效的抗病毒药物

2月3日,华中科技大学同济医学院基础医学院、华中科技大学同济医学院附属武汉儿童医院、西安交通大学第一附属医院、中科院北京基因组研究所、华为云联合科研团队宣布,筛选出五种可能对2019新型冠状病毒(2019-nCoV)有效的抗病毒药物…

GAN的一些很酷的应用

在GAN发展的最初几年里,我们取得了令人瞩目的进展。当然,现在不会是像恐怖电影里那样有邮票大小的面部照片了。2017年,Gan制作了10241024张能愚弄人才童子军的照片。在未来几年,我们可能会看到GAN生成的高质量视频,由此…

java项目短信群发接口_JAVA实现第三方短信发送过程详解

想使代码生效需要注册:在muven项目里面导入jar包commons-codeccommons-codec1.4commons-httpclientcommons-httpclient3.1commons-loggingcommons-logging1.1.1org.apache.httpcomponentshttpclient4.3.1com.alibabadruid1.0.8com.alibabadruid1.0.8创建一个测试类&…

两亿人在家开会!钉钉紧急扩容1万台云服务器

2月3日是一个特殊的开工日,为防范疫情,在阿里巴巴钉钉上有超过1000万家企业组织的2亿上班族在线开工。为支持此次史无前例的办公需求,钉钉在阿里云上紧急扩容1万台云服务器来保障钉钉视频会议、群直播、办公协同等功能,保障用户流…

这些数据科学家必备的技能,你拥有哪些?

1.教育背景 88%的数据科学家受过高等教育且拥有硕士学位,其中46%拥有博士学位。虽然有些人是例外,但通常需要非常强大的教育背景才能拥有成为数据科学家所必需的知识深度。要想成为数据科学家,你可以先获得计算机科学、…

阿里敏捷教练:多团队开发一个产品的组织设计和思考

Scrum等敏捷开发框架,最初都是为5到9人的小团队设计的。通过保持专注和合理利用新技术,在相当长的时间里小团队仍然可以支撑业务发展。 随着业务成长,小团队的产出可能跟不上业务需要,团队就会面临规模化的问题。从1个团队拓展到…

10个你应该了解的Git命令(以及Git省时小窍门)

在本文中,我们将讨论那些作为开发人员、数据科学家或产品经理应该知道的各种各样的Git命令。并且将使用Git查看、删除和整理。此外,我们还将介绍如何使用Bash别名和Git编辑器配置转义Vim和节省时间的方法。 如果你不熟悉基本的git命令,那么在…

阿里工程师开发了一款免费工具,提升Kubernetes应用开发效率

对于使用了Kubernetes作为应用运行环境的开发者而言,在同一个集群中我们可以使用命名空间(Namespace)快速创建多套隔离环境,在相同命名空间下,服务间使用Service的内部DNS域名进行相互访问。 基于Kubernetes强大的隔离…

mongodb java spring_[Java教程]Spring 与 mongoDB 整合

[Java教程]Spring 与 mongoDB 整合02017-02-07 00:00:39首先需要引入jar包1 2 org.mongodb 3 mongodb-driver 4 3.3.0 5 6 7 org.springframework.data 8 spring-data-mongodb 9 1.9.4.RELEASE10 View Codespring中注入对象org.springframework.data.mongodb.core.MongoTemplat…

魔幻!过年在家,Java和Python程序员比工资打起来了...

Python真的野蛮生长到不行了?最近,笔者在某网站刷到一条信息,两个程序员在家比工资,竟然打起来了!原因就是从事5年开发的Java程序员竟然工资输给了工作仅2年的Python程序员!从上图招聘情况来了,…

Jmeter常用插件——梯度加压、响应时间、TPS_老版本

一、Jmeter梯度加压的jar Stepping Thread Group,下载方法如下: 1.访问网网站 https://jmeter-plugins.org/downloads/old/ 2.下载插件: 2.3.下载后需要解压 然后将JMeterPlugins-Standard.jar包放在jmeter安装目录的jmeter-3.0\lib\ext…

图解梯度下降背后的数学原理

敏捷在软件开发过程中是一个非常著名的术语,它背后的基本思想很简单:快速构建一些东西,然后得到一些反馈,根据反馈做出改变,重复此过程。目标是让产品更贴合用,让用户做出反馈,以获得设计开发出…

mysql数据迁移neo4j_neo4j数据库迁移---------Neo4j数据库导入导出的方法

Neo4j数据进行备份、还原、迁移的操作时,首先要关闭neo4j;/usr/share/neo4j/binneo4j stop如果出现Neo4j not running出现这种情况, Neo4j没有运行, 但是浏览器仍然可以访问neo4j数据库的情况, 直接执行导入数据后,是无法看到导入的数据库,其实这种情况下Neo4j仍在运…