DeepSeek是一款基于深度学习的智能推理模型,因其在自然语言处理和图像识别等领域的卓越表现而迅速受到了广泛关注。无论是企业级应用还是学术研究,DeepSeek都展现出了强大的潜力。然而,随着其应用场景的不断扩展,数据中心的算力瓶颈问题逐渐凸显。为应对这一挑战,阿里云推出了ACK One注册集群为企业提供灵活、高效的解决方案。通过将本地数据中心的Kubernetes集群接入ACK One注册集群,企业可以无缝扩展算力资源,充分利用阿里云强大的ACS GPU算力,实现DeepSeek推理模型的高效部署。
背景介绍
前提条件
创建ACK One注册集群并接入数据中心或者其他云厂商的Kubernetes集群(建议版本为1.24及以上)。具体操作,请参见创建注册集群。
已安装ACK Virtual Node组件,且组件版本为2.13.0及以上。具体操作,请参见为ack-virtual-node组件配置RAM权限及安装ack-virtual-node组件。
已安装Arena客户端。具体操作,请参见配置Arena客户端。
操作步骤
步骤一:准备DeepSeek-R1-Distill-Qwen-7B模型文件
通常下载和上传模型文件需要1-2小时,您可以提交工单联系容器服务团队,快速将模型文件复制到您的OSS Bucket。
执行以下命令从ModelScope下载DeepSeek-R1-Distill-Qwen-7B模型。
请确认是否已安装git-lfs插件,如未安装可执行
yum install git-lfs
或者apt-get install git-lfs
安装。更多的安装方式,请参见安装git-lfs。git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B.git cd DeepSeek-R1-Distill-Qwen-7B/ git lfs pull
在OSS中创建目录,将模型上传至OSS。
关于ossutil工具的安装和使用方法,请参见安装ossutil。
ossutil mkdir oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B ossutil cp -r ./DeepSeek-R1-Distill-Qwen-7B oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B
创建PV和PVC。为目标集群配置名为
llm-model
的存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷。控制台操作示例kubectl操作示例以下为示例PV的基本配置信息:
配置项
说明
存储卷类型
OSS
名称
llm-model
访问证书
配置用于访问OSS的AccessKey ID和AccessKey Secret。
Bucket ID
选择上一步所创建的OSS Bucket。
OSS Path
选择模型所在的路径,如
/models/DeepSeek-R1-Distill-Qwen-7B
。以下为示例PVC的基本配置信息:
配置项
说明
存储声明类型
OSS
名称
llm-model
分配模式
选择已有存储卷。
已有存储卷
单击选择已有存储卷链接,选择已创建的存储卷PV。
以下为示例YAML:
apiVersion: v1 kind: Secret metadata: name: oss-secret stringData: akId: <YOUR-OSS-AK> # 配置用于访问OSS的AccessKey ID。 akSecret: <YOUR-OSS-SK> # 配置用于访问OSS的AccessKey Secret。 --- apiVersion: v1 kind: PersistentVolume metadata: name: llm-model labels: alicloud-pvname: llm-model spec: capacity: storage: 30Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: llm-model nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: <YOUR-BUCKET-NAME> # bucket名称。 url: <YOUR-BUCKET-ENDPOINT> # Endpoint信息,推荐使用内网地址,如oss-cn-hangzhou-internal.aliyuncs.com。 otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: <YOUR-MODEL-PATH> # 本示例中为/models/DeepSeek-R1-Distill-Qwen-7B/。 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llm-model spec: accessModes: - ReadOnlyMany resources: requests: storage: 30Gi selector: matchLabels: alicloud-pvname: llm-model
步骤二:部署推理服务
执行以下命令,查看集群中的节点情况。
kubectl get no -owide
预期输出:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME idc-master-0210-001 Ready control-plane 26h v1.28.2 192.168.8.XXX <none> Alibaba Cloud Linux 3.2104 U11 (OpenAnolis Edition) 5.10.134-18.al8.x86_64 containerd://1.6.32 idc-worker-0210-001 Ready <none> 26h v1.28.2 192.168.8.XXX <none> Alibaba Cloud Linux 3.2104 U11 (OpenAnolis Edition) 5.10.134-18.al8.x86_64 containerd://1.6.32 idc-worker-0210-002 Ready <none> 26h v1.28.2 192.168.8.XXX <none> Alibaba Cloud Linux 3.2104 U11 (OpenAnolis Edition) 5.10.134-18.al8.x86_64 containerd://1.6.32 virtual-kubelet-cn-hangzhou-b Ready agent 20h v1.28.2 10.244.11.XXX <none> <unknown> <unknown> <unknown> virtual-kubelet-cn-hangzhou-h Ready agent 25h v1.28.2 10.244.11.XXX <none> <unknown> <unknown> <unknown>
从输出结果中可以看到,节点中有名为
virtual-kubelet-cn-hangzhou-<ZoneId>
的虚拟节点。执行以下命令,基于vLLM模型推理框架部署DeepSeek-R1-Distill-Qwen-7B模型的推理服务。
该推理服务暴露与OpenAI兼容的HTTP API。以下命令使用arena命令行工具的
--data
参数,将模型参数文件视为一种特殊类型的数据集合,挂载到推理服务容器中的指定位置/model/DeepSeek-R1-Distill-Qwen-7B
。参数--max_model_len
设置了该模型最大可处理的Token长度,增大该配置项可获得更好的模型对话效果,但可能会占用更多GPU显存资源。arena serve custom \ --name=deepseek-r1 \ --version=v1 \ --gpus=1 \ --cpu=8 \ --memory=32Gi \ --replicas=1 \ --env-from-secret=akId=oss-secret \ --env-from-secret=akSecret=oss-secret \ --label=alibabacloud.com/acs="true" \ #此处指定使用ACS算力 --label=alibabacloud.com/compute-class=gpu \ --label=alibabacloud.com/gpu-model-series=<example-model> \ #此处指定GPU实例系列 --restful-port=8000 \ --readiness-probe-action="tcpSocket" \ --readiness-probe-action-option="port: 8000" \ --readiness-probe-option="initialDelaySeconds: 30" \ --readiness-probe-option="periodSeconds: 30" \ --image=registry-cn-hangzhou-vpc.ack.aliyuncs.com/ack-demo/vllm:v0.6.6 \ --data=llm-model:/model/DeepSeek-R1-Distill-Qwen-7B \ "vllm serve /model/DeepSeek-R1-Distill-Qwen-7B --port 8000 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager"
参数说明如下表所示:
参数
说明
参数
说明
--name
指定推理服务名称。
--version
指定推理服务版本。
--gpus
指定单个推理服务副本需要使用的GPU卡数。推荐1卡。
--cpu
指定单个推理服务副本需要使用的CPU资源大小。推荐8vCPU。
--memory
指定单个推理服务副本需要使用的内存资源大小。推荐32GiB。
--replicas
指定推理服务副本数。
--label
通过如下label指定ACS GPU算力。
--label=alibabacloud.com/acs="true"
--label=alibabacloud.com/compute-class=gpu
--label=alibabacloud.com/gpu-model-series=example-model
请将命令中的
gpu-model-series=<example-model>
替换为ACS支持的GPU具体型号,目前支持的GPU型号列表请提交工单咨询。--restful-port
指定推理服务对外暴露的端口。
--readiness-probe-action
指定就绪探针连接类型,支持
httpGet
、exec
、grpc
、tcpSocket
。--readiness-probe-action-option
指定就绪探针连接方式。
--readiness-probe-option
指定就绪探针配置。
--image
指定推理服务的镜像地址。
--data
挂载共享存储卷PVC到运行环境中。它由两部分组成,通过冒号(:)分隔。冒号左侧是已经准备好的PVC名称。可以通过命令
arena data list
查看当前集群可用的PVC列表。冒号右侧是想将PVC挂载到运行环境中的路径,也是训练代码要读取数据的本地路径。这样通过挂载的方式,您的代码就可以访问PVC的数据。预期输出:
service/deepseek-r1-v1 created deployment.apps/deepseek-r1-v1-custom-serving created INFO[0001] The Job deepseek-r1 has been submitted successfully INFO[0001] You can run `arena serve get deepseek-r1 --type custom-serving -n default` to check the job status
执行以下命令,查看推理服务详细信息,等待服务就绪。
arena serve get deepseek-r1
预期输出:
Name: deepseek-r1 Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 17m Address: 10.100.136.39 Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- deepseek-r1-v1-custom-serving-5f59745cbd-bsrdq Running 17m 1/1 0 1 virtual-kubelet-cn-hangzhou-b
执行以下命令,查看推理服务是否部署到虚拟节点。
kubectl get po -owide |grep deepseek-r1-v1
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deepseek-r1-v1-custom-serving-5f59745cbd-r8drs 1/1 Running 0 3m16s 192.168.2.XXX virtual-kubelet-cn-hangzhou-b <none> <none>
从结果可以看出,推理服务的业务Pod被调度到虚拟节点。
步骤三:验证推理服务
执行以下命令,在推理服务与本地环境间建立端口转发。
请注意
kubectl port-forward
建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。kubectl port-forward svc/deepseek-r1-v1 8000:8000
使用以下命令,发送模型推理请求。
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-r1", "messages": [ { "role": "user", "content": "你好,DeepSeek。" } ], "max_tokens": 100, "temperature": 0.7, "top_p": 0.9, "seed": 10 }'
预期输出:
{"id":"chatcmpl-cef570252f324ed2b34953b8062f793f","object":"chat.completion","created":1739245450,"model":"deepseek-r1","choices":[{"index":0,"message":{"role":"assistant","content":"您好!我是由中国的深度求索(DeepSeek)公司独立开发的智能助手DeepSeek-R1,很高兴为您提供服务!\n</think>\n\n您好!我是由中国的深度求索(DeepSeek)公司独立开发的智能助手DeepSeek-R1,很高兴为您提供服务!","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":68,"completion_tokens":58,"prompt_tokens_details":null},"prompt_logprobs":null}
(可选)步骤四:清理环境
如果不再需要使用本文档中部署的模型推理服务时,请及时清理环境。
清理模型推理服务。
arena serve delete deepseek-r1
预期输出:
INFO[0007] The serving job deepseek-r1 with version v1 has been deleted successfully
清理PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model
预期输出:
persistentvolumeclaim "llm-model" deleted persistentvolume "llm-model" deleted
- 本页导读 (1)
- 背景介绍
- DeepSeek-R1模型
- KServe
- Arena
- 前提条件
- 操作步骤
- 步骤一:准备DeepSeek-R1-Distill-Qwen-7B模型文件
- 步骤二:部署推理服务
- 步骤三:验证推理服务
- (可选)步骤四:清理环境