Kubernetes与机器学习模型部署

在数据科学家或机器学习工程师的工作中,解决商业问题的一个方案是通过开发模型来实现的。模型开发过程会经历多次迭代,最终,一个在测试数据上表现良好的模型会被部署到生产环境中。将最终选定的模型推向用户的过程称为部署,有几种不同的部署模型的选项。Kubernetes(也称为k8s)是一个开源工具,用于部署应用程序。K8s与AWS、Google、Microsoft等云服务提供商的服务一起使用,可以用于部署机器学习模型。众所周知,Netflix、Spotify和Adidas等公司都选择这种方式来部署他们的应用程序。在这篇面向初学者的博客中,将探讨如何将机器学习应用容器化,并使用Kubernetes服务在本地机器上进行部署。

Docker容器与Kubernetes

Docker是一个软件工具,它帮助高效地构建和部署应用程序。想象一下,试图在服务器上托管应用程序,这些应用程序由三位不同的开发人员使用三个版本的Python开发。在这种情况下,可以使用Docker,因为它提供了三个隔离的环境,包含应用程序及其依赖项。Docker容器类似于运输行业中用于运输货物的集装箱,为运输中的货物提供隔离的环境。与Docker相关,Docker镜像是一个只读文件,包含应用程序及其依赖项(类似于蓝图),而Docker容器是一个运行中的镜像(可以使用一个镜像运行多个容器)。

了解了Docker之后,来理解一下Kubernetes是什么。Kubernetes是一个开源软件工具,可以用于无需人工干预地管理容器化应用程序。Kubernetes的过程类似于如何指挥一个音乐管弦乐队。可以将管弦乐队中的乐器视为同时运行的多个容器,并说Kubernetes有一个文件,包含有关使用的容器以及它们如何工作和相互交互的详细说明。因此,Kubernetes自动化了运行容器的整个过程,无需专门的团队监控操作。

不可能在这篇博客中详细讨论Kubernetes的架构和功能,但有大量的资源可以提供丰富的内容。然而,为了理解部署的整体过程,将涉及一些简要的领域。一个完整的Kubernetes系统,包含所有Kubernetes组件,称为集群,可以在物理机器或虚拟机(VM)上运行。

Kubernetes的简化架构包括控制平面和节点(也称为计算机器)。节点(一个集群中可以有多个节点)能够运行在物理机器或VM上。节点还包含Pod,这些Pod是围绕容器的包装。控制平面负责控制集群组件,并且包含感兴趣的对象,称为API服务器。API服务器是控制平面的前端(网关),可以通过API服务器访问Pod、服务、节点等。在本文中,将使用Kubectl作为执行Kubernetes集群操作的工具。

手头的问题

当前案例的工作范围是开发一个解决方案,预测学生是否会在校园招聘计划中获得职位。学生的职位取决于多种因素,如他们在学校和学院的表现、工作经验等。包括中学和高中的百分比和专业。

为了简化当前案例,将在k8s上部署一个容器以实现部署部分。这篇博客的主要关注领域是K8s,花费时间在整体开发过程的初始步骤上将冲淡内容,使这篇文章变得冗长。读者可以自由浏览GitHub仓库(放在参考中),包含代码以查看初始开发阶段。使用mac机器来演示部署,根据用于开发和部署的机器类型,代码可能会有轻微变化,在遇到困难的情况下,建议寻求像stackoverflow.com等在线社区的帮助。

