ASM结合KServe与Fluid实现数据加速访问的AI Serving

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集群:

  • ASM实例已开启通过数据面集群KubeAPI访问Istio资源能力。具体操作,请参见通过数据面集群KubeAPI访问Istio资源

  • 已为集群添加入口网关。本文使用ASM入口网关作为集群网关,ASM入口网关名称为默认的ingressgateway,开放80和443端口。具体操作,请参见创建入口网关

  • 已在ACK或ACK Serverless集群中部署Knative Serving组件,并开启Knative on ASM功能。更多信息,请参见使用Knative on ASM部署Serverless应用

    展开查看如何部署Knative Serving组件

    • 关于如何在ACK集群安装Knative,请参见部署Knative

    • 关于如何在ACK Serverless集群安装Knative,请参见开启Knative

    说明

    如果您选择Kourier为服务网关一键部署Knative,即在ACK控制台的集群列表页面单击目标集群名称,然后在左侧导航栏,选择应用 > Knative一键部署Knative组件时,选择Kourier组件作为服务网关,请在组件成功安装后,单击组件管理页签,在add-on 组件区域的列表卸载Kourier组件。

    展开查看如何开启Knative on ASM

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择生态集成中心 > Knative on ASM

    3. Knative on ASM页面,单击启用Knative on ASM

  • 已开通阿里云对象存储(OSS)服务和存储空间(Bucket)。具体操作,请参见开通OSS服务控制台创建存储空间

步骤一:开启KServe on ASM功能

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择生态集成中心 > KServe on ASM

  3. KServe on ASM页面,按需打开或关闭在集群中自动安装CertManager组件开关,然后单击开启KServe on ASM

    cert-manager是一个证书生命周期管理系统,支持证书的申请、部署等功能。KServe on ASM功能依赖CertManager组件的部署与使用。安装KServe时,会自动安装CertManager组件。

    • 如果您未在集群中安装CertManager,请打开在集群中自动安装CertManager组件开关。

    • 如果您已经在数据面集群中安装CertManager,请关闭在集群中自动安装CertManager组件开关。

步骤二:安装Fluid并开启AI模型缓存加速

  1. 在集群中部署ack-fluid组件,且组件版本为0.9.10及以上。

    • 如果您的数据面集群为ACK集群,请在集群中安装云原生AI套件并部署ack-fluid组件。

      说明

      若您已安装开源Fluid,请卸载后再部署ack-fluid组件。

    • 如果您的数据面集群为ACK Serverless集群,请在集群中部署ack-fluid组件。具体操作,请参见加速Job应用数据访问部署Fluid控制面组件

  2. 准备AI模型并上传至OSS Bucket。

    1. 准备已训练好的AI模型保存数据。

      本文以基于PyTorch的开源Transformer大语言模型bloom为例。关于模型数据详情,请参见Hugging Face

    2. 将下载的模型数据文件上传至OSS Bucket,并记录模型数据文件的保存位置。

      模型数据文件的保存位置格式为oss://{bucket}/{path}。例如,如果您创建了名为fluid-demo的Bucket,并在Bucket中的models/bloom目录中上传了所有的模型数据文件,则模型数据文件的保存位置为oss://fluid-demo/models/bloom

      说明

      您可以通过OSS提供的客户端工具ossutil上传数据。具体操作,请参见安装ossutil

  3. 创建用于部署Fluid缓存和AI服务的命名空间,并配置OSS访问权限。

    1. 使用kubectl连接到数据面集群。具体操作,请参见通过kubectl连接Kubernetes集群

    2. 执行以下命令,创建用于部署Fluid缓存和KServe AI服务的命名空间kserve-fluid-demo

      kubectl create ns kserve-fluid-demo
    3. 使用以下内容,创建oss-secret.yaml文件。

      fs.oss.accessKeyIdfs.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。
    4. 执行以下命令,部署Secret,配置OSS访问密钥。

      kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
  4. 在Fluid中声明待访问的AI模型数据。

    您需要提交一个Dataset CR和一个JindoRuntime CR。Dataset CR描述数据在外部存储系统中的URL位置,JindoRuntime CR描述缓存系统及其具体配置。

    1. 使用以下内容,创建oss-jindo.yaml文件。

      请将Dataset CR中的oss://{bucket}/{path}替换为上文步骤2.b中记录的模型数据文件的保存位置,{endpoint}替换为OSS的访问域名。关于如何获取不同地域OSS的访问域名,请参见访问域名和数据中心

      展开查看oss-jindo.yaml

      apiVersion: data.fluid.io/v1alpha1
      kind: Dataset
      metadata:
        name: oss-data
      spec:
        mounts:
        - mountPoint: "oss://{bucket}/{path}" # 请替换为模型数据文件的保存位置。
          name: bloom-560m
          path: /bloom-560m
          options:
            fs.oss.endpoint: "{endpoint}"  # 请替换为实际的OSS endpoint地址。
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeySecret
        accessModes:
          - ReadOnlyMany
      ---
      apiVersion: data.fluid.io/v1alpha1
      kind: JindoRuntime
      metadata:
        name: oss-data
      spec:
        replicas: 2
        tieredstore:
          levels:
            - mediumtype: SSD
              volumeType: emptyDir
              path: /mnt/ssd0/cache
              quota: 50Gi
              high: "0.95"
              low: "0.7"
        fuse:
          properties:
            fs.jindofsx.data.cache.enable: "true"
          args:
            - -okernel_cache
            - -oro
            - -oattr_timeout=7200
            - -oentry_timeout=7200
            - -ometrics_port=9089
          cleanPolicy: OnDemand
      
    2. 执行以下命令,部署Dataset和JindoRuntime CR。

      kubectl create -f oss-jindo.yaml -n kserve-fluid-demo
    3. 执行以下命令,查看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的PHASEBound,JindoRuntime的FUSE PHASEReady,表明Dataset和JindoRuntime部署成功。

  5. 在Fluid中进行数据预热,提升数据访问性能。

    1. 使用以下内容,创建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
    2. 执行以下命令,部署Dataload以预热数据。

      kubectl create -f oss-dataload.yaml -n kserve-fluid-demo
    3. 执行以下命令,查看数据预热的进度。

      kubectl get dataload -n kserve-fluid-demo

      预期输出:

      NAME           DATASET    PHASE      AGE     DURATION
      oss-dataload   oss-data   Complete   1m      45s

      由预期输出得到,数据预热耗时约45s。您需要等待一段时间,数据预热才会完成。

步骤三:部署AI模型推理服务

  1. 按需选择以下内容,创建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

  2. 执行以下命令,部署InferenceService AI模型推理服务。

    kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demo
  3. 执行以下命令,查看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模型推理服务

  1. 获取ASM入口网关地址。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. ingressgateway网关的服务地址区域,查看并获取ASM网关服务地址。

  2. 执行以下命令,访问示例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模型推理服务已成功对示例输入进行续写并返回推理结果。

相关文档