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

随着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: sklearnstorageUri: "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: 0model:modelFormat:name: sklearnstorageUri: "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可以成为一个强大的工具,使企业能够轻松地在任何云提供商中扩展其机器学习部署,以满足日益增长的需求。


Docker 部署的低代码

JNPF快速开发平台是一款基于SpringBoot+Vue3的全栈开发平台,满足微服务、前后端分离架构,基于可视化流程建模、表单建模、报表建模工具,快速构建业务应用。平台可以本地化部署,也支持K8S部署。 免费体验地址:https://www.jnpfsoft.com/?csdn

除了上述功能,还配置了图表引擎、接口引擎、门户引擎、组织用户引擎等可视化功能引擎,基本实现页面UI的可视化搭建。内置有百种功能控件及使用模板,使得在拖拉拽的简单操作下,也能大限度满足用户个性化需求。

通过可视化拖拽的方式,传统模式下需要 2 周完成开发的应用,用JNPF只要2小时。用JNPF搭建应用,你只需要关注业务本身,数据存储、运行环境、服务器、网络安全等,平台为你全部搞定。
 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【独立后台】快递小程序便宜寄快递系统小程序 对接易达

快递代发项目简介&#xff1a; 顾名思义就是帮发快递。原本产业链是客户-快递之间的联系&#xff0c;现在变成了客户-我们-快递&#xff0c;简单来说就是我们把客户聚集到一起团购到了更优惠的价格。很简单就是赚一个差价&#xff0c; 单子多就能和各个快递合作的平台&#x…

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

&#x1f4e2;前言&#xff1a;本篇是关于如何使用YoloV5Deepsort训练自己的数据集&#xff0c;从而实现目标检测与目标追踪&#xff0c;并绘制出物体的运动轨迹。本章讲解的为第一个内容&#xff1a;简单介绍YoloV5Deepsort中所用到的目标检测&#xff0c;追踪及sort&Depp…

基于Spring Boot的在线视频教育培训网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的在线视频教育培训网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

Python IDE

Python IDE 本文为大家推荐几款款不错的 Python IDE&#xff08;集成开发环境&#xff09;&#xff0c;比较推荐 PyCharm&#xff0c;当然你可以根据自己的喜好来选择适合自己的 Python IDE。 PyCharm PyCharm 是由 JetBrains 打造的一款 Python IDE。 PyCharm 具备一般 Pyt…

Android优化篇|网络预连接

作者&#xff1a;苍耳叔叔 一个示例 前后分别去请求同一个域名下的接口&#xff0c;通过 Charles 抓包&#xff0c;可以看到 Timing 下面的时间&#xff1a; 第二次请求时&#xff0c;DNS、Connect 和 TLS Handshake 部分都是 -&#xff0c;说明没有这部分的耗时&#xff0c;…

一个.NET开发的Web版Redis管理工具

今天给大家推荐一款web 版的Redis可视化工具WebRedisManager&#xff0c;即可以作为单机的web 版的Redis可视化工具来使用&#xff0c;也可以挂在服务器上多人管理使用的web 版的Redis可视化工具。 WebRedisManager基于SAEA.Socket通信框架中的SAEA.RedisSocket、SAEA.WebApi两…

BS框架说明

B/S架构 1.B/S框架&#xff0c;意思是前端&#xff08;Browser 浏览器&#xff0c;小程序、app、自己写的&#xff09;和服务器端&#xff08;Server&#xff09;组成的系统的框架结构 2.B/S框架&#xff0c;也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分…

实际工作中通过python+go-cqhttp+selenium实现自动检测维护升级并发送QQ通知消息(程序内测)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 首先&#xff0c;今年比较忙没有多余时间去实操创作分享文章给大家&#xff0c;那就给大家分享下博主在实际工作中的一点点内容吧&#xff0c;就当交…

数据结构基础

目录 1、线性表 1.1、数组 1.2、链表 1.3、栈 1.4、队列 2、散列表 3、树 3.1、二叉树 3.1.1、存储原理 3.1.2、红黑树 a、平衡二叉树和红黑树 b、红黑树特征 c、左旋 d、右旋 e、颜色反转 3.1.3、二叉堆 3.1.4、二叉树的遍历 a、深度优先遍历 b、广度优先遍…

洛谷 P3375 【模板】KMP 字符串匹配

