部署Serverless模式的KServe模型推理服务

KServe(原KFServing)是云原生环境的一个模型服务器和推理引擎,支持自动扩缩容、缩容至零、金丝雀部署等能力。本文介绍如何基于阿里云服务网格ASM和Arena部署Serverless模式的KServe模型推理服务。

前提条件

步骤一:准备模型数据

您可以使用NAS或OSS准备模型数据,具体操作,请参见使用NAS静态存储卷使用OSS静态存储卷。本文以NAS为例说明如何准备模型数据。

1、获取NAS实例的挂载点

  1. 登录文件存储NAS控制台,在左侧导航栏选择文件系统 > 文件系统列表,在页面顶部选择NAS实例所在地域。

  2. 文件系统列表页面,单击目标文件系统ID进入文件详情页面,单击挂载使用,悬浮鼠标至image,查看NAS实例的挂载地址,并记录此处的挂载地址和挂载命令以备后续使用。

2、为目标集群配置存储卷PV和存储声明PVC

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  3. 存储卷页面右上方,单击创建

  4. 创建存储卷对话框中进行参数配置,然后单击创建,创建名为training-data的存储卷。

    以下为主要参数说明,其他配置项可根据业务按需配置。详细信息,请参见使用NAS静态存储卷

    配置项

    说明

    存储卷类型

    NAS

    名称

    training-data

    挂载点域名

    选择步骤1查询到的挂载点地址。

  5. 然后在左侧导航栏,选择存储 > 存储声明,在存储声明页面右上方,单击创建

  6. 创建存储声明对话框中进行参数配置,然后单击创建,创建名为training-data的存储声明。

    以下为主要参数说明,其他配置项可根据业务按需配置。详细信息,请参见使用NAS静态存储卷

    配置项

    说明

    存储声明类型

    NAS

    名称

    training-data

    分配模式

    选择已有存储卷

    已有存储卷

    单击选择已有存储卷链接选择已创建的存储卷PV。

3、将数据下载到NAS中

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

  3. 节点页面,单击目标节点名称进入节点的实例详情页面,单击远程连接,然后单击立即登录,进入远程连接页面。

  4. 执行步骤1获取到的挂载命令,挂载NAS。

  5. 下载BLOOM模型和训练数据。

    Hugging Face下载bloom-560m模型,将模型存储到PVC中,对应路径为pvc://training-data/bloom-560m

步骤二:部署推理服务

  1. 执行以下命令,检查集群中可用的GPU资源。

    arena top node

    预期输出:

    NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
    cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
    cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
    cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   0           0
    cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
    cn-beijing.192.1xx.x.xx   192.1xx.x.xx   <none>  Ready   1           0
    ---------------------------------------------------------------------------------------------------
    Allocated/Total GPUs In Cluster:
    0/2 (0.0%)

    预期输出表明,有2个包含GPU的节点可用于运行推理服务。

  2. 执行以下命令,启动名称为bloom-560m的推理服务。pvc training-data将会被挂载到容器内的/mnt/models目录,即步骤一中下载好的模型路径。

    arena serve kserve \
        --name=bloom-560m \
        --image=ghcr.io/huggingface/text-generation-inference:1.0.2 \
        --gpus=1 \
        --cpu=6 \
        --memory=20Gi \
        --port=8080 \
        --env=STORAGE_URI=pvc://training-data \
        "text-generation-launcher --disable-custom-kernels --model-id /mnt/models/bloom-560m --num-shard 1 -p 8080"

    预期输出:

    inferenceservice.serving.kserve.io/bloom-560m created
    INFO[0013] The Job bloom-560m has been submitted successfully
    INFO[0013] You can run `arena serve get bloom-560m --type kserve -n default` to check the job status

    命令中的参数说明如下所示:

    参数

    是否必选

    说明

    --name

    指定提交的作业名称,全局唯一,不能重复。

    --image

    指定推理服务的镜像地址。

    --gpus

    指定推理服务需要使用的GPU卡数。默认值为0。

    --cpu

    指定推理服务需要使用的CPU数。

    --memory

    指定推理服务需要使用的内存数。

    --port

    推理服务对外暴露的端口。

    --env

    推理服务环境变量,这里指定模型存储的PVC为training-data。

步骤三:验证推理服务

  1. 执行以下命令,查看KServe推理服务的部署情况。

    arena serve get bloom-560m

    预期输出:

    Name:       bloom-560m
    Namespace:  default
    Type:       KServe
    Version:    00001
    Desired:    1
    Available:  1
    Age:        9m
    Address:    http://bloom-560m.default.example.com
    Port:       :80
    GPU:        1
    
    LatestRevision:     bloom-560m-predictor-00001
    LatestPrecent:      100
    
    Instances:
      NAME                                                   STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                                   ------   ---  -----  --------  ---  ----
      bloom-560m-predictor-00001-deployment-ff4c49bf6-twrlp  Running  9m   2/2    0         1    cn-hongkong.192.1xx.x.xxx

    预期输出表明,KServe推理服务部署成功,模型访问地址为http://bloom-560m.default.example.com

  2. 获取ASM网关地址。具体操作,请参见获取ASM网关地址

  3. 执行下列命令,使用获取到的ASM网关地址访问推理服务。

     # 请将${ASM_GATEWAY}替换为ASM网关地址。
    curl -H "Host: bloom-560m.default.example.com" http://${ASM_GATEWAY}:80/generate \
        -X POST \
        -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":17}}' \
        -H 'Content-Type: application/json'

    预期输出:

    {"generated_text":" Deep Learning is a new type of machine learning that is used to solve complex problems."}

步骤四:更新推理服务

  1. 创建一个新的模型版本,可将PVC中的模型地址复制到新的路径bloom-560m-v2

  2. 执行下列命令,灰度更新KServe推理服务,指定新版本模型路径为bloom-560m-v2,新版本分配10%流量,老版本分配90%流量。

    arena serve update kserve \
        --name bloom-560m \
        --canary-traffic-percent=10 \
        "text-generation-launcher --disable-custom-kernels --model-id /mnt/models/bloom-560m-v2 --num-shard 1 -p 8080"
  3. 执行以下命令,查看推理服务运行情况。

    arena serve get bloom-560m

    预期输出:

    Name:       bloom-560m
    Namespace:  default
    Type:       KServe
    Version:    00002
    Desired:    2
    Available:  2
    Age:        36m
    Address:    http://bloom-560m.default.example.com
    Port:       :80
    GPU:        2
    
    LatestRevision:     bloom-560m-predictor-00002
    LatestPrecent:      10
    PrevRevision:       bloom-560m-predictor-00001
    PrevPrecent:        90
    
    Instances:
      NAME                                                    STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                                    ------   ---  -----  --------  ---  ----
      bloom-560m-predictor-00001-deployment-ff4c49bf6-twrlp   Running  36m  2/2    0         1    cn-hongkong.192.1xx.x.xxx
      bloom-560m-predictor-00002-deployment-5b7bb66cfb-nqprp  Running  6m   2/2    0         1    cn-hongkong.192.1xx.x.xxx
  4. 新版本测试通过后,可执行以下命令,将canary-traffic-percent的值设置为100,将流量全部转发到新版本。

    arena serve update kserve \
        --name bloom-560m \
        --canary-traffic-percent=100

(可选)步骤五:删除推理服务

如果需要删除推理服务,可执行以下命令。

arena serve delete bloom-560m