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

简介: 一杯茶的功夫部署完成机器学习模型!

1_jpeg
在生产环境中部署机器学习模型是数据工程中经常被忽视的领域。网上的大多数教程/博客都侧重于构建、训练和调整机器学习模型。如果它不能用于实际的预测,那么它又有什么用呢? 接下来了解一下有哪些部署选项吧:
评估选项
在生产中部署机器学习模型时,有多种选择。其中一种流行的方法是使用Azure Machine Learning Studio等云服务设计和训练模型,这些服务具有使用拖放工具构建和训练模型的能力。此外,将这些模型作为Web服务发布只需点击几下即可。此类设置的附加优势在于,该部署会随着应用程序使用量的增加而自动扩展。
虽然短时间看起来很方便,但从长远来看,这种设置可能会有问题。当我们想要将应用程序从第三方云平台迁移并将其部署在我们的服务器上时,就有难度了。由于这些工具与其各自的云平台紧密集成,因此这种设置不可移植。此外,随着应用程序的扩展,云计算的成本可能是一个令人望而却步的因素。
2_jpeg
如果我们构建自定义REST-API作为机器学习模型的终点,则可以避免这些问题。特别是,本文将使用基于Python的Flask Web框架来为模型构建API,然后将这个flask应用程序整齐地集成到Docker映像中来进行部署。Docker显然适合解决这个问题,因为应用程序的所有依赖项都可以打包在容器中,并且可以通过必要时刻简单地部署更多容器来实现可伸缩性。这种部署架构本质上是可扩展的、成本有效的和便携的。
3_jpeg
Docker:Docker是一种开源的容器化技术,允许开发人员将应用程序与依赖库打包在一起,并将其与底层操作系统隔离开来。与VM不同,docker不需要每个应用程序的Guest虚拟机操作系统,因此可以维护轻量级资源管理系统。与容器相比,虚拟机更重量级,因此容器可以相对快速地旋转,同时具有较低的内存占用,这有助于将来我们的应用程序和模型的可伸缩性。
4_jpeg
Jenkins:Jenkins可能是最受欢迎的持续集成和持续交付工具,大约拥有1400个插件,可自动构建和部署项目。Jenkins提供了一个在其管道中添加GitHub web-hook的规定,这样每次开发人员将更改推送到GitHub存储库时,它都会自动开始为修改后的模型运行验证测试,并构建docker镜像来进行部署。
ngrok:ngrok是一个免费工具,可将公共URL传送到本地运行的应用程序它会生成一个可以在GitHub web-hook中用于触发推送事件的URL。
Flask:Flask是一个用Python编写的开源Web框架,内置开发服务器和调试器。虽然有许多可以替代Web框架来创建REST API,但Flask的简单性备受青睐。
部署
你可能想知道“我进入了什么样的环状土地?”但我保证接下来的步骤将变得简单实用。到目前为止,我们已经了解了部署体系结构中的不同组件以及每个组件的功能的简要说明。在本节中,将介绍部署模型的详细步骤。
5_jpeg
部署过程可以暂时分为四个部分:构建和保存模型、使用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 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

工作目录现包含以下文件:
•model.py用于训练和构建模型;
•server.py来管理请求和服务器;
•Dockerfile包含docker镜像的说明;
•requirements.txt包含API所需的库;
持续集成
到目前为止,我们已经创建了Flask API,完成了一个Dockerfile并将项目推送到git存储库中。作为先决条件,需要安装这3个应用程序--Docker,Ngrok和Jenkins。本节中的视频将演示之前在架构图中提到的整个过程。
结论
在这篇博客中,我们深入研究了使用Docker,Flask和Jenkins部署机器学习模型的过程。 我们希望对你在生产中部署自己的机器学习模型时有所帮助。可以在此处找到本文中提供的代码的GitHub。
本文由阿里云云栖社区组织翻译。
文章原标题《machine-learning-deployment-a-storm-in-a-teacup》作者:Ekramul Hoque
译者:乌拉乌拉,审校:袁虎。
文章为简译,更为详细的内容,请查看原文

相关文章
|
14天前
|
机器学习/深度学习 人工智能 分布式计算
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
本次教程介绍了如何使用 PAI 和 LLaMA Factory 框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
|
23天前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
65 3
|
1天前
|
机器学习/深度学习 算法 知识图谱
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
|
1天前
|
机器学习/深度学习 算法 数据挖掘
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
|
18天前
|
机器学习/深度学习 数据可视化 JavaScript
探索机器学习模型的可视化技术
【9月更文挑战第23天】在数据科学中,理解和解释机器学习模型的决策过程是至关重要的。本文将介绍几种流行的可视化工具和库,如TensorBoard、D3.js等,帮助读者更好地理解模型内部工作原理及其预测结果。通过实例演示如何使用这些工具进行模型可视化,增强模型的可解释性。
|
1月前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习模型之深度神经网络的特点
深度神经网络(Deep Neural Networks, DNNs)是一类机器学习模型,通过多个层级(层)的神经元来模拟人脑的工作方式,从而实现复杂的数据处理和模式识别任务。
36 1
|
1月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
1月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
187 1
|
23天前
|
机器学习/深度学习 数据采集 算法
机器学习新纪元:用Scikit-learn驾驭Python,精准模型选择全攻略!
在数据爆炸时代,机器学习成为挖掘数据价值的关键技术,而Scikit-learn作为Python中最受欢迎的机器学习库之一,凭借其丰富的算法集、简洁的API和高效性能,引领着机器学习的新纪元。本文通过一个实际案例——识别垃圾邮件,展示了如何使用Scikit-learn进行精准模型选择。从数据预处理、模型训练到交叉验证和性能比较,最后选择最优模型进行部署,详细介绍了每一步的操作方法。通过这个过程,我们不仅可以看到如何利用Scikit-learn的强大功能,还能了解到模型选择与优化的重要性。希望本文能为你的机器学习之旅提供有价值的参考。
30 0