KServe(原KFServing)是云原生环境的的一个模型服务器和推理引擎,可以支持自动缩放、零缩放、金丝雀部署等能力。KServe 作为模型服务器,为大规模服务机器学习和深度学习模型提供了基础。KServe 可以部署为传统的 Kubernetes 部署,也可以部署为支持归零的Serverless部署。对于Serverless部署,它利用了Istio和Knative Serving,具有基于流量的自动扩缩功能以及模型的蓝/绿和金丝雀部署等。
本文将介绍如何结合阿里云服务网格ASM和阿里云容器服务平台Kubernetes(ACK)来部署。
前提条件
- 创建Istio版本为1.12.4.50或更高版本的阿里云服务网格 (ASM) 实例。
- 创建容器服务Kubernetes (ACK) 集群。
- 将ACK集群添加到ASM实例。
- ASM开启数据面KubeAPI访问能力。
- 在数据面ACK集群中已经安装Knative v0.26, 参见https://developer.aliyun.com/article/975639
- KServe选择 v0.7版本。
安装KServe组件
1. 安装Cert Manager
KServe依赖Cert Manager组件。建议安装版本v1.8.0或以上。本文以v1.8.0版本为例,使用如下命令安装:
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/certmanager/v1.8.0/cert-manager.yaml
2. 安装KServe
需要在执行之前, 确认kserve.yaml中以下资源的apiVersion值从cert-manager.io/v1alpha2修改为cert-manager.io/v1。
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: serving-cert
namespace: kserve
spec:
commonName: kserve-webhook-server-service.kserve.svc
dnsNames:
- kserve-webhook-server-service.kserve.svc
issuerRef:
kind: Issuer
name: selfsigned-issuer
secretName: kserve-webhook-server-cert
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-issuer
namespace: kserve
spec:
selfSigned: {}
---
因为https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/kserve/v0.7/kserve.yaml文件中已经修正上述apiVersion, 可以直接执行如下命令安装部署。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/kserve/v0.7/kserve.yaml
执行结果类似如下所示:
namespace/kserve created
customresourcedefinition.apiextensions.k8s.io/inferenceservices.serving.kserve.io created
customresourcedefinition.apiextensions.k8s.io/trainedmodels.serving.kserve.io created
role.rbac.authorization.k8s.io/leader-election-role created
clusterrole.rbac.authorization.k8s.io/kserve-manager-role created
clusterrole.rbac.authorization.k8s.io/kserve-proxy-role created
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/kserve-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/kserve-proxy-rolebinding created
configmap/inferenceservice-config created
configmap/kserve-config created
secret/kserve-webhook-server-secret created
service/kserve-controller-manager-metrics-service created
service/kserve-controller-manager-service created
service/kserve-webhook-server-service created
statefulset.apps/kserve-controller-manager created
certificate.cert-manager.io/serving-cert created
issuer.cert-manager.io/selfsigned-issuer created
mutatingwebhookconfiguration.admissionregistration.k8s.io/inferenceservice.serving.kserve.io created
validatingwebhookconfiguration.admissionregistration.k8s.io/inferenceservice.serving.kserve.io created
validatingwebhookconfiguration.admissionregistration.k8s.io/trainedmodel.serving.kserve.io created
创建ASM网关
如果已经创建过ASM网关, 可以跳过该步骤。
在ASM控制台中可以通过UI界面点击创建, 其中保留端口80为后面应用使用。具体参见 https://help.aliyun.com/document_detail/150510.html
通过运行以下命令获取外部 IP 地址:
kubectl --namespace istio-system get service istio-ingressgateway
创建第一个推理服务
使用scikit-learn的训练模型进行测试。
创建命名空间
首先,创建用于部署KServe资源的命名空间。
kubectl create namespace kserve-test
创建 InferenceService
kubectl apply -n kserve-test -f - <<EOF
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "sklearn-iris"
spec:
predictor:
sklearn:
storageUri: "https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/kserve/v0.7/model.joblib"
EOF
检查创建状态。
使用数据面Kubeconfig,执行如下命令查询inferenceservices的sklearn-iris的安装状态。
kubectl get inferenceservices sklearn-iris -n kserve-test
得到类似如下执行结果。
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE
sklearn-iris http://sklearn-iris.kserve-test.example.com True 100 sklearn-iris-predictor-default-00001 7m8s
同时在安装完成后,会自动创建对应模型配置的虚拟服务。可以到服务网格ASM控制台查看, 类似结果如下。
此外, 也会看到Knative对应的网关规则定义(注意是在命名空间knative-serving下), 类似结果如下:
访问模型服务
创建模型输入文件
cat <<EOF > "./iris-input.json"
{
"instances": [
[6.8, 2.8, 4.8, 1.4],
[6.0, 3.4, 4.5, 1.6]
]
}
EOF
通过ASM网关进行访问
获取SERVICE_HOSTNAME:
SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -n kserve-test -o jsonpath='{.status.url}' | cut -d "/" -f 3)
echo $SERVICE_HOSTNAME
运行结果类似如下:
sklearn-iris.kserve-test.example.com
使用前面创建的ASM网关地址, 访问上述示例模型服务, 执行如下命令:
ASM_GATEWAY="XXXX"
curl -H "Host: ${SERVICE_HOSTNAME}" http://${ASM_GATEWAY}:80/v1/models/sklearn-iris:predict -d @./iris-input.json
运行结果类似如下:
curl -H "Host: ${SERVICE_HOSTNAME}" http://${ASM_GATEWAY}:80/v1/models/sklearn-iris:predict -d @./iris-input.json
{"predictions": [1, 1]}
性能测试
执行如下命令, 测试上面部署的模型服务的性能。
kubectl create -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/kserve/v0.7/loadtest.yaml -n kserve-test
得到类似结果如下:
kubectl logs -n kserve-test load-testchzwx--1-kf29t
Requests [total, rate, throughput] 30000, 500.02, 500.01
Duration [total, attack, wait] 59.999s, 59.998s, 1.352ms
Latencies [min, mean, 50, 90, 95, 99, max] 1.196ms, 1.463ms, 1.378ms, 1.588ms, 1.746ms, 2.99ms, 18.873ms
Bytes In [total, mean] 690000, 23.00
Bytes Out [total, mean] 2460000, 82.00
Success [ratio] 100.00%
Status Codes [code:count] 200:30000
Error Set:
总结
上述这个能力来源于我们的实际客户的诉求。 这些客户使用场景就是希望在服务网格技术之上运行KServe来实现AI服务。KServe平滑运行于服务网格之上, 实现模型服务的蓝/绿和金丝雀部署、修订版本之间的流量分配等能力。支持自动伸缩的Serverless推理工作负载部署、支持高可扩展性、基于并发的智能负载路由等能力。
作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景, 详情可见产品介绍:https://www.aliyun.com/product/servicemesh 。