初始活动的顺序如下:

  1. 开发一个机器学习模型,预测具有给定属性的候选人是否会在校园招聘中获得职位。开发的模型(随机森林)在测试集上的准确率为96%。使用了Dictvectorizer()对分类特征进行编码,并在模型构建结束时,使用pickle库创建了模型和编码的二进制形式作为Jupyter Notebook的输出。
  2. 在下一步中,使用pipenv在vs code中创建了一个虚拟项目环境,并创建了一个predict.py,该文件使用flask框架和带有dictvectorizer和模型的二进制文件来创建一个API,供用户与模型交互并传递候选人的特征以进行预测。所需的库如scikit-learn、numpy、flask等都是使用pipenv在虚拟环境中安装的,结果文件Pipfile和Pipfile.lock保存了项目的依赖项详细信息。flask应用程序使用一个测试文件predict-test.py在本地进行了测试,该文件具有用于测试应用程序的样本特征。
  3. 使用上述文件,创建了一个Dockerfile,使用python基础镜像准备Docker镜像并从中运行容器。Docker镜像被推送到https://hub.docker.com/上的公共仓库。

部署演练

Docker镜像从https://hub.docker.com/形成本演示的起点,可以从这一点开始部署。开始此练习的先决条件是安装Docker-Desktop。安装Docker-Desktop后,在设置中启用Kubernetes。首先,使用命令检查Docker安装:

docker –version

从https://hub.docker.com/拉取镜像:

$ docker pull subbu0319/placement-app

一旦镜像被拉取,检查本地机器上的镜像:

$ docker images

将更改placement-app镜像的标签,给镜像打上v1的标签(默认是latest):

$ docker image tag placement-app:latest placement-app:v1

使用上述镜像运行Docker容器:

$ docker run -it –rm -p 9696:9696 placement-app:v1

使用像vs-code这样的编辑器创建一个python脚本predict-test.py,其中包含用于预测的样本特征。

#predict-test.py import requests candidate = [{"gender": "M", "ssc_p": 71.0, "ssc_b": 'Central', "hsc_p": 58.66, "hsc_b": 'Central', "hsc_s": 'Science', "degree_p": 58.0, "degree_t": 'Sci&Tech', "etest_p": 56.0, "mba_p": 61.3, "specialisation": 'Mkt&Fin', "workex": 'Yes', }] url = "http://localhost:9696/predict" print(f'Candidate features have been evaluated and output is {requests.post(url=url,json=candidate).json()}')

一旦确认容器运行良好,打开另一个终端并运行python脚本predict-test.py:

$ python predict-test.py

如果看到上面的输出,可以看到容器在本地环境中运行良好。模型预测给定候选人的就业概率约为90%。现在将使用Kubernetes在本地环境中部署容器。将使用minikube运行k8s集群,并使用kubectl与集群交互并运行命令。

Minikube是一个实用工具,可以在本地机器上运行Kubernetes。它在虚拟机(VM)中创建一个单节点集群。这种设置有助于演示k8s操作,而无需花费时间和资源消耗整个k8s。安装minikube和kubectl的资源在参考部分提供。安装后,可以使用命令启动minikube:

检查minilube的状态:

看到minikube正在运行,可以检查集群和组件的状态。

集群正在运行,但组件尚未创建。现在将使用相应的yaml文件创建部署、Pod和服务组件。可以从GitHub仓库中查看deployment.yaml和服务.yaml的内容,并在本地机器上创建副本。

现在,可以再次检查集群组件的状态,以确认所有组件都在运行。

由于Pod和服务正在运行,可以使用以下minikube命令访问服务,以检查应用程序是否在集群上运行。

打开一个单独的终端并运行python脚本,predict-test.py。在python脚本中使用URL http://127.0.0.1:55395/9696。

可以看到ML应用程序已成功部署在kubernetes上。还可以使用命令查看minikube仪表板:

$ minikube dashboard

一旦完成部署,可以使用命令删除服务和部署:

kubectl delete svc kubectl delete deployment

然后可以使用命令停止minikube并删除本地集群:

minikube stop minikube delete

在本地机器上部署k8s并不能确保ML应用程序对最终用户无论地理位置如何都是可访问的。EKS(Elastic Kubernetes Service)、Azure Kubernetes Service(AKS)和Google Kubernetes Engine(GKE)分别是AWS、Azure和Google提供的流行的k8s服务平台,可用于云部署。希望能在另一篇文章中探讨在云上部署k8s。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485