基于Kubernetes环境的高扩展机器学习部署利器——KServe

news2024/11/17 13:36:10

随着ChatGPT的发布,人们越来越难以回避利用机器学习的相关技术。从消息应用程序上的文本预测到智能门铃上的面部识别,机器学习(ML)几乎可以在我们今天使用的每一项技术中找到。

如何将机器学习技术交付给消费者是企业在开发过程中必须解决的众多挑战之一。机器学习产品的部署策略对产品的最终用户有重大影响。这可能意味着,iPhone上的Siri和网络浏览器中的ChatGPT之间将存在重大差异。

除了ChatGPT流畅的用户界面和过于自信的聊天对话之外,还隐藏了部署大型语言机器学习模型所需的复杂机制。ChatGPT建立在一个高度可扩展的框架上,该框架旨在当模型呈指数级被应用期间提供和支持该模型。事实上,实际的机器学习模型只占整个项目的一小部分。此类项目往往是跨学科的,需要数据工程、数据科学和软件开发方面的专业知识。因此,简化模型部署过程的框架在向生产交付模型方面变得越来越重要,因为这将有助于企业节省时间和金钱。

如果没有适当的运营框架来支持和管理ML模型,企业在试图扩大生产中机器学习模型的数量时往往会遇到瓶颈。

虽然在高度饱和的MLOps工具包市场上,没有一个工具能成为明显的赢家,但KServe正成为一个越来越受欢迎的工具,帮助企业满足机器学习模型的可扩展性要求。

一、什么是KServe? 

KServe是一个用于Kubernetes的高度可扩展的机器学习部署工具包。它是一个构建在Kubernetes之上的编排工具,并利用了另外两个开源项目,Knative-Serving和Istio;稍后将对此进行详细介绍。        

图片

