基于ACK使用vLLM部署Qwen模型推理服务

本文以Qwen1.5-4B-Chat模型、GPU类型为T4和A10卡为例,演示如何在ACK中使用vLLM(Versatile Large Language Model)框架部署通义千问(Qwen)模型推理服务。

背景信息

Qwen1.5-4B-Chat

Qwen1.5-4B-Chat是阿里云基于Transformer大语言模型研发的40亿参数模型,模型在超大规模的预训练数据(预训练数据类型多样且覆盖广泛,包括大量网络文本、专业书籍、代码等)上进行训练得到。更多模型信息,请参见Qwen GitHub代码库

vLLM

vLLM是一个高效易用的大语言模型推理服务框架,vLLM支持包括通义千问在内的多种常见大语言模型。vLLM通过PagedAttention优化、动态批量推理(Continuous Batching)、模型量化等优化技术,可以取得较好的大语言模型推理效率。更多关于vLLM框架的信息,请参见vLLM GitHub代码库

前提条件

  • 已创建包含GPU节点的ACK集群Pro版,且集群版本为1.22及以上,GPU节点显存需为16GB及以上。具体操作,请参见创建ACK托管集群

    建议GPU节点使用525版本驱动,您可以通过为GPU节点池添加标签ack.aliyun.com/nvidia-driver-version:525.105.17指定驱动版本为525.105.17。具体操作,请参见通过指定版本号自定义节点GPU驱动版本

  • 已安装最新版Arena客户端。具体操作,请参见配置Arena客户端

步骤一:准备模型数据

本文以Qwen1.5-4B-Chat模型为例,演示如何下载模型、上传模型至OSS,以及在ACK集群中创建对应的存储卷PV和存储卷声明PVC。

如需上传模型至NAS,请参见使用NAS静态存储卷

  1. 下载模型文件。

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

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

      # 可执行yum install git-lfs或apt install git-lfs安装。
      yum install git-lfs
    3. 执行以下命令,将ModelScope上的Qwen1.5-4B-Chat仓库克隆到本地。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git
    4. 执行以下命令,进入Qwen1.5-4B-Chat目录,下载LFS管理的大文件。

      cd Qwen1.5-4B-Chat
      git lfs pull
  2. 将下载的Qwen1.5-4B-Chat文件上传至OSS。

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

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

    2. 安装和配置ossutil,用于管理OSS资源。具体操作,请参见安装ossutil

    3. 执行以下命令,在OSS创建名为Qwen1.5-4B-Chat的目录。

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

      ossutil cp -r ./Qwen1.5-4B-Chat oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
  3. 为目标集群配置存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷

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

      配置项

      说明

      存储卷类型

      OSS

      名称

      llm-model

      访问证书

      配置用于访问OSS的AccessKey ID和AccessKey Secret。

      Bucket ID

      选择已创建的OSS Bucket。

      OSS Path

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

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

      配置项

      说明

      存储声明类型

      OSS

      名称

      llm-model

      分配模式

      选择已有存储卷

      已有存储卷

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

步骤二:部署推理服务

