网站首页 > 技术文章 正文
机器学习最近变得非常流行,因此有很多在线资料教我们如何做机器学习,但我在学习了这些课程后意识到的一件事是,它们都让你在本地机器上训练机器学习模型。如果你正在阅读这篇文章,那么我猜你正面临着类似的情况。那么,如何让你的模型投入生产呢?你如何让你的目标受众从你建立的模型中做出预测?如果你正在寻找上述任何一个问题的答案,那么你就在正确的地方。继续阅读!
生产意味着什么?
生产意味着让您的应用程序在真实世界中被目标受众使用。这就是我们学习如何部署模型的重要原因。有一个非常好的模型藏在笔记本电脑的某个地方有什么用呢。我们的工作只有在我们为其建立的任何人,无论是企业还是普通大众从中获得价值时,它才有用。
生产中的模型有哪些要求?
现在我们已经了解了生产的意义,我们希望了解生产模型的一些要求。我要讨论其中的五个。
- 您的模型必须易于访问。Python几乎已经成为进行机器学习的实际编程语言,在本文中,我们将使用Python编写部署代码。当我们说我们的模型应该是容易访问的,我们的意思是,应用程序使用什么语言并不重要我们的模型是内置的,它应该能够很容易地从我们的模型做出预测。无论您的前端应用程序或面向用户的应用程序是用Java构建的移动应用程序还是用PHP/Javascript构建的web应用程序,它都应该能够从您的模型进行预测。
- 高性能。这只是意味着我们的模型应该能够尽快处理请求并返回响应。如果我们有实际用户与我们的应用程序交互,我们不希望他们等待太长时间从我们的模型中获得预测。
- 容错。能够承受错误应该是我们的模型应用的主要属性。如果应用程序的某些部分遇到错误,我们不希望整个系统继续执行。
- Scalablility。可伸缩性是软件架构中非常重要的主题,在部署机器学习模型时,我们还必须确保可伸缩性。这意味着,即使请求数量增加,我们的模型也应该能够保持其高性能。例如,如果一次响应一千个请求需要不到一秒的时间,那么当我们一次获得一百万个请求时,我们的模型应用程序也应该能够以相似的速率执行。
- 可维护性。这描述了在生产中维护我们的模型是多么容易。如果我们的模型有新版本,我们可以轻松地更换旧版本,而不会造成任何不必要的停机时间。
我们如何实现这一目标?
至于您一直在等待这部分,如何让我们的模型掌握在用户手中,并同时满足我们上面列出的所有需求。在这里,我们假设您已经在本地机器上构建并保存了模型。我们可以按照以下步骤部署模型;
- 使用Flask为您的模型打包一个restful web服务。这使得它易于访问
- 使用docker容纳您的Web服务。这可以确保容错,因为如果发生故障,我们可以非常快速地启动新容器。
- 将模型部署到kubernetes集群中以确保可伸缩性。
- 将您的模型保存在Google云端存储分区中,以便您可以使用较新版本轻松替换旧型号。
让我们一个接一个地接受它。
使用Flask进行Web服务
Flask是python web开发的微框架。它非常轻巧,只允许您使用应用程序所需的内容。我们将使用flask来构建我们的restful web服务。下面是一个简单的flask 应用程序,它将我们的模型加载到内存中,使用我们的模型进行预测并返回预测JSON对象。
from flask import Flask, request, jsnofiy
import utils
app = Flask(__name__)
model = utils.load_model("<path_to_model>")
@app.route('/predict', methods=['POST'])
def predict():
if request.method == 'POST':
data = request.data['input']
model_input = utils.preprocessing(data)
results = model.predict(model_input)
return jsonify({"prediction": results})
在上面的示例代码中,我们使用utils模块中定义的load_model函数创建flask app实例,以将模型加载到内存中。请注意,我们不会在请求处理程序中加载我们的模型。这将有助于减少延迟,因为我们不必在每次收到请求时加载模型。另请注意,flask 的内置服务器不适合生产,因为它不能很好地扩展。您需要使用WSGI服务器来运行烧瓶应用程序。例如。gunicorn,uwsgi
使用Dcoker进行容器化Web服务
Docker是一个应用程序,它允许您将应用程序打包到具有所有依赖项的容器中,以便您可以在任何位置运行它们。在此过程中使用docker的优势在于确保我们的应用程序以其希望工作的方式工作,通过在我们获得更多请求时启动新容器来确保可伸缩性,并通过能够使用新容器替换故障容器来保持容错性没时间。
您可以通过向应用程序文件夹中添加Dockerfile来dockerize您的应用程序。通常它被放在你的应用程序的父目录中,但是你可以把它放在你的应用程序的任何地方。dockerfile的内容可以如下面的代码所示
# Pull Base Image
FROM ubuntu:16.04
# copy code into image and set as working directory
COPY . /application
WORKDIR /application
# install dependencies
RUN sudo apt-get -y update && \
pip install pipenv && \
pipenv install --system --deploy
EXPOSE 5000
ENTRYPONIT ["gunicorn"]
CMD ["server:app"]
在上面的dockerfile中,我们使用ubuntu 16.04作为基本映像,然后将当前目录的内容复制到映像中的“/ application”目录中。如果该位置不存在,将自动创建。然后,我们将“/ application”目录设置为我们的工作目录。这意味着,我们在图像中运行的所有命令都将从该位置运行。我们继续使用RUN命令来安装我们的依赖项,然后我们使用gunicorn在名为server.py的模块中启动我们的应用程序。我们的Dockerfile准备就绪后,我们使用以下命令构建映像
docker build -t <image_name> <path_to_dockerfile>
部署使用Kubernetes
在构建映像之后,现在是部署映像的时候了。我们将使用谷歌云平台上的一项服务,该服务允许您部署和管理名为Kubernetes的容器(运行docker映像)。它是一个非常强大的工具,可以自动化我们需求的某些方面,比如扩展和维护容错能力。要使用kubernetes部署映像,我们将使用以下步骤,
1.将docker映像推到谷歌容器注册表
gcloud docker --push gcr.io/<your-project-id>/<image-name>
2、在谷歌云平台上创建一个容器cluster
gcloud container clusters create <cluster-name> --num-nodes=3
3.在我们刚刚创建的cluster中运行应用程序映像
kubectl run <deployment_name> --image=<your_image_in_container_registry> --port 8080
4.将应用程序暴露在互联网上
kubectl expose <deployment_name> --type=LoadBalancer --port 80 --target-port 8080
结论
遵循这些步骤可以帮助您将模型投入生产,是的,但是在本文中,我假设您已经在计算机上安装了docker、gcloud和kubernetes。
猜你喜欢
- 2024-10-03 不改一行代码!快速部署流行框架到腾讯云 Serverless
- 2024-10-03 Flask 基础理解(flask基础入门)
- 2024-10-03 AI界最危险武器GPT-2使用指南:从Finetune到部署
- 2024-10-03 解决Flask-SocketIO部署遇到的问题
- 2024-10-03 Python Web 部署(pythonweb服务器部署)
- 2024-10-03 Python Flask 大型应用的架构(python的flask案例)
- 2024-10-03 python 解析二维码(ZBar) flask开发 Dockerfile 打包部署
- 2024-10-03 使用Docker部署Python Flask Web应用的最佳实践
- 2024-10-03 带你认识 flask 错误处理(flask errorhandler)
- 2024-10-03 使用 Python 和 Flask 架设网站:入门指南
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)