KServe支持以Kubernetes CRD的形式将单个或多个经过训练的模型(例如TFServing、TorchServe等)部署到模型服务运行时,简化模型的部署和管理。您可以基于Knative使用InferenceService来部署模型,以获得基于RPS、并发数、CPU/GPU指标自动弹性,没有业务流量时缩容至零、便捷的多版本管理等能力。
前提条件
已部署KServe组件,请参见部署KServe组件。
步骤一:部署InferenceService推理服务
首先,您需要部署一个带有预测能力的InferenceService推理服务,该推理服务将使用iris (鸢尾花)数据集训练的scikit-learn模型。该数据集具有三个输出类别:Iris Setosa(山鸢尾,索引:0)、Iris Versicolour(杂色鸢尾花,索引:1)和Iris Virginica(弗吉尼亚鸢尾,索引:2)。 然后您可以向部署的模型发送推理请求,以便预测对应的鸢尾植物类别。
iris数据集是由三种鸢尾花,各50组数据构成的数据集。每个样本包含4个特征,分别为萼片(Sepals)的长和宽、花瓣(Petals)的长和宽。
执行以下命令,创建一个名为sklearn-iris的InferenceService推理服务。
kubectl apply -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
执行以下命令,检查服务状态。
kubectl get inferenceservices sklearn-iris
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE sklearn-iris http://sklearn-iris-predictor-default.default.example.com True 100 sklearn-iris-predictor-default-00001 51s
步骤二:访问服务
不同服务网关,IP地址有所不同,访问方式也有所不同。请按需选择。
ALB
执行以下命令,获取ALB访问地址。
kubectl get albconfig knative-internet
预期输出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE knative-internet alb-hvd8nngl0l******* alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com 2
执行以下命令,将以下JSON内容写入
./iris-input.json
文件中,以准备推理输入请求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
执行以下命令,访问服务。
INGRESS_DOMAIN=$(kubectl get albconfig knative-internet -o jsonpath='{.status.loadBalancer.dnsname}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_DOMAIN}/v1/models/sklearn-iris:predict" -d @./iris-input.json
预期输出:
* Trying 120.77.XX.XX... * TCP_NODELAY set * Connected to alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com (120.77.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < Date: Thu, 13 Jul 2023 01:48:44 GMT < Content-Type: application/json < Content-Length: 21 < Connection: keep-alive < * Connection #0 to host alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com left intact {"predictions":[1,1]}
结果返回了两个预测
{"predictions": [1, 1]}
,该结果为推理发送的两组数据点对应于索引为1的花,模型预测这两种花都是Iris Versicolour(杂色鸢尾花)。
MSE
执行以下命令,获取MSE访问地址。
kubectl -n knative-serving get ing stats-ingress
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE stats-ingress knative-ingressclass * 192.168.XX.XX,47.107.XX.XX 80 15d
ADDRESS下方的
47.107.XX.XX
为MSE网关公网地址,后续会使用该地址访问服务。MSE的公网和内网顺序不固定,有时公网排在内网后面,即ADDRESS为47.107.XX.XX,192.168.XX.XX
。执行以下命令,将以下JSON内容写入
./iris-input.json
文件中,以准备推理输入请求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
执行以下命令,访问服务。
# MSE的公网和内网顺序不固定,此处使用公网地址访问。ingress[1]代表公网排在第二位,ingress[0]代表公网排在第一位,请按照实际情况替换。 INGRESS_HOST=$(kubectl -n knative-serving get ing stats-ingress -o jsonpath='{.status.loadBalancer.ingress[1].ip}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json
预期输出:
* Trying 47.107.XX.XX... # 47.107.XX.XX为MSE网关的公网地址。 * TCP_NODELAY set * Connected to 47.107.XX.XX (47.107.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < content-length: 21 < content-type: application/json < date: Tue, 11 Jul 2023 09:56:00 GMT < server: istio-envoy < req-cost-time: 5 < req-arrive-time: 1689069360639 < resp-start-time: 1689069360645 < x-envoy-upstream-service-time: 4 < * Connection #0 to host 47.107.XX.XX left intact {"predictions":[1,1]}
结果返回了两个预测
{"predictions": [1, 1]}
,该结果为推理发送的两组数据点对应于索引为1的花,模型预测这两种花都是Iris Versicolour(杂色鸢尾花)。
Kourier
执行以下命令,获取Kourier服务访问地址。
kubectl -n knative-serving get svc kourier
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kourier LoadBalancer 192.168.XX.XX 121.40.XX.XX 80:31158/TCP,443:32491/TCP 49m
服务访问IP为
121.40.XX.XX
,端口为80(HTTP)和443(HTTPS)。执行以下命令,将以下JSON内容写入
./iris-input.json
文件中,以准备推理输入请求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
执行以下命令,访问服务。
INGRESS_HOST=$(kubectl -n knative-serving get service kourier -o jsonpath='{.status.loadBalancer.ingress[0].ip}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json
预期输出:
* Trying 121.40.XX.XX... * TCP_NODELAY set * Connected to 121.40.XX.XX (121.40.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < content-length: 21 < content-type: application/json < date: Wed, 12 Jul 2023 08:23:13 GMT < server: envoy < x-envoy-upstream-service-time: 4 < * Connection #0 to host 121.40.XX.XX left intact {"predictions":[1,1]}
结果返回了两个预测
{"predictions": [1, 1]}
,该结果为推理发送的两组数据点对应于索引为1的花,模型预测这两种花都是Iris Versicolour(杂色鸢尾花)。
相关文档
如需在Knative中部署AI模型推理服务,可参见在Knative中部署AI模型推理服务的最佳实践获得配置建议。
ACK Knative提供Stable Diffusion的应用模板,请参见基于Knative部署生产级别的Stable Diffusion服务。