图片来源于KServe(https://kserve.github.io/website/0.10/)

KServe通过将部署统一到一个资源定义中,大大简化了机器学习模型在Kubernetes集群中的部署过程。它使机器学习部署成为任何机器学习项目的一部分,易于学习,并最终降低了进入壁垒。因此,使用KServe部署的模型比使用需要Flask或FastAPI服务的传统Kubernetes部署的模型更容易维护。

借助于KServe,在使用HTTPs协议通过因特网公开模型之前,不需要将模型封装在FastAPI或Flask应用程序中。KServe内置的功能基本上复制了这个过程,但不需要维护API端点、配置pod副本或配置Kubernetes上的内部路由网络。我们所要做的就是将KServe指向您的模型,然后由它来处理其余的部分。

除了简化部署过程之外,KServe还提供了许多功能,包括金丝雀部署(译者注:这是一种流行的持续部署策略,其中将一小部分机队更新为应用程序的新版本)、推理自动缩放和请求批处理。这些功能将不会被讨论,因为它超出了本文的范围;然而,本文有望为进一步探索相关知识的理解奠定基础。

首先,我们来谈谈KServe附带的两个关键技术,Istio和Knative。

1、Istio

如果没有Istio,KServe带来的许多功能将很难实现。Istio是一个服务网格,用于扩展部署在Kubernetes中的应用程序。它是一个专用的基础设施层,增加了可观察性、流量管理和安全性等功能。对于那些熟悉Kubernetes的人来说,Istio将取代通常在Kubernete集群中找到的标准入口定义。

管理流量和维护可观察性的复杂性只会随着基于Kubernetes的系统的扩展而增加。Istio最好的功能之一是集中控制服务级别的通信。这使开发人员能够对服务之间的通信进行更大的控制和透明度。

有了Istio,开发人员不需要专门开发那些需要能够处理流量身份验证或授权的应用程序。最终,Istio有助于降低已部署应用程序的复杂性,并使开发人员能够专注于应用程序的重要组件。

通过利用Istio的网络功能,KServe能够带来包括金丝雀部署、推理图和自定义转换器在内的功能。

2、KNative  

另一方面,KNative是一个开源的企业级解决方案,用于构建无服务器和事件驱动的应用程序。Knative构建在Istio之上,带来了类似于AWS Lambdas和Azure Functions提供的无服务器代码执行功能。Knative是一个与平台无关的解决方案,用于在Kubernetes中运行无服务器部署。

KNative最好的功能之一是可扩展到零的功能,当没有需求时,该功能会自动缩减部署。这是KServe扩大或缩小ML模型部署能力的一个关键组成部分,也是最大限度地提高资源利用率和节省成本的一个组成部分。

3、我应该使用KServe吗? 

与许多其他工具一样,KServe不是一个适合您的企业所要求的一刀切式的解决方案。它的入门成本很高,因为需要用户具备一些使用Kubernetes的经验。如果你刚开始使用Kubernetes,网上有很多资源,我强烈建议你在Youtube上查看DevOps(https://www.youtube.com/channel/UCFe9-V_rN9nLqVNiI8Yof3w)之类的资源。尽管如此,即使不深入了解Kubernetes,也可以学习使用KServe。

在已经利用Kubernetes的企业中,KServe将是理想的选择,因为这些企业在使用Kubernete方面已经拥有现有的知识。它还可能适合那些希望放弃或补充SageMaker或Azure机器学习等托管服务的组织,以便对您的模型部署过程有更大的控制权。所有权的增加可以显著降低成本,并提高可配置性,以满足项目的特定要求。

尽管如此,正确的云基础设施决策将取决于具体情况,因为不同公司的基础设施要求不同。

二、预备知识  

本文接下来将带您了解设置KServe所需的步骤。您将了解安装KServe并为您的第一个模型提供服务的步骤。

在继续之前,需要满足几个先决条件。您将需要准备以下内容:

  • lKuectl(https://kubernetes.io/docs/tasks/tools/)安装
  • lHelm(https://helm.sh/docs/intro/install/)安装
  • lKuectx(https://github.com/ahmetb/kubectx)安装(可选)

1、Kubernetes集群  

在本教程中,我建议使用Kind工具(https://kind.sigs.k8s.io/)对Kubernetes集群进行实验。它是一个运行本地Kubernetes集群的工具,无需启动云资源。此外,如果您在多个集群中工作,我强烈推荐把Kuectx作为一种工具,它能够帮助您在Kubernetes上下文之间轻松切换。

但是,在运行生产工作负载时,您需要访问功能齐全的Kubernetes集群来配置DNS和HTTPS。

使用Kind工具部署Kubernetes集群的命令如下:

kind create cluster --name kserve-demo

然后,您可以使用以下命令切换到正确的Kubernetes上下文:

kubectx kind-kserve-demo

2、安装  

以下步骤将安装Istio v1.16、Knative Serving v1.7.2和KServe v0.10.0。这些版本最适合本教程,因为Knative v1.8以后的版本将需要对入口进行DNS配置,这增加了一层超出目前范围的复杂性。

1)安装Istio:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.16.0 TARGET_ARCH=x86_64 sh -istioctl install --set profile=default -y

2)安装KNative Serving:

#安装Knative Serving组件
export KNATIVE_VERSION="v1.7.2"
kubectl apply -f https://github.com/knative/serving/releases/download/knative-$KNATIVE_VERSION/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-$KNATIVE_VERSION/serving-core.yaml

#安装istio-controller for knative
kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.7.0/net-istio.yaml

3)安装证书管理器。需要证书管理器来管理HTTPs流量的有效证书。

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.11.0 --set installCRDs=true

4)为模型创建一个命名空间。

kubectl create namespace kserve

5)克隆KServe存储库。

git clone git@github.com:kserve/kserve.git

6)将KServe定制资源定义和KServe运行时安装到集群中的模型命名空间中。

cd kserve
helm install kserve-crd charts/kserve-crd -n kserve
helm install kserve-resources charts/kserve-resources -n kserve

我们现在已经在集群上安装了KServe。接下来,让我们开始部署吧!

三、第一个推理服务  

为了确保部署顺利进行,让我们部署一个演示推理服务。您可以在链接https://kserve.github.io/website/0.10/get_started/first_isvc/#1-create-a-namespace处找到部署的完整源代码。

kubectl apply -n kserve -f - <<EOF
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "sklearn-iris"
spec:
  predictor:
    model:
      modelFormat:
        name: sklearn
      storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"
      EOF

