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

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

背景信息

Qwen1.5-4B-Chat

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

Triton(Triton Inference Server)

Triton(Triton Inference Server)是NVIDIA开源的一个推理服务框架,可以帮助您快速搭建AI推理应用。Triton支持多种不同的机器学习框架作为它的运行时后端,包括TensorRT、TensorFlow、PyTorch、ONNX、vLLM等。Triton面向实时推理、批量推理以及音视频流式推理场景进行了许多优化,在推理时能获得更好的性能。Triton的核心功能包括:

  • 支持多种机器学习和深度学习运行时框架

  • 支持并发模型执行

  • 动态Batching

  • 支持暴露GPU利用率、请求延时、请求吞吐量等核心推理服务指标

更多关于Triton推理服务框架的信息,请参考Triton Inference Server 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。

如需使用其他模型,请参见vLLM支持的模型列表;如需上传模型至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。

步骤二:配置Triton推理服务框架

以下是创建Triton推理服务框架所需的vLLM配置文件config.pbtxt和Triton配置文件model.json

  1. 执行以下命令,创建工作目录。

    mkdir triton-vllm
  2. 执行以下命令,创建vLLM配置文件config.pbtxt

    cat << EOF > triton-vllm/config.pbtxt
    backend: "vllm"
    
    # The usage of device is deferred to the vLLM engine
    instance_group [
      {
        count: 1
        kind: KIND_MODEL
      }
    ]
    
    version_policy: { all { }}
    EOF
  3. 执行以下命令,创建Triton配置文件model.json

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

    单卡A10环境

    cat << EOF > triton-vllm/model.json
    {
        "model":"/model/Qwen1.5-4B-Chat",
        "disable_log_requests": "true",
        "gpu_memory_utilization": 0.95,
        "trust_remote_code": "true",
        "max_model_len": 16384
    }
    EOF

    在以上配置文件中,通过max_model_len参数可配置模型最大可处理的Token长度,增大该参数可获得更好的模型对话效果,但是可能会占用更多GPU显存资源。使用vLLM + Triton推理服务框架的完整配置,请参见GitHub官方示例文档

    单卡T4环境

    cat << EOF > triton-vllm/model.json
    {
        "model":"/model/Qwen1.5-4B-Chat",
        "disable_log_requests": "true",
        "gpu_memory_utilization": 0.95,
        "trust_remote_code": "true",
        "dtype": "half",
        "max_model_len": 8192
    }
    EOF

    在以上配置文件中,使用max_model_len参数可以设置模型最大可处理的Token长度,增大该参数可以获得更好的模型对话效果,但是可能会占用更多GPU显存资源。通过dtype参数可以设置模型加载时使用的浮点数精度,由于T4 GPU暂不支持bfloat16(bf16)精度,因此在上述配置中将dtype设置为半精度浮点数(half)。使用vLLM + Triton推理服务框架的完整配置,请参考GitHub官方示例文档

步骤三:部署推理服务

以下使用Arena部署Qwen1.5-4B-Chat模型的推理服务。该推理服务使用Triton作为推理服务框架,使用vLLM作为模型推理框架。

  1. 执行以下命令,将环境变量triton_config_filemodel_config_file分别指向步骤二中创建的Triton配置文件和vLLM配置文件,便于在不同环境下灵活配置和部署模型推理服务,而无需硬编码文件路径到每个命令或脚本中。

    export triton_config_file="triton-vllm/config.pbtxt"
    export model_config_file="triton-vllm/model.json"
  2. 执行以下命令,部署推理服务。

    arena serve triton \
        --name=triton-vllm \
        --version=v1 \
        --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/tritonserver:24.04-vllm-python-py3-ubuntu22.04 \
        --gpus=1 \
        --cpu=6 \
        --memory=30Gi \
        --data="llm-model:/model/Qwen1.5-4B-Chat" \
        --model-repository /triton-config \
        --config-file="$model_config_file:/triton-config/qwen-4b/1/model.json" \
        --config-file="$triton_config_file:/triton-config/qwen-4b/config.pbtxt" \
        --http-port=8000 \
        --grpc-port=9000 \
        --allow-metrics=true

    参数说明如下所示:

    参数

    说明

    --name

    指定推理服务名称。

    --version

    指定推理服务版本。

    --image

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

    --gpus

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

    --cpu

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

    --memory

    指定单个推理服务副本需要使用的内存。

    --data

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

    --config-file

    挂载本地的配置文件到运行环境中。它由两部分组成,通过英文冒号(:)分割。冒号左侧是您已经准备好的本地文件;冒号右侧是本地文件挂载到运行环境中的路径。

    --model-repository

    Triton的模型仓库目录,模型仓库目录下可以包含多个子目录,每个子目录代表一个待加载到Triton推理服务框架中的一个模型,每个子目录下应当包含对应模型的配置文件。更多详细信息,请参见Triton官方文档

    --http-port

    Triton推理服务暴露的HTTP端口。

    --grpc-port

    Triton推理服务暴露的gRPC端口。

    --allow-metrics

    是否暴露Triton推理服务的监控指标。

    预期输出:

    configmap/triton-vllm-v1-4bd5884e6b5b6a3 created
    configmap/triton-vllm-v1-7815124a8204002 created
    service/triton-vllm-v1-tritoninferenceserver created
    deployment.apps/triton-vllm-v1-tritoninferenceserver created
    INFO[0007] The Job triton-vllm has been submitted successfully
    INFO[0007] You can run `arena serve get triton-vllm --type triton-serving -n default` to check the job status

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

  3. 执行下列命令,查看推理服务的详细信息,等待服务就绪。

    arena serve get triton-vllm

    预期输出:

    Name:       triton-vllm
    Namespace:  default
    Type:       Triton
    Version:    v1
    Desired:    1
    Available:  1
    Age:        3m
    Address:    172.16.XX.XX
    Port:       RESTFUL:8000,GRPC:9000
    GPU:        1
    
    Instances:
      NAME                                                  STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                                  ------   ---  -----  --------  ---  ----
      triton-vllm-v1-tritoninferenceserver-b69cb7759-gkwz6  Running  3m   1/1    0         1    cn-beijing.172.16.XX.XX

    输出结果表明该推理服务的一个Pod(triton-vllm-v1-tritoninferenceserver-b69cb7759-gkwz6)正在稳定运行,且已准备好提供服务。

步骤四:验证推理服务

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

    重要

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

    kubectl port-forward svc/triton-vllm-v1-tritoninferenceserver 8000:8000

    预期输出:

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

    curl -X POST localhost:8000/v2/models/qwen-4b/generate -d '{"text_input": "什么是人工智能?人工智能是", "parameters": {"stream": false, "temperature": 0}}'

    请将上述命令中URL路径的qwen-4b替换为实际推理服务配置的模型名。

    预期输出:

    {"model_name":"qwen-4b","model_version":"1","text_output":"什么是人工智能?人工智能是计算机科学的一个分支,它研究如何使计算机具有智能行为。人工智能的目标"}

    输出结果表明模型可以根据提问自动生成关于人工智能的定义。

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

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

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

    arena serve del triton-vllm
  • 执行以下命令,清理已创建的PV和PVC。

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