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