上面的yaml资源定义部署了一个测试推理服务,该服务来源于使用SciKit学习库训练的公开可用模型。KServe支持许多不同风格的机器学习库(https://kserve.github.io/website/0.10/modelserving/v1beta1/serving_runtime/)。

其中包括MLFlow、PyTorch或XGBoost模型;每次发布时都会添加更多的类似支持。如果这些现成的库都不能满足您的要求,KServe还支持自定义预测器(https://kserve.github.io/website/0.10/modelserving/v1beta1/custom/custom_model/)。

注意,您可以通过获取命名空间中的可用pod数量来监控当前部署的状态。

kubectl get pods -n kserve

图片

如果在部署中遇到问题,请使用以下方法进行调试:

kubectl describe pod-n kserve

我们还可以通过以下方式检查推理服务部署的状态:

kubectl get isvc -A

图片

如果推理服务被标记为true,我们就可以执行我们的第一个预测了。

四、执行预测  

为了进行预测,我们需要确定我们的Kubernetes集群是否在支持外部负载均衡器的环境中运行。

kubectl get svc istio-ingressgateway -n istio-system

1、Kind群集  

值得注意的是,使用Kind部署的集群不支持外部负载均衡器;因此,您将拥有一个与下面类似的入口网关。

图片

Kind外部负载均衡器(图片由作者提供)

在这种情况下,我们必须转发istio-ingressgateway,这将允许我们通过localhost访问它。

端口将istio-ingress网关服务转发到本地主机上的端口8080,使用如下命令:

kubectl port-forward -n istio-system service/istio-ingressgateway 8080:80

然后设置入口主机和端口:

export INGRESS_HOST=localhost
export INGRESS_PORT=8080

2、Kubernetes集群  

如果外部IP有效且未显示<pending>,那么我们可以通过IP地址的互联网发送推理请求。

图片

入口网关IP地址(图片由作者提供)

将入口主机和端口设置为:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')

3、进行推理  

为推理请求准备一个输入请求json文件。

cat <"./iris-input.json"
{
  "instances": [
    [6.8,  2.8,  4.8,  1.4],
    [6.0,  3.4,  4.5,  1.6]
  ]
}
EOF

然后用curl命令进行推理:

SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -n kserve -o jsonpath='{.status.url}' | cut -d "/" -f 3)
curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/sklearn-iris:predict" -d @./iris-input.json

该请求将通过istio-ingress网关发送到KServe部署。如果一切正常,我们将从推理服务中获得一个json回复,其中每个实例的预测值为[1,1]。

图片

五、零扩展  

通过利用KNative的功能,KServe支持零扩展功能。该功能通过将未使用的pod扩展为零,从而有效地管理集群中有限的资源。将功能扩展到零允许创建一个响应请求的反应式系统,而不是一个始终处于运行状态的系统。这将有助于在集群中部署比传统部署配置更多的模型。

然而,请注意,对于已经缩小扩展的pod副本,存在一个冷启动“处罚”。“处罚”程度将根据图像/模型的大小和可用的集群资源而变化。如果集群需要扩展额外的节点,冷启动可能需要5分钟,如果模型已经缓存在节点上,则需要10秒。

让我们修改现有的scikit-learn推理服务,并通过定义minReplicas:0来启用零扩展(scale to zero)功能。

kubectl apply -n kserve -f - <     <EOF< span>     </EOF<>
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "sklearn-iris"
spec:
  predictor:
    minReplicas: 0
    model:
      modelFormat:
        name: sklearn
      storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"
EOF

通过将minReplicas设置为0,这将命令Knative在没有HTTP流量时将推理服务缩减为零。你会注意到,30秒后,Sklearn鸢尾花模型的pod副本将缩小。

kubectl get pods -n kserve

Sklearn鸢尾花预测因子降到零

Sklearn鸢尾花预测因子降到零

若要重新初始化推理服务,请向同一个端点发送预测请求。

SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -n kserve -o jsonpath='{.status.url}' | cut -d "/" -f 3)
curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/sklearn-iris:predict" -d @./iris-input.json

图片