题目描述 给出两个字符串 s1​ 和 s2​&#xff0c;若 s1​ 的区间 [l,r] 子串与 s2​ 完全相同&#xff0c;则称 s2​ 在 s1​ 中出现了&#xff0c;其出现位置为 l。 现在请你求出 s2​ 在 s1​ 中所有出现的位置。 定义一个字符串 s 的 border 为 s 的一个非 s 本身的子串…

4 三组例子,用OpenCV玩转图像-AI-python

读取&#xff0c;缩放&#xff0c;旋转&#xff0c;写入图像 首先导入包&#xff0c;为了显示导入matplotlib/为了在matplotlib显示 导入CV2/查看版本 导入图片/查看图片类型 图片数组 数组大小 对于opencv通道顺序蓝色B、绿色G、红色R matplotlib通道顺序为 红色R、绿色G、蓝…

无涯教程-Perl - delete函数

描述 此函数从哈希中删除指定的键和关联的值,或从数组中删除指定的元素。该操作适用于单个元素或切片。 语法 以下是此函数的简单语法- delete LIST返回值 如果键不存在,并且与已删除的哈希键或数组索引关联的值,则此函数返回undef。 Perl 中的 delete函数 - 无涯教程网无…

机器学习---概述(二)

文章目录 1.模型评估1.1 分类模型评估1.2 回归模型评估 2. 拟合2.1 欠拟合2.2 过拟合2.3 适当拟合总结&#xff1a; 3.深度学习3.1层次&#xff08;Layers&#xff09;&#xff1a;3.2 神经元&#xff08;Neurons&#xff09;&#xff1a;3.3 总结 1.模型评估 模型评估是机器学…

【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析

目录 前言 influxDB 安装运行InfluxDB 用Python 上报数据到influxdb ocust 数据写入到 influx Locust的生命周期 上报数据 优化升级 配置Grafana 总结 资料获取方法 前言 在进行性能测试时&#xff0c;我们需要对测试结果进行监控和分析&#xff0c;以便于及时发现问…

项目实战 — 消息队列(4){消息持久化}

目录 一、消息存储格式设计 &#x1f345; 1、queue_data.txt&#xff1a;保存消息的内容 &#x1f345; 2、queue_stat.txt&#xff1a;保存消息的统计信息 二、消息序列化 三、自定义异常类 四、创建MessageFileManger类 &#x1f345; 1、约定消息文件所在的目录和文件名…

迅为全国产龙芯3A5000电脑运行统信UOS、银河麒麟、loongnix系统

iTOP-3A5000开发板采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch) 的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。在与龙芯3A4000处理器保持引脚兼容的基础上&#xff0c;频率提升至2.5GHZ&#xff0c;功耗降…

谷粒商城第九天-解决商品品牌问题以及前后端使用检验框架检验参数

目录 一、总述 二、商品分类问题 三、前端检验 四、后端检验 五、总结 一、总述 在完成完商品分类的时候&#xff0c;后来测试的时候还是发现了一些问题&#xff0c;现在将其进行解决&#xff0c;问题如下&#xff1a; 1. 取消显示的时候&#xff0c;如果取消了显示&…

九度OJ → 题目1368:二叉树中和为某一值的路径 ← DFS

【题目来源】 由于九度OJ&#xff08;http://ac.jobdu.com/&#xff09;已经永久关闭&#xff0c;故无法在其上进行在线提交代码。 幸运的是&#xff0c;在AcWing上有此题目“二叉树中和为某一值的路径”&#xff0c;但描述有些不同。可详见&#xff1a;https://www.acwing.com…

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案&#xff0c;最终一致性。读者们可思考过&#xff0c;如果主节点凌晨 3 点突发宕机怎么办&#xff1f;就坐等运维从床上爬起来&#xff0c;然后手工进行从主切换&#xff0c;再通知所有的程序把地址统统改一遍重新上线么&#xff1f;毫无疑问…

绿色项目管理:为环境和效益双赢

绿色项目管理&#xff1a;为环境和效益双赢 在21世纪的今天&#xff0c;我们正面临着各种全球性的环境问题&#xff0c;从气候变化到资源枯竭。作为项目经理&#xff0c;我们有责任和机会确保我们的项目对环境的影响最小&#xff0c;并在可能的情况下为环境做出积极的贡献。 …