部署vLLM推理应用

vLLM(Vectorized Large Language Model)是一个高性能的大型语言模型推理库,支持多种模型格式和后端加速,适用于大规模语言模型的推理服务部署。本文以Qwen-7B-Chat-Int8模型、GPU类型为V100卡为例,演示如何部署一个vLLM推理服务。

说明

关于vLLM的详细信息,请参见vllm-project

前提条件

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

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

  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
  3. 为目标集群配置名为llm-model的存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷

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

      配置项

      说明

      存储卷类型

      OSS

      名称

      llm-model

      访问证书

      配置用于访问OSSAccessKey IDAccessKey Secret。

      Bucket ID

      选择步骤2中创建的OSS Bucket。

      OSS Path

      选择模型所在的路径,如/Qwen-7B-Chat-Int8。

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

      配置项

      说明

      存储声明类型

      OSS

      名称

      llm-model

      分配模式

      选择已有存储卷

      已有存储卷

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

步骤二:部署推理服务

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

    arena top node

    输出结果会显示可用于运行推理服务的GPU节点个数。

  2. 执行以下命令,启动名称为vllm的推理服务。

    arena serve kserve \
        --name=qwen \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
        --gpus=1 \
        --cpu=4 \
        --memory=12Gi \
        --data="llm-model:/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"

    参数说明如下所示:

    参数

    是否必选

    说明

    --name

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

    --image

    推理服务的镜像地址。

    --gpus

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

    --cpu

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

    --memory

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

    --data

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

    预期输出:

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

    输出结果表明推理服务已部署成功。

步骤三:验证推理服务

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

    arena serve get qwen

    预期输出:

    展开查看推理服务的部署情况

    Name:       qwen
    Namespace:  default
    Type:       KServe
    Version:    1
    Desired:    1
    Available:  1
    Age:        2m
    Address:    http://qwen-default.example.com
    Port:       :80
    GPU:        1
    
    
    Instances:
      NAME                             STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                             ------   ---  -----  --------  ---  ----
      qwen-predictor-5485d6d8d5-kvj7g  Running  2m   1/1    0         1    cn-beijing.XX.XX.XX.XX

    输出结果表明,KServe推理服务部署成功,模型访问地址为http://qwen-default.example.com

  2. 执行以下命令,使用获取到的Nginx Ingress网关地址访问推理服务。

    # 获取Nginx ingressIP地址。
    NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
    # 获取Inference ServiceHostname。
    SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    # 发送请求访问推理服务。
    curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_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-b7579597aa284f118718b22b83b726f8","object":"chat.completion","created":1715589652,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"好的,请问您有什么需要测试的?<|im_end|>"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":20,"completion_tokens":10}}% 

    输出结果表明请求被正确地发送到了服务,并且服务返回了一个预期的JSON响应。

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

重要

在执行删除操作前,请确保不再需要该服务及其相关资源。

执行以下命令,删除推理服务。

arena serve delete qwen

相关文档