优秀的编程知识分享平台

网站首页 > 技术文章 正文

使用Flask,Docker和Google Cloud Platform部署机器学习模型

nanyue 2024-10-03 23:33:48 技术文章 4 ℃

机器学习最近变得非常流行,因此有很多在线资料教我们如何做机器学习,但我在学习了这些课程后意识到的一件事是,它们都让你在本地机器上训练机器学习模型。如果你正在阅读这篇文章,那么我猜你正面临着类似的情况。那么,如何让你的模型投入生产呢?你如何让你的目标受众从你建立的模型中做出预测?如果你正在寻找上述任何一个问题的答案,那么你就在正确的地方。继续阅读!

生产意味着什么?

生产意味着让您的应用程序在真实世界中被目标受众使用。这就是我们学习如何部署模型的重要原因。有一个非常好的模型藏在笔记本电脑的某个地方有什么用呢。我们的工作只有在我们为其建立的任何人,无论是企业还是普通大众从中获得价值时,它才有用。

生产中的模型有哪些要求?

现在我们已经了解了生产的意义,我们希望了解生产模型的一些要求。我要讨论其中的五个。

  1. 您的模型必须易于访问。Python几乎已经成为进行机器学习的实际编程语言,在本文中,我们将使用Python编写部署代码。当我们说我们的模型应该是容易访问的,我们的意思是,应用程序使用什么语言并不重要我们的模型是内置的,它应该能够很容易地从我们的模型做出预测。无论您的前端应用程序或面向用户的应用程序是用Java构建的移动应用程序还是用PHP/Javascript构建的web应用程序,它都应该能够从您的模型进行预测。
  2. 高性能。这只是意味着我们的模型应该能够尽快处理请求并返回响应。如果我们有实际用户与我们的应用程序交互,我们不希望他们等待太长时间从我们的模型中获得预测。
  3. 容错。能够承受错误应该是我们的模型应用的主要属性。如果应用程序的某些部分遇到错误,我们不希望整个系统继续执行。
  4. Scalablility。可伸缩性是软件架构中非常重要的主题,在部署机器学习模型时,我们还必须确保可伸缩性。这意味着,即使请求数量增加,我们的模型也应该能够保持其高性能。例如,如果一次响应一千个请求需要不到一秒的时间,那么当我们一次获得一百万个请求时,我们的模型应用程序也应该能够以相似的速率执行。
  5. 可维护性。这描述了在生产中维护我们的模型是多么容易。如果我们的模型有新版本,我们可以轻松地更换旧版本,而不会造成任何不必要的停机时间。

我们如何实现这一目标?

至于您一直在等待这部分,如何让我们的模型掌握在用户手中,并同时满足我们上面列出的所有需求。在这里,我们假设您已经在本地机器上构建并保存了模型。我们可以按照以下步骤部署模型;

  • 使用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。

Tags:

最近发表
标签列表