摘要:一杯茶的功夫部署完成机器学习模型!
在生产环境中部署机器学习模型是数据工程中经常被忽视的领域。网上的大多数教程 / 博客都侧重于构建、训练和调整机器学习模型。如果它不能用于实际的预测,那么它又有什么用呢?接下来了解一下有哪些部署选项吧:
评估选项
在生产中部署机器学习模型时,有多种选择。其中一种流行的方法是使用 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 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。
本文作者:【方向】阅读原文
本文为云栖社区原创内容,未经允许不得转载。