这将从冷启动触发pod副本初始化并返回预测。

六、结论  

总体来看,KServe能够简化机器学习部署过程,缩短生产路径。当与Knative和Istio相结合时,KServe还有一个额外的好处,那就是高度可定制,并带来了许多可以轻松与托管云解决方案相媲美的功能。

当然,在内部迁移模型部署过程存在其固有的复杂性。然而,平台所有权的增加将在满足项目特定要求方面提供更大的灵活性。凭借正确的Kubernetes专业知识,KServe可以成为一个强大的工具,使企业能够轻松地在任何云提供商中扩展其机器学习部署,以满足日益增长的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用cmd查看3568主板相关

主要是说清楚思路的 rk3568主板能运行的程序都在system/bin里面&#xff0c;这个是我们直接可以使用cmd用到的 所以&#xff0c;往后我们想通过cmd了解RK3568的某一项参数的时候&#xff0c;或者想使用RK3568某一个系统功能的时候。应该先去system/bin里面查找对应的系统程序。…

Jenkins配置测试报告后无法正常显示或显示空白 的解决方法(问题集锦)

Jenkins配置测试报告后无法正常显示或显示空白&#xff1f; 现象1&#xff1a;界面样式错乱原因分析临时策略永久策略 现象2&#xff1a;报告路径不存在原因分析解决策略 现象3&#xff1a;docker和操作系统版本不匹配原因分析解决策略 现象1&#xff1a;界面样式错乱 打开报告…

实验笔记之——apk生成

最近拾回Android开发&#xff08;实验笔记之——Windows下的Android环境开发搭建_gwpscut的博客-CSDN博客&#xff09;&#xff0c;花了两天时间&#xff0c;写了个二维码识别的app 忘记如何生成apk了&#xff0c;写个笔记来记录一下 需要创建一下 对应的设置好 这里勾选上记住…

系统保留分区被误删怎么办?

当您在全新的磁盘上安装Windows时&#xff0c;将在磁盘的开头创建一个名系统保留的分区&#xff0c;大小约为100MB&#xff0c;然后是系统驱动器&#xff0c;然后是其他的驱动器。通常&#xff0c;系统保留分区在Windows 8中为350MB&#xff0c;在Windows 10中为500MB。系统保留…

网络安全(黑客)自学就业

前段时间&#xff0c;遇到网友提问&#xff0c;说为什么我信息安全专业的找不到工作&#xff1f; 造成这个结果主要是有两大方面的原因。 第一个原因&#xff0c;求职者本身的学习背景问题。那这些问题就包括学历、学校学到的知识是否扎实&#xff0c;是否具备较强的攻防实战…

webpack基础知识三:说说webpack中常见的Loader?解决了什么问题?

一、是什么 loader 用于对模块的"源代码"进行转换&#xff0c;在 import 或"加载"模块时预处理文件 webpack做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定的文件中。如下图所示&#…

智能灯控无线蓝牙解决方案_SKB369串口BLE蓝牙模块

​蓝牙技术受益于其智能、低功耗、高连接速度等特性&#xff0c;在物联网市场呈现爆发式增长是物联网工程师有目共睹的。目前国际物联网最常用的无线通信技术标准主要有三种&#xff1a;WiFi、Zigbee和蓝牙&#xff0c;据不完全统计显示&#xff0c;在民用领域以WiFi和蓝牙为通…

C语言每日一题:13《数据结构》环形链表。

题目链接&#xff1a; 一.环形链表运动基础。 使用快慢指针利用相对移动的思想&#xff1a; 1.第一种情况&#xff1a; 1,令快指针&#xff08;fast&#xff09;速度为2. 2.慢指针&#xff08;slow&#xff09;速度为1. 3.以慢指针进入环中开始。 4。假设slow刚刚进入环中fast…

微信新技能解锁——微信图片可以转Excel表格!

大家好呀&#xff0c;你们是不是跟我一样&#xff0c;收到表格图片没法修改&#xff01; 今天我教大家一个微信隐藏功能&#xff0c;图片可以一键转Excel表格&#xff0c;还能继续编辑&#xff0c;而且还特别简单简直太爱了&#xff5e; 只需打开微信&#xff0c;点击聊天界面…

