基于KServe使用Fluid实现模型加速

随着技术的发展,AI应用的模型数据越来越大,但是通过存储服务(如OSS、NAS等)拉取这些大文件时可能会出现长时间的延迟和冷启动问题。您可以利用Fluid显著提升模型加载速度,从而优化推理服务的性能,特别是对于基于KServe的推理服务而言。本文以Qwen-7B-Chat-Int8模型、GPU类型为V100卡为例,演示如何在KServe中使用Fluid实现模型加速。

前提条件

  • 已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.22及以上,同时集群中至少有3个节点,每个节点的剩余内存需大于3GB。具体操作,请参见创建ACK Pro版集群

  • 已安装云原生AI套件并部署ack-fluid组件。具体操作,请参见安装云原生AI套件

  • 已安装Arena客户端,且版本不低于0.9.15。具体操作,请参见配置Arena客户端

  • 已安装ack-kserve。具体操作,请参见安装ack-kserve️

  • 已开通阿里云对象存储(OSS)服务。具体操作,请参见开通OSS服务

步骤一:准备模型数据并上传OSS Bucket

  1. 下载模型。本文以Qwen-7B-Chat-Int8模型为例。

    1. 执行以下命令,安装Git。

      sudo yum install git
    2. 执行以下命令,安装Git LFS(Large File Support)插件。

      sudo yum install git-lfs
    3. 执行以下命令,将ModelScope上的Qwen-7B-Chat-Int8仓库克隆到本地。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git
    4. 执行以下命令,进入Qwen-7B-Chat-Int8仓库目录。

      cd Qwen-7B-Chat-Int8
    5. 执行以下命令,在Qwen-7B-Chat-Int8目录下,下载LFS管理的大文件。

      git lfs pull
  2. 将下载的Qwen-7B-Chat-Int8文件上传至OSS。

    1. 登录OSS控制台,查看并记录已创建的Bucket名称。

      如何创建Bucket,请参见创建存储空间

    2. 安装和配置ossutil。具体操作,请参见安装ossutil

    3. 执行以下命令,在OSS创建名为Qwen-7B-Chat-Int8的目录。

      ossutil mkdir oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8
    4. 执行以下命令,上传模型文件至OSS。

      ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8

步骤二:创建Dataset和JindoRuntime

Dataset可以高效地组织和处理数据,而集成JindoRuntime可以通过数据缓存策略进一步加速数据访问,两者结合可以大幅提升数据处理和模型服务的性能。

  1. 执行以下命令,创建用于存储OSS的访问凭证的Secret。

    kubectl apply -f-<<EOF                                            
    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
    stringData:
      fs.oss.accessKeyId: <YourAccessKey ID>
      fs.oss.accessKeySecret: <YourAccessKey Secret>
    EOF

    其中,fs.oss.accessKeyIdfs.oss.accessKeySecret是用来访问OSS的AccessKey ID(AK)和AccessKey Secret(SK)。关于如何获取AK和SK,请参见获取AccessKey

    预期输出:

    secret/oss-secret created
  2. 创建并拷贝以下内容到resource.yaml文件中,用于创建一个Dataset和一个JindoRuntime。关于Dataset及JindoRuntime的详细配置信息,请参见JindoFS加速OSS文件访问

    • Dataset用于描述远端存储数据集和UFS的信息。

    • JindoRuntime用于启动一个JindoFS的集群来提供缓存服务。

    展开查看resource.yaml文件

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: qwen-7b-chat-int8
    spec:
      mounts:
        - mountPoint: oss://<oss_bucket>/Qwen-7b-chat-Int8 # 请替换为实际的模型存储地址。
          options:
            fs.oss.endpoint: <oss_endpoint> # 请替换为实际的OSS endpoint地址。
          name: models
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: oss-secret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: oss-secret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: qwen-7b-chat-int8 # 需要与Dataset名称保持一致。
    spec:
      replicas: 3
      tieredstore:
        levels:
          - mediumtype: MEM # 使用内存缓存数据。
            volumeType: emptyDir
            path: /dev/shm
            quota: 3Gi # 单个分布式缓存Worker副本所能提供的缓存容量。
            high: "0.95"
            low: "0.7"
      fuse:
        resources:
          requests:
            memory: 2Gi
        properties:
          fs.oss.download.thread.concurrency: "200"
          fs.oss.read.buffer.size: "8388608"
          fs.oss.read.readahead.max.buffer.count: "200"
          fs.oss.read.sequence.ambiguity.range: "2147483647"
  3. 执行以下命令,创建JindoRuntime和Dataset。

    kubectl apply -f resource.yaml

    预期输出:

    dataset.data.fluid.io/qwen-7b-chat-int8 created
    jindoruntime.data.fluid.io/qwen-7b-chat-int8 created

步骤三:部署vLLM推理服务

  1. 执行以下命令,部署一个基于KServe的模型服务。

    如下所示,利用vLLM推理框架和KServe部署了一个服务于qwen-7b-chat-Int8语言模型的服务。

    arena serve kserve \
        --name=qwen-fluid \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
        --gpus=1 \
        --cpu=4 \
        --memory=12Gi \
        --data="qwen-7b-chat-int8:/mnt/models/Qwen-7B-Chat-Int8" \
        "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"

    预期输出:

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

    预期输出表明推理服务已部署成功。

步骤四:查看数据加速效果

  1. 执行以下命令,查看Dataset信息。

    kubectl get dataset qwen-7b-chat-int8

    预期输出:

    NAME                UFS TOTAL SIZE   CACHED     CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    qwen-7b-chat-int8   17.01GiB         10.46MiB   18.00GiB         0.1%                Bound   23h
  2. 执行以下命令,查看应用就绪的时间。

    # 从所有Pod列表中筛选出名字中包含qwen-fluid的Pod,并提取出Pod的名称赋值给变量POD_NAME。
    POD_NAME=$(kubectl get po |grep qwen-fluid|awk -F " " '{print $1}')
    # 查看应用程序服务器准备就绪所花费的时间
    kubectl logs $POD_NAME |grep -i "server ready takes"

    预期输出:

    server ready takes 25.875763 s

    输出结果显示使用Fluid数据加速后应用就绪时间仅为25.875763s。具体加速效果与您的应用、数据集大小以及环境配置有关,本数据仅供参考。

    如需了解JindoRuntime加速效果的详细信息,请参见JindoFS加速OSS文件访问

相关文档

如需了解数据加速Fluid的更多信息,请参见数据加速Fluid概述