部署GPU共享推理服务

在某些场景下,您可能需要将多个模型推理任务共享在同一块GPU以提高GPU的利用率。本文以模型类型为Qwen1.5-0.5B-Chat,GPU类型为V100卡为例,演示如何使用KServe部署GPU共享的模型推理服务。

前提条件

步骤一:准备模型数据

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

  1. 下载模型。本文以Qwen1.5-0.5B-Chat模型为例。

    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen1.5-0.5B-Chat.git
    cd Qwen1.5-0.5B-Chat.git
    git lfs pull
  2. 将下载的Qwen1.5-0.5B-Chat文件上传至OSS。

    说明

    关于ossutil工具的安装和使用方法,请参见安装ossutil

    ossutil mkdir oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat
    ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat
  3. 为目标集群配置名为llm-model的存储卷PV和存储声明PVC。

    • 以下为示例PV的基本配置信息:

      配置项

      说明

      存储卷类型

      OSS

      名称

      llm-model

      访问证书

      配置用于访问OSSAccessKey IDAccessKey Secret。

      Bucket ID

      选择上一步所创建的OSS Bucket。

      OSS Path

      选择模型所在的路径,如/Qwen1.5-0.5B-Chat。

    • 以下为示例PVC的基本配置信息:

      配置项

      说明

      存储声明类型

      OSS

      名称

      llm-model

      分配模式

      选择已有存储卷

      已有存储卷

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

步骤二:部署推理服务

启动两个Qwen推理服务,每个推理服务需使用6 GB显存。

启动第二个Qwen推理服务时,只需要执行相同命令并将--name=qwen1改为--name=qwen2即可。
arena serve kserve \
    --name=qwen1 \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
    --gpumemory=6 \
    --cpu=3 \
    --memory=8Gi \
    --data="llm-model:/mnt/models/Qwen1.5-0.5B-Chat" \
    "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen1.5-0.5B-Chat --dtype=half --max-model-len=4096"

参数说明如下所示:

参数

是否必选

说明

--name

提交的推理服务名称,全局唯一。

--image

推理服务的镜像地址。

--gpumemory

申请显存大小(如--gpumemory=6),请确保各服务显存总和不超过GPU总显存。

--cpu

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

--memory

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

--data

推理服务的模型地址,本文指定模型的存储卷为llm-model,挂载到容器的/mnt/models/目录下。

步骤三:验证推理服务

  1. 查看两个Qwen推理服务部署情况。

    kubectl get pod -owide |grep qwen

    预期输出:

    qwen1-predictor-856568bdcf-5pfdq   1/1     Running   0          7m10s   10.130.XX.XX   cn-beijing.172.16.XX.XX   <none>           <none>
    qwen2-predictor-6b477b587d-dpdnj   1/1     Running   0          4m3s    10.130.XX.XX   cn-beijing.172.16.XX.XX   <none>           <none>

    可以看到,qwen1qwen2被成功部署到同一个GPU节点cn-beijing.172.16.XX.XX 上。

  2. 分别执行以下两条命令,进入两个推理服务所在的Pod中,查看Pod所分配的GPU显存大小。

    kubectl exec -it qwen1-predictor-856568bdcf-5pfdq  -- nvidia-smi # 进入第一个推理服务所在的pod。
    kubectl exec -it qwen2-predictor-6b477b587d-dpdnj  -- nvidia-smi # 进入第二个推理服务所在的pod。

    预期输出:

    • 第一个推理服务所分配的显存大小

      Fri Jun 28 06:20:43 2024       
      +---------------------------------------------------------------------------------------+
      | NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
      |-----------------------------------------+----------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
      |                                         |                      |               MIG M. |
      |=========================================+======================+======================|
      |   0  Tesla V100-SXM2-16GB           On  | 00000000:00:07.0 Off |                    0 |
      | N/A   39C    P0              53W / 300W |   5382MiB /  6144MiB |      0%      Default |
      |                                         |                      |                  N/A |
      +-----------------------------------------+----------------------+----------------------+
                                                                                               
      +---------------------------------------------------------------------------------------+
      | Processes:                                                                            |
      |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
      |        ID   ID                                                             Usage      |
      |=======================================================================================|
      +---------------------------------------------------------------------------------------+
    • 第二个推理服务所分配的显存大小

      Fri Jun 28 06:40:17 2024       
      +---------------------------------------------------------------------------------------+
      | NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
      |-----------------------------------------+----------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
      |                                         |                      |               MIG M. |
      |=========================================+======================+======================|
      |   0  Tesla V100-SXM2-16GB           On  | 00000000:00:07.0 Off |                    0 |
      | N/A   39C    P0              53W / 300W |   5382MiB /  6144MiB |      0%      Default |
      |                                         |                      |                  N/A |
      +-----------------------------------------+----------------------+----------------------+
                                                                                               
      +---------------------------------------------------------------------------------------+
      | Processes:                                                                            |
      |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
      |        ID   ID                                                             Usage      |
      |=======================================================================================|
      +---------------------------------------------------------------------------------------+

    输出结果表明,两个Pod的显存上限均为6 GB,表明每个Pod分配了6 GB的显存。可以判断出节点GPU显存已被成功分配给了这两个推理服务所在的Pod。

  3. 获取到的Nginx Ingress网关地址访问推理服务。

    curl -H "Host: $(kubectl get inferenceservice qwen1 -o jsonpath='{.status.url}' | cut -d "/" -f 3)" \
         -H "Content-Type: application/json" \
         http://$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'):80/v1/chat/completions \
         -d '{
                "model": "qwen", 
                "messages": [{"role": "user", "content": "测试一下"}], 
                "max_tokens": 10, 
                "temperature": 0.7, 
                "top_p": 0.9, 
                "seed": 10
             }'
    

    预期输出:

    {"id":"cmpl-bbca59499ab244e1aabfe2c354bf6ad5","object":"chat.completion","created":1719303373,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"好的,请问您需要测试什么内容呢?"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}

    输出结果表明模型可以根据给定的输入(在这个例子中是一条测试消息)生成相应的回复。

(可选)步骤四:清理环境

如果不再使用已创建的资源,请及时清理。

  • 执行以下命令,删除已部署的模型推理服务。

    arena serve delete qwen1
    arena serve delete qwen2
  • 执行以下命令,删除已创建的PVPVC。

    kubectl delete pvc llm-model
    kubectl delete pv llm-model