Openssh高危漏洞CVE-2023-38408修复方案

0x01 漏洞简述 2023年07月21日&#xff0c;360CERT监测发现OpenSSH发布了OpenSSH的风险通告&#xff0c;漏洞编号为CVE-2023-38408&#xff0c;漏洞等级&#xff1a;高危&#xff0c;漏洞评分&#xff1a;8.1。 OpenSSH 是 Secure Shell (SSH) 协议的开源实现&#xff0c;提供…

SpringBoot中mybatis分页插件的使用--【pagehelper组件】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录本系列校训 SpringBoot技术很多很多环境及工具&#xff1a;上效果图目前流行的mybatis分页插件在Spring Boot里使用pagehelperJAVA查询列表时页面上的使用还要注意的是 …

零基础强化学习入门分享

&#xff08;一&#xff09;前言&#xff1a;强化学习入门顺序。 以前主要学习硬件PCB单片机等知识&#xff0c;后来接触的项目也大多与电气相关&#xff0c;从一窍不通到稍微找到点门道&#xff0c;中间走过不少弯路&#xff0c;误打误撞中&#xff0c;也留下了一些经验。 我的…

【音视频处理】转封装实战,文件转直播流,FFmpeg代码示例讲解

大家好&#xff0c;欢迎来到停止重构的频道。 从本期起&#xff0c;我们正式进入音视频处理的介绍。 本期我们讨论音视频文件转封装&#xff0c;如将MP4转AVI、MP4转RTMP等。 内容中所提及的代码都会放在GitHub&#xff0c;感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺…

数据科学与大数据专业好就业么

好不好就业取决于你个人的学习能力和技术水平能否达到企业应聘的要求&#xff0c;最直观的方法就是可以搜下你想要工作城市的应聘要求&#xff0c;然后对应着技术点进行技能提升 猎聘大数据研究院发布了《2022未来人才就业趋势报告》 从排名来看&#xff0c;2022年1-4月各行业…

最强实战,Web自动化测试Python+Selenium3+PO+Yaml+DDT框架封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 设计思路 框架采…

23款奔驰C260 L更换内饰最全发光套件,提升车内氛围感

原厂1:1设计&#xff0c;免编程匹配&#xff0c;无损安装&#xff0c;可升级项目&#xff1a; 1、碳纤维中控氛围灯&#xff08;阿凡达水滴款&#xff09; 2、发光前风口&#xff1b; 3、发光后风口&#xff1b; 4、发光座椅背气氛灯&#xff1b; 5、中音发光盖板 6、主动…

LGViT : Dynamic Early Exiting for Accelerating Vision

摘要 近年来&#xff0c;在资源有限的边缘设备上高效部署和加速功能强大的视觉变压器&#xff08;ViTs&#xff09;已成为一个很有吸引力的任务。虽然早期退出是加速推理的一个可行的解决方案&#xff0c;但大多数工作都集中在自然语言处理&#xff08;NLP&#xff09;中的卷积…

1.Kubernetes

文章目录 KubernetesK8S概述作用为什么使用K8S主要功能Kubernetes 集群架构与组件总结&#xff1a; 核心组件Master组件Kube-apiserverKube-controller-managerKube-scheduler工作 配置存储中心etcd Node组件KubeletKube-Proxydocker 或 containerd 总结&#xff1a; 工作流程K…

【电源专题】电压查表法显示电量的原理与缺点

在文章:【电源专题】电量计估计电池荷电状态方法(开路电压法及库仑计法)的差别中我们讲到电量计估计荷电状态的方法。其中开路电压法实现方法较容易,可借着开路电压对应荷电状态查表而得到。 那么为什么能够使用电压查表法去预估电池容量呢?如下所示如果我们往一个有刻度…

SpringBoot复习:(16)TomcatStarter

直接在idea里运行SpringBoot程序时&#xff0c;内嵌的tomcat容器会调用TomcatStarter这个类的onStartup方法。TomcatStarter继承自ServletContainerInitializer 其onStartup方法会调用ServletContextInitializer&#xff08;不是ServletContainerInitializer)的onStartup方法.…