KServe(原KFServing)是云原生环境的一个AI模型服务和推理引擎,支持自动缩放、零缩放、金丝雀部署等能力。阿里云服务网格ASM在集成容器服务Knative Serving能力的基础上,支持一键集成KServe实现AI Serving的KServe on ASM能力。Fluid是一个开源的Kubernetes原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用,例如大数据应用、AI应用等。ASM的KServe on ASM功能可以直接与Fluid整合,加速模型的加载过程。本文介绍如何在ASM结合KServe与Fluid实现数据加速访问的AI Serving。
前提条件
已添加Kubernetes集群到ASM实例。具体操作,请参见创建ASM实例和添加集群到ASM实例。
说明ASM实例版本需为1.17及以上。关于升级实例的具体操作,请参见升级ASM实例。
Kubernetes集群:
ACK集群版本需为1.22及以上。具体操作,请参见创建Kubernetes托管版集群或升级ACK集群。如果您使用GPU运行AI服务,请确保ACK集群中包含GPU类型的节点,例如ecs.gn6i-c16g1.4xlarge。
ACK Serverless集群版本需为1.18及以上,且已安装CoreDNS组件。具体操作,请参见创建ASK集群和管理组件。
ASM实例已开启通过数据面集群KubeAPI访问Istio资源能力。具体操作,请参见通过数据面集群KubeAPI访问Istio资源。
已为集群添加入口网关。本文使用ASM入口网关作为集群网关,ASM入口网关名称为默认的ingressgateway,开放80和443端口。具体操作,请参见创建入口网关。
已在ACK或ACK Serverless集群中部署Knative Serving组件,并开启Knative on ASM功能。更多信息,请参见使用Knative on ASM部署Serverless应用。
步骤一:开启KServe on ASM功能
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在KServe on ASM页面,按需打开或关闭在集群中自动安装CertManager组件开关,然后单击开启KServe on ASM。
cert-manager是一个证书生命周期管理系统,支持证书的申请、部署等功能。KServe on ASM功能依赖CertManager组件的部署与使用。安装KServe时,会自动安装CertManager组件。
如果您未在集群中安装CertManager,请打开在集群中自动安装CertManager组件开关。
如果您已经在数据面集群中安装CertManager,请关闭在集群中自动安装CertManager组件开关。
步骤二:安装Fluid并开启AI模型缓存加速
在集群中部署ack-fluid组件,且组件版本为0.9.10及以上。
如果您的数据面集群为ACK集群,请在集群中安装云原生AI套件并部署ack-fluid组件。
说明若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
如果您的数据面集群为ACK Serverless集群,请在集群中部署ack-fluid组件。具体操作,请参见加速Job应用数据访问的部署Fluid控制面组件。
准备AI模型并上传至OSS Bucket。
准备已训练好的AI模型保存数据。
本文以基于PyTorch的开源Transformer大语言模型bloom为例。关于模型数据详情,请参见Hugging Face。
将下载的模型数据文件上传至OSS Bucket,并记录模型数据文件的保存位置。
模型数据文件的保存位置格式为
oss://{bucket}/{path}
。例如,如果您创建了名为fluid-demo的Bucket,并在Bucket中的models/bloom
目录中上传了所有的模型数据文件,则模型数据文件的保存位置为oss://fluid-demo/models/bloom
。说明您可以通过OSS提供的客户端工具ossutil上传数据。具体操作,请参见安装ossutil。
创建用于部署Fluid缓存和AI服务的命名空间,并配置OSS访问权限。
使用kubectl连接到数据面集群。具体操作,请参见通过kubectl连接Kubernetes集群。
执行以下命令,创建用于部署Fluid缓存和KServe AI服务的命名空间
kserve-fluid-demo
。kubectl create ns kserve-fluid-demo
使用以下内容,创建oss-secret.yaml文件。
fs.oss.accessKeyId
和fs.oss.accessKeySecret
分别代表可以访问OSS的accessKeyId和accessKeySecret。apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: xxx # 请替换为可以访问OSS的阿里云accessKeyId。 fs.oss.accessKeySecret: xxx # 请替换为可以访问OSS的阿里云accessKeySecret。
执行以下命令,部署Secret,配置OSS访问密钥。
kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
在Fluid中声明待访问的AI模型数据。
您需要提交一个Dataset CR和一个JindoRuntime CR。Dataset CR描述数据在外部存储系统中的URL位置,JindoRuntime CR描述缓存系统及其具体配置。
使用以下内容,创建oss-jindo.yaml文件。
请将Dataset CR中的
oss://{bucket}/{path}
替换为上文步骤2.b中记录的模型数据文件的保存位置,{endpoint}
替换为OSS的访问域名。关于如何获取不同地域OSS的访问域名,请参见访问域名和数据中心。执行以下命令,部署Dataset和JindoRuntime CR。
kubectl create -f oss-jindo.yaml -n kserve-fluid-demo
执行以下命令,查看Dataset和JindoRuntime的部署情况。
kubectl get jindoruntime,dataset -n kserve-fluid-demo
预期输出:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE jindoruntime.data.fluid.io/oss-data Ready Ready Ready 3m NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/oss-data 3.14GiB 0.00B 100.00GiB 0.0% Bound 3m
由预期输出得到,Dataset的
PHASE
为Bound
,JindoRuntime的FUSE PHASE
为Ready
,表明Dataset和JindoRuntime部署成功。
在Fluid中进行数据预热,提升数据访问性能。
使用以下内容,创建oss-dataload.yaml文件。
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: oss-dataload spec: dataset: name: oss-data namespace: kserve-fluid-demo target: - path: /bloom-560m replicas: 2
执行以下命令,部署Dataload以预热数据。
kubectl create -f oss-dataload.yaml -n kserve-fluid-demo
执行以下命令,查看数据预热的进度。
kubectl get dataload -n kserve-fluid-demo
预期输出:
NAME DATASET PHASE AGE DURATION oss-dataload oss-data Complete 1m 45s
由预期输出得到,数据预热耗时约
45s
。您需要等待一段时间,数据预热才会完成。
步骤三:部署AI模型推理服务
按需选择以下内容,创建oss-fluid-isvc.yaml文件。
ACK集群
apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "fluid-bloom" spec: predictor: timeout: 600 minReplicas: 0 containers: - name: kserve-container image: registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu resources: limits: cpu: "12" memory: 48Gi nvidia.com/gpu: 1 # 如果使用GPU则需要设定需要的GPU数量,否则无需设定 requests: cpu: "12" memory: 48Gi env: - name: STORAGE_URI value: "pvc://oss-data/bloom-560m" - name: MODEL_NAME value: "bloom" # 如果使用GPU则设置成True,否则设置为False。 - name: GPU_ENABLED value: "True"
ACK Serverless集群
apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "fluid-bloom" labels: alibabacloud.com/fluid-sidecar-target: "eci" annotations: k8s.aliyun.com/eci-use-specs : "ecs.gn6i-c16g1.4xlarge" # 请根据需要替换使用的ECS规格。 knative.aliyun.com/reserve-instance-eci-use-specs: "ecs.gn6i-c16g1.4xlarge" # 请根据需要替换使用的ECS规格。 spec: predictor: timeout: 600 minReplicas: 0 containers: - name: kserve-container image: registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu resources: limits: cpu: "12" memory: 48Gi requests: cpu: "12" memory: 48Gi env: - name: STORAGE_URI value: "pvc://oss-data/bloom-560m" - name: MODEL_NAME value: "bloom" # 如果使用GPU则设置成True,否则设置为False。 - name: GPU_ENABLED value: "True"
说明本示例配置为大语言模型,因此申请了12核 48 Gi的较大资源。请您根据自身集群负载对
InferenceService
中的resources
字段进行修改。本示例的
image
字段使用了registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu
示例镜像。该镜像提供加载模型及推理服务的接口。您可以在KServe开源社区中查看此示例镜像的代码,并进行镜像自定义。详细信息,请参见Docker。
执行以下命令,部署InferenceService AI模型推理服务。
kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demo
执行以下命令,查看AI模型推理服务的部署状态。
kubectl get inferenceservice -n kserve-fluid-demo
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE fluid-bloom http://fluid-bloom.kserve-fluid-demo.example.com True 100 fluid-bloom-predictor-00001 2d
由预期输出得到,
READY
字段为True
,表明AI模型推理服务已经部署成功。
步骤四:访问AI模型推理服务
获取ASM入口网关地址。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在ingressgateway网关的服务地址区域,查看并获取ASM网关服务地址。
执行以下命令,访问示例AI模型推理服务bloom,将ASM网关服务地址替换为步骤1获取的ASM入口网关地址。
curl -v -H "Content-Type: application/json" -H "Host: fluid-bloom.kserve-fluid-demo.example.com" "http://{ASM网关服务地址}:80/v1/models/bloom:predict" -d '{"prompt": "It was a dark and stormy night", "result_length": 50}'
预期输出:
* Trying xxx.xx.xx.xx :80... * Connected to xxx.xx.xx.xx (xxx.xx.xx.xx ) port 80 (#0) > POST /v1/models/bloom:predict HTTP/1.1 > Host: fluid-bloom-predictor.kserve-fluid-demo.example.com > User-Agent: curl/7.84.0 > Accept: */* > Content-Type: application/json > Content-Length: 65 > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-length: 227 < content-type: application/json < date: Thu, 20 Apr 2023 09:49:00 GMT < server: istio-envoy < x-envoy-upstream-service-time: 1142 < { "result": "It was a dark and stormy night, and the wind was blowing in the\ndirection of the west. The wind was blowing in the direction of the\nwest, and the wind was blowing in the direction of the west. The\nwind was" } * Connection # 0 to host xxx.xx.xx.xx left intact
由预期输出得到,AI模型推理服务已成功对示例输入进行续写并返回推理结果。