本文以Qwen1.5-4B-Chat模型、GPU类型为A10和T4卡为例,演示如何在ACK中使用rtp-llm框架部署通义千问(Qwen)模型推理服务。
背景信息
Qwen1.5-4B-Chat
Qwen1.5-4B-Chat是阿里云基于Transformer大语言模型研发的40亿参数模型,模型在超大规模的预训练数据(预训练数据类型多样且覆盖广泛,包括大量网络文本、专业书籍、代码等)上进行训练得到。更多模型信息,请参见Qwen GitHub代码库。
rtp-llm
rtp-llm是阿里巴巴大模型预测团队专为大语言模型(Large Language Models, LLM)设计的推理加速引擎,旨在提升模型推理的效率和性能。rtp-llm具备如下特性:
高性能的CUDA内核,包括PagedAttention、FlashAttention、FlashDecoding等。
具备WeightOnly INT8和WeightOnly INT4的量化技术。
支持GPTQ(General Purpose Quantization)和AWQ(Approximate Weight Quantization)等流行的算法。
自适应KVCache量化框架,特别是对动态凑批的中的开销进行了细致优化。
对V100的硬件特性进行了特别调优。
详细信息,请参见rtp-llm。
前提条件
已创建包含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静态存储卷。
下载模型文件。
执行以下命令,安装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。
步骤二:部署推理服务
执行以下命令,部署Qwen1.5-4B-Chat模型的推理服务。
通过Arena部署一个自定义类型的推理服务。该服务名称为rtp-llm-qwen,版本为v1,需要使用一个GPU,副本数为1,并且配置了就绪检测。模型是一种特殊类型的数据,因此采用
--data
参数将已创建的模型PVCllm-model
挂载到了容器中/model/Qwen1.5-4B-Chat
目录下。单卡A10环境
arena serve custom \ --name=rtp-llm-qwen \ --version=v1 \ --gpus=1 \ --replicas=1 \ --readiness-probe-action="tcpSocket" \ --readiness-probe-action-option="port: 8000" \ --readiness-probe-option="initialDelaySeconds: 30" \ --readiness-probe-option="periodSeconds: 30" \ --restful-port=8000 \ --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/rtp_llm:0.1.12-cuda12-ubuntu22.04 \ --data=llm-model:/model/Qwen1.5-4B-Chat \ "MODEL_TYPE=qwen_2 START_PORT=8000 CHECKPOINT_PATH=/model/Qwen1.5-4B-Chat TOKENIZER_PATH=/model/Qwen1.5-4B-Chat python3 -m maga_transformer.start_server"
单卡T4环境
arena serve custom \ --name=rtp-llm-qwen \ --version=v1 \ --gpus=1 \ --replicas=1 \ --readiness-probe-action="tcpSocket" \ --readiness-probe-action-option="port: 8000" \ --readiness-probe-option="initialDelaySeconds: 30" \ --readiness-probe-option="periodSeconds: 30" \ --restful-port=8000 \ --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/rtp_llm:0.1.12-cuda12-ubuntu22.04 \ --data=llm-model:/model/Qwen1.5-4B-Chat \ "MODEL_TYPE=qwen_2 START_PORT=8000 CHECKPOINT_PATH=/model/Qwen1.5-4B-Chat TOKENIZER_PATH=/model/Qwen1.5-4B-Chat MAX_SEQ_LEN=2048 python3 -m maga_transformer.start_server"
参数说明如下所示:
参数
说明
--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/rtp-llm-qwen-v1 created deployment.apps/rtp-llm-qwen-v1-custom-serving created INFO[0001] The Job rtp-llm-qwen has been submitted successfully INFO[0001] You can run `arena serve get rtp-llm-qwen --type custom-serving -n default` to check the job status
输出结果表明推理服务已成功部署。
执行下列命令,查看推理服务的详细信息,并等待服务就绪。
arena serve get rtp-llm-qwen
预期输出:
Name: rtp-llm-qwen Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 1h Address: 192.168.XX.XX Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- rtp-llm-qwen-v1-custom-serving-696f699485-mn56v Running 1h 1/1 0 1 cn-beijing.192.168.XX.XX
输出结果表明该推理服务的一个Pod(rtp-llm-qwen-v1-custom-serving-696f699485-mn56v)正在稳定运行,且已准备好提供服务。
步骤三:验证推理服务
执行以下命令,在推理服务与本地环境之间建立端口转发。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress概述。
kubectl port-forward svc/rtp-llm-qwen-v1 8000:8000
预期输出:
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000
执行以下命令,向模型推理服务发送一条模型推理请求。
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":"chat-","object":"chat.completion","created":1717383026,"model":"AsyncModel","choices":[{"index":0,"message":{"role":"assistant","content":"好的,请问您有什么测试需要我进行呢"},"finish_reason":"stop"}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}
输出结果表明模型可以根据给定的输入(在这个例子中是一条测试消息)生成相应的回复。
(可选)步骤四:清理环境
如果不再使用已创建的资源,请及时清理。
执行以下命令,删除已部署的模型推理服务。
arena serve del rtp-llm-qwen
执行以下命令,删除已创建的PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model