部署模型时,您可以根据自身需求选择模型来源以及部署模型的平台。本文以Qwen1.5-4B-Chat模型、GPU类型为T4卡为例,演示如何在ACK中快速部署ModelScope模型、HuggingFace模型及本地模型。
本教程使用FastAPI和Uvicorn框架部署模型,仅适用于快速体验模型功能,不建议在生产环境中使用。如需在生产环境部署LLM模型,建议使用vLLM、Triton等成熟的推理服务框架。详细信息,请参见使用vLLM部署Qwen模型推理服务、使用Triton部署Qwen模型推理服务。
模型介绍
ModelScope
ModelScope汇集了行业领先的预训练模型,可以减少开发者的重复研发成本,提供绿色环保、开源开放的AI开发环境和模型服务。ModelScope平台以开源的方式提供了诸多优质模型,您可以在ModelScope免费体验与下载使用。更多信息,请参见ModelScope概览介绍。
HuggingFace
HuggingFace拥有超过350,000个模型、75,000个数据集以及150,000个演示应用程序的平台,所有模型、数据集及应用程序均开源,您可以在HuggingFace上共同构建机器学习项目。更多信息,请参见HuggingFace文档。
前提条件
已创建包含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客户端。
部署ModelScope模型
步骤一:部署推理服务
执行以下命令,通过Arena部署一个自定义类型的服务。该服务名称为modelscope,版本号为v1。
应用启动后程序会自动从ModelScope下载名为
qwen/Qwen1.5-4B-Chat
的模型。如需修改为其他模型可以修改启动参数里的MODEL_ID
字段,可以通过环境变量DASHSCOPE_API_KEY
配置ModelScope SDK Token信息。重要ModelScope模型将会下载到容器内,因此GPU节点磁盘空间至少需要预留30 GB。
arena serve custom \ --name=modelscope \ --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=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/quick-deploy-llm:v1 \ "MODEL_ID=qwen/Qwen1.5-4B-Chat python3 server.py"
参数说明如下所示:
参数
说明
--name
指定推理服务名称。
--version
指定推理服务版本。
--gpus
指定单个推理服务副本需要使用的GPU卡数。
--replicas
指定推理服务副本数。
--restful-port
指定推理服务对外暴露的端口。
--readiness-probe-action
指定就绪探针连接类型,支持HttpGet、Exec、gRPC、TCPSocket。
--readiness-probe-action-option
指定就绪探针连接方式。
--readiness-probe-option
指定就绪探针配置。
--image
指定推理服务的镜像地址。
预期输出:
service/modelscope-v1 created deployment.apps/modelscope-v1-custom-serving created INFO[0002] The Job modelscope has been submitted successfully INFO[0002] You can run `arena serve get modelscope --type custom-serving -n default` to check the job status
输出结果表明一系列与部署名为
modelscope-v1
的模型服务相关的Kubernetes资源创建操作已成功执行。执行以下命令,查看推理服务的详细信息。
模型下载需要耗费一定时间,因此部署服务后需要等待大约10分钟才能查看推理服务的详细信息。
arena serve get modelscope
预期输出:
Name: modelscope Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 10m Address: 172.16.XX.XX Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- modelscope-v1-custom-serving-5bb85d6555-2p6z9 Running 10m 1/1 0 1 cn-beijing.192.168.XX.XX
输出结果表明
modelscope
推理服务已被成功部署并处于健康运行状态,已经准备就绪可以接受请求,且模型及服务环境已成功配置在具有GPU资源的节点上。
步骤二:验证推理服务
执行以下命令,在推理服务与本地环境之间建立端口转发。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress概述。
kubectl port-forward svc/modelscope-v1 8000:8000
预期输出:
Forwarding from 127.0.0.1:8088 -> 8000 Forwarding from [::1]:8088 -> 8000
执行以下命令,向
modelscope
模型推理服务发送一条模型推理请求。curl -XPOST http://localhost:8000/generate -H "Content-Type: application/json" -d '{"text_input": "什么是人工智能?人工智能是", "parameters": {"stream": false, "temperature": 0.9, "seed": 10}}'
预期输出:
{"model_name":"/root/.cache/modelscope/hub/qwen/Qwen1___5-4B-Chat","text_output":"什么是人工智能?人工智能是研究如何使计算机和机器模仿人类的智能行为来实现自主思考"}
输出结果表明模型可以根据提问自动生成关于人工智能的定义。
(可选)步骤三:清理推理服务
如果不再使用已创建的资源,请执行以下命令,删除已部署的模型推理服务。
arena serve del modelscope
部署HuggingFace模型
步骤一:部署推理服务
确认容器可以访问到HuggingFace仓库。
执行以下命令,通过Arena部署一个自定义类型的服务,该服务名称为huggingface,版本号为v1。
本文通过设定
MODEL_SOURCE
环境变量指定模型仓库为HuggingFace,应用启动后会自动从HuggingFace下载名为qwen/Qwen1.5-4B-Chat
的模型,如需修改为其他HuggingFace模型,请修改启动参数里的MODEL_ID
字段。也支持通过环境变量HUGGINGFACE_TOKEN
配置HugginFace Token信息。重要HuggingFace模型将会下载到容器内,因此GPU节点磁盘空间至少需要预留30 GB。
arena serve custom \ --name=huggingface \ --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=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/quick-deploy-llm:v1 \ "MODEL_ID=Qwen/Qwen1.5-4B-Chat MODEL_SOURCE=Huggingface python3 server.py"
参数说明如下所示:
参数
说明
--name
指定推理服务名称。
--version
指定推理服务版本。
--gpus
指定单个推理服务副本需要使用的GPU卡数。
--replicas
指定推理服务副本数。
--restful-port
指定推理服务对外暴露的端口。
--readiness-probe-action
指定就绪探针连接类型,支持HttpGet、Exec、gRPC、TCPSocket。
--readiness-probe-action-option
指定就绪探针连接方式。
--readiness-probe-option
指定就绪探针配置。
--image
指定推理服务的镜像地址。
预期输出:
service/huggingface-v1 created deployment.apps/huggingface-v1-custom-serving created INFO[0003] The Job huggingface has been submitted successfully INFO[0003] You can run `arena serve get huggingface --type custom-serving -n default` to check the job status
输出结果表明推理服务已成功部署。
执行以下命令,查看推理服务的详细信息。
模型下载需要耗费一定时间,因此部署服务后需要等待大约10分钟才能查看推理服务的详细信息。
arena serve get huggingface
预期输出:
Name: huggingface Namespace: default Type: Custom Version: v1 Desired: 1 Available: 0 Age: 1h Address: 172.16.XX.XX Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- huggingface-v1-custom-serving-dcf6cf6c8-2lqzr Running 1h 1/1 0 1 cn-beijing.192.168.XX.XX
输出结果表明该推理服务的一个Pod(huggingface-v1-custom-serving-dcf6cf6c8-2lqzr)正在稳定运行,且已准备好提供服务。
步骤二:验证推理服务
执行以下命令,在推理服务与本地环境之间建立端口转发。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress概述。
kubectl port-forward svc/huggingface-v1 8000:8000
预期输出:
Forwarding from 127.0.0.1:8088 -> 8000 Forwarding from [::1]:8088 -> 8000
执行以下命令,向HuggingFace模型推理服务发送一条模型推理请求。
curl -XPOST http://localhost:8000/generate -H "Content-Type: application/json" -d '{"text_input": "什么是人工智能?人工智能是", "parameters": {"stream": false, "temperature": 0.9, "seed": 10}}'
预期输出:
{"model_name":"Qwen/Qwen1.5-4B-Chat","text_output":"什么是人工智能?人工智能是计算机科学的一个分支,它试图创建一种能够模拟人类智能的机器"}
输出结果表明模型可以根据提问自动生成关于人工智能的定义。
(可选)步骤三:清理推理服务
如果不再使用已创建的资源,请执行以下命令,删除已部署的模型推理服务。
arena serve del huggingface
部署本地模型
步骤一:下载模型文件
本文以Qwen1.5-4B-Chat模型为例,演示如何下载模型、上传模型至OSS,以及在ACK集群中创建对应的存储卷PV和存储卷声明PVC。
下载模型文件。
执行以下命令,安装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。
步骤二:部署推理服务
执行以下命令,通过Arena部署一个自定义类型的服务,该服务名称为local-model。
其中,
--data
参数将已创建的PVCllm-model
挂载到了容器中的/model/Qwen1.5-4B-Chat
目录下。应用启动后会从本地目录/model/Qwen1.5-4B-Chat
加载模型,如需修改为其他本地模型可以修改启动参数里的MODEL_ID
字段。arena serve custom \ --name=local-model \ --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" \ --data=llm-model:/model/Qwen1.5-4B-Chat \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/quick-deploy-llm:v1 \ "MODEL_ID=/model/Qwen1.5-4B-Chat python3 server.py"
参数说明如下所示:
参数
说明
--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/local-model-v1 created deployment.apps/local-model-v1-custom-serving created INFO[0001] The Job local-model has been submitted successfully INFO[0001] You can run `arena serve get local-model --type custom-serving -n default` to check the job status
输出结果表明推理服务已成功部署。
执行以下命令,查看推理服务详细信息。
模型下载需要耗费一定时间,因此部署服务后需要等待大约10分钟才能查看推理服务的详细信息。
arena serve get local-model
预期输出:
Name: local-model Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 1m Address: 172.16.XX.XX Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- local-model-v1-custom-serving-8458fb6cf6-6mvzp Running 1m 1/1 0 1 cn-beijing.192.168.XX.XX
输出结果表明该推理服务的一个Pod(local-model-v1-custom-serving-8458fb6cf6-6mvzp )正在稳定运行,且已准备好提供服务。
步骤三:验证推理服务
执行以下命令,建立推理服务与本地环境之间的端口转发。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress概述。
kubectl port-forward svc/local-model-v1 8000:8000
预期输出:
Forwarding from 127.0.0.1:8088 -> 8000 Forwarding from [::1]:8088 -> 8000
执行以下命令,向local-model模型推理服务发送一条模型推理请求。
curl -XPOST http://localhost:8000/generate -H "Content-Type: application/json" -d '{"text_input": "什么是人工智能?人工智能是", "parameters": {"stream": false, "temperature": 0.9, "seed": 10}}'
预期输出:
{"model_name":"/model/Qwen1.5-4B-Chat","text_output":"什么是人工智能?人工智能是计算机科学的一个分支,它研究如何使计算机具有智能行为。"}
输出结果表明模型可以根据提问自动生成关于人工智能的定义。
(可选)步骤四:清理环境
如果不再使用已创建的资源,请及时清理。
执行以下命令,清理已部署的模型推理服务。
arena serve del local-model
执行以下命令,清理已创建的PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model