本文以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静态存储卷。
下载模型文件。
执行以下命令,安装Git。
# 可执行yum install git或apt install git安装。 yum install git
执行以下命令,安装Git LFS(Large File Support)插件。
# 可执行yum install git-lfs或apt install git-lfs安装。 yum install git-lfs
执行以下命令,将ModelScope上的Qwen1.5-4B-Chat仓库克隆到本地。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git
执行以下命令,进入Qwen1.5-4B-Chat目录,下载LFS管理的大文件。
cd Qwen1.5-4B-Chat git lfs pull
将下载的Qwen1.5-4B-Chat文件上传至OSS。
为目标集群配置存储卷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
。
执行以下命令,创建工作目录。
mkdir triton-vllm
执行以下命令,创建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
执行以下命令,创建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作为模型推理框架。
执行以下命令,将环境变量
triton_config_file
和model_config_file
分别指向步骤二中创建的Triton配置文件和vLLM配置文件,便于在不同环境下灵活配置和部署模型推理服务,而无需硬编码文件路径到每个命令或脚本中。export triton_config_file="triton-vllm/config.pbtxt" export model_config_file="triton-vllm/model.json"
执行以下命令,部署推理服务。
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
输出结果表明推理服务已成功部署。
执行下列命令,查看推理服务的详细信息,等待服务就绪。
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)正在稳定运行,且已准备好提供服务。
步骤四:验证推理服务
执行以下命令,建立推理服务与本地环境之间的端口转发。
重要请注意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
执行以下命令,向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