大模型对显存资源需求较高,因此在生产环境中,推荐您采用性能卓越的A10机型以确保最佳运行效果。若是出于测试目的,您可以选择具备较高普及度和成本效益的T4机型,但T4的性能表现可能与A10存在较大差距。

  1. 执行以下命令,基于vLLM模型推理框架部署Qwen1.5-4B-Chat模型的推理服务。

    您可以将模型参数文件看作是一种特殊类型的数据集合,利用Arena提供的--data参数,将模型挂载到推理服务容器的指定位置。本文以挂载到/model/Qwen1.5-4B-Chat为例。--max_model_len设置了该模型最大可处理的Token长度,增大该配置项可获得更好的模型对话效果,但是可能会占用更多GPU显存资源。vLLM框架支持的完整参数列表,请参见vLLM Github代码库

    单卡A10环境

    arena serve custom \
        --name=vllm-qwen-4b-chat \
        --version=v1 \
        --gpus=1 \
        --replicas=1 \
        --restful-port=8000 \
        --readiness-probe-action="tcpSocket" \
        --readiness-probe-action-option="port: 8000" \
        --readiness-probe-option="initialDelaySeconds: 30" \
        --readiness-probe-option="periodSeconds: 30" \
        --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/vllm:0.4.1-ubuntu22.04 \
        --data=llm-model:/model/Qwen1.5-4B-Chat \
        "python3 -m vllm.entrypoints.openai.api_server --trust-remote-code --model /model/Qwen1.5-4B-Chat/ --gpu-memory-utilization 0.95 --max-model-len 16384"

    单卡T4环境

    arena serve custom \
        --name=vllm-qwen-4b-chat \
        --version=v1 \
        --gpus=1 \
        --replicas=1 \
        --restful-port=8000 \
        --readiness-probe-action="tcpSocket" \
        --readiness-probe-action-option="port: 8000" \
        --readiness-probe-option="initialDelaySeconds: 30" \
        --readiness-probe-option="periodSeconds: 30" \
        --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/vllm:0.4.1-ubuntu22.04 \
        --data=llm-model:/model/Qwen1.5-4B-Chat \
        "python3 -m vllm.entrypoints.openai.api_server --trust-remote-code --model /model/Qwen1.5-4B-Chat/ --gpu-memory-utilization 0.95 --max-model-len 8192 --dtype half"

    参数说明如下所示:

    参数

    说明

    --name

    指定推理服务名称。

    --version

    指定推理服务版本。

    --gpus

    指定单个推理服务副本需要使用的GPU卡数。

    --replicas

    指定推理服务副本数。

    --restful-port

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

    --readiness-probe-action

    指定就绪探针连接类型,支持HttpGet、Exec、gRPC、TCPSocket。

    --readiness-probe-action-option

    指定就绪探针连接方式。

    --readiness-probe-option

    指定就绪探针配置。

    --data

    挂载共享存储卷PVC到运行环境中。它由两部分组成,通过英文冒号(:)分割。冒号左侧是您已经准备好的PVC名称。您可以通过命令arena data list查看当前集群可用的PVC列表;冒号右侧是您想将PVC的挂载到运行环境中的路径,也是您训练代码要读取数据或模型的本地路径。这样通过挂载的方式,您的代码就可以访问PVC中的数据或模型。

    --image

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

    预期输出:

    service/vllm-qwen-4b-chat-v1 created
    deployment.apps/vllm-qwen-4b-chat-v1-custom-serving created
    INFO[0008] The Job vllm-qwen-4b-chat has been submitted successfully
    INFO[0008] You can run `arena serve get vllm-qwen-4b-chat --type custom-serving -n default` to check the job status

    输出结果表明已经成功部署了一个与vLLM相关的服务及其配套的Deployment和Job。

  2. 执行以下命令,查看推理服务的详细信息。

    arena serve get vllm-qwen-4b-chat

    预期输出:

    Name:       vllm-qwen-4b-chat
    Namespace:  default
    Type:       Custom
    Version:    v1
    Desired:    1
    Available:  1
    Age:        36m
    Address:    172.16.XX.XX
    Port:       RESTFUL:8000
    GPU:        1
    
    Instances:
      NAME                                                  STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                                  ------   ---  -----  --------  ---  ----
      vllm-qwen-4b-chat-v1-custom-serving-6d7c786b9f-z6nfk  Running  36m  1/1    0         1    cn-beijing.192.168.XX.XX

    输出结果表明该推理服务正在稳定运行,且已准备好提供服务。

步骤三:验证推理服务

  1. 执行以下命令,在推理服务与本地环境之间建立端口转发。

    重要

    请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress概述

    kubectl port-forward svc/vllm-qwen-4b-chat-v1 8000:8000

    预期输出:

    Forwarding from 127.0.0.1:8000 -> 8000
    Forwarding from [::1]:8000 -> 8000
  2. 执行以下命令,向Triton模型推理服务发送了一条示例的模型推理请求。

    curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json"  -d '{"model": "/model/Qwen1.5-4B-Chat/", "messages": [{"role": "user", "content": "测试一下"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}'

    预期输出:

    {"id":"cmpl-503270b21fa44db2b6b3c3e0abaa3c02","object":"chat.completion","created":1717141209,"model":"/model/Qwen1.5-4B-Chat/","choices":[{"index":0,"message":{"role":"assistant","content":"好的,请问您需要测试什么?"},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":30,"completion_tokens":9}}

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

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

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

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

    arena serve delete vllm-qwen-4b-chat
  • 执行以下命令,删除已创建的PV和PVC。

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