本文以Qwen1.5-4B-Chat模型、GPU类型为A10卡为例,演示如何在ACK中使用Hugging Face的TGI(Text Generation Inference)框架部署Qwen(千问)模型推理服务。
背景信息
Qwen1.5-4B-Chat
Qwen1.5-4B-Chat是阿里云基于Transformer大语言模型研发的40亿参数模型,模型在超大规模的预训练数据(预训练数据类型多样且覆盖广泛,包括大量网络文本、专业书籍、代码等)上进行训练得到。更多模型信息,请参见Qwen GitHub代码库。
TGI(Text Generation Inference)
TGI是Hugging Face开源的用于部署大语言模型推理服务的工具,能够简单快速的部署常见的大语言模型,支持Flash Attention、Paged Attention、Continuous batching、 Tensor parallelism等功能来加速推理性能,更多信息,请参见TGI官方文档。
前提条件
已创建包含A10卡GPU的Kubernetes集群,且集群版本为1.22及以上。具体操作,请参见为集群添加GPU节点。
建议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静态存储卷。
-
下载模型文件。
-
执行以下命令,安装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。具体操作,请参见使用ossfs 1.0静态存储卷。
-
以下为示例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。
-
步骤二:部署推理服务
TGI不支持旧型号的GPU卡(例如V100、T4等),需要您将推理服务部署到A10或者更新架构的GPU节点上。
执行下列命令,通过Arena部署一个自定义类型的推理服务。
部署的推理服务名称为
tgi-qwen-4b-chat,版本为v1,需要使用一个GPU,副本数为1,并且配置就绪检测。模型是一种特殊类型的数据,因此可以使用--data参数将已创建的模型PVC挂载到容器中的/model/Qwen1.5-4B-Chat目录下。arena serve custom \ --name=tgi-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/text-generation-inference:2.0.2-ubuntu22.04 \ --data=llm-model:/model/Qwen1.5-4B-Chat \ "text-generation-launcher --model-id /model/Qwen1.5-4B-Chat --num-shard 1 -p 8000"参数说明如下所示:
参数
说明
示例值
serve customArena子命令。表示创建一个自定义的模型服务,而不是使用预设的类型(如
tfserving,triton)。(无)
--name服务名称。为要部署的服务指定一个唯一的名称。名称将用于后续的管理操作,如查看日志、删除服务等。
modelscope--version服务版本。为服务指定一个版本号,方便进行版本管理和灰度发布等操作。
v1--gpusGPU资源。为每个服务实例(Pod)分配的GPU卡数量。如果模型需要GPU进行推理,则必须指定此参数。
1--replicas副本数量。指定服务的实例(Pod)数量。增加副本数可以提高服务的并发处理能力和可用性。
1--restful-portRESTful端口。指定服务对外暴露的RESTful API端口号,用于接收推理请求。
8000--readiness-probe-action就绪探针类型。设置Kubernetes的就绪探针(Readiness Probe)的检查方式,用于判断容器是否准备好接收流量。
tcpSocket--readiness-probe-action-option探针类型选项。为上述探针类型提供具体参数。对于
tcpSocket,指定要检查的端口。port: 8000--readiness-probe-option探针其他选项。设置就绪探针的更多行为参数,可以多次使用。示例设置了初始延迟和检查周期。
initialDelaySeconds: 30periodSeconds: 30--data数据卷挂载。将一个持久化数据卷(PVC)挂载到容器的指定路径。格式为
PVC名称:挂载路径。常用于挂载模型文件。llm-model:/Qwen1.5-4B-Chat--image容器镜像。指定用于部署服务的容器镜像的完整地址,是服务运行环境的核心。
kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/quick-deploy-llm:v1[COMMAND]启动命令。指定容器启动后要执行的命令。设置环境变量
MODEL_ID并启动了server.py脚本。"MODEL_ID=/Qwen1.5-4B-Chat python3 server.py"预期输出:
service/tgi-qwen-4b-chat-v1 created deployment.apps/tgi-qwen-4b-chat-v1-custom-serving created INFO[0001] The Job tgi-qwen-4b-chat has been submitted successfully INFO[0001] You can run `arena serve get tgi-qwen-4b-chat --type custom-serving -n default` to check the job status输出结果表明推理服务已成功部署。
执行下列命令,查看推理服务详细信息。
arena serve get tgi-qwen-4b-chat预期输出:
Name: tgi-qwen-4b-chat Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 3m Address: 172.16.XX.XX Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- tgi-qwen-4b-chat-v1-custom-serving-67b58c9865-m89lq Running 3m 1/1 0 1 cn-beijing.192.168.XX.XX输出结果表明该推理服务的一个Pod(tgi-qwen-4b-chat-v1-custom-serving-67b58c9865-m89lq)正在稳定运行,且已准备好提供服务。
步骤三:验证推理服务
执行以下命令,在推理服务与本地环境之间建立端口转发。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理。
kubectl port-forward svc/tgi-qwen-4b-chat-v1 8000:8000预期输出:
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000执行以下命令,向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":"","object":"text_completion","created":1716274541,"model":"/model/Qwen1.5-4B-Chat","system_fingerprint":"2.0.2-sha-6073ece","choices":[{"index":0,"message":{"role":"assistant","content":"好的,请问您有什么需要测试的吗?"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":21,"completion_tokens":10,"total_tokens":31}}输出结果表明模型可以根据给定的输入(在这个例子中是一条测试消息)生成相应的回复。
(可选)步骤四:清理环境
如果不再使用已创建的资源,请及时清理。
执行以下命令,删除已部署的模型推理服务。
arena serve delete tgi-qwen-4b-chat执行以下命令,删除已创建的PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model