本文深入解析基于阿里云容器服务ACK的DeepSeek-R1-671B大模型分布式推理实战方案。针对该千亿参数模型(671B)单卡显存不足的挑战,提出混合并行策略(Pipeline Parallelism=2 + Tensor Parallelism=8),结合阿里云Arena工具,实现在2台ecs.ebmgn8v.48xlarge(8*96GB)节点上的高效分布式部署。进一步演示如何将部署于ACK的DeepSeek-R1无缝集成至Dify平台,快速构建支持长文本理解的企业级智能问答系统。
背景介绍
DeepSeek模型
DeepSeek-R1模型是DeepSeek推出的第一代推理模型,旨在通过大规模强化学习提升大语言模型的推理能力。实验结果表明,DeepSeek-R1在数学推理、编程竞赛等多个任务上表现出色,不仅超过了其他闭源模型,而且在某些任务上接近或超越了OpenAI-o1系列模型。DeepSeek-R1在知识类任务和其他广泛的任务类型中也表现出色,包括创意写作、一般问答等。DeepSeek还将推理能力蒸馏到小模型上,通过对已有模型(Qwen、Llama等)微调提升模型推理能力。蒸馏后的14B模型显著超越了现有的开源模型QwQ-32B,而蒸馏后的32B和70B模型均刷新纪录。 更多模型信息,请参见DeepSeek AI GitHub仓库。
vLLM
vLLM是一个高效易用的大语言模型推理服务框架,vLLM支持包括通义千问在内的多种常见大语言模型。vLLM通过PagedAttention优化、动态批量推理(continuous batching)、模型量化等优化技术,可以取得较好的大语言模型推理效率。更多关于vLLM框架的信息,请参见vLLM GitHub代码库。
Arena
前提条件
已创建包含GPU的Kubernetes集群。具体操作,请参见创建GPU集群。推荐机型
ecs.ebmgn8v.48xlarge (8*96GB)
。(可选)已安装云原生AI套件。具体操作,请参见安装云原生AI套件。
(可选)已安装Arena客户端,且版本不低于0.14.0。具体操作,请参见配置Arena客户端。
1. 多机分布式部署
1.1 模型切分
DeepSeek-R1模型共有671B参数,单张GPU显存只有96GB,无法加载全部模型,因此需要将模型切分。本文采用了TP=8,PP=2的切分方式,模型切分示意图如下。模型并行(PP=2)将模型切分为两个阶段,每个阶段运行在一个GPU节点上。例如有一个模型 M,我们可以将其切分为M1和M2,M1在第一个GPU上处理输入,完成后将中间结果传递给M2,M2在第二个GPU上进行后续操作。数据并行(TP=8)在模型的每个阶段内(例如M1和M2),将计算操作分配到8个GPU上进行。在 M1阶段,当输入数据传入时,这些数据将被分割为8份,并分别在8个GPU上同时处理。每个GPU处理一小部分数据,计算获取的结果然后合并。
本文选择vllm + ray的方式分布式部署DeepSeek-R1模型,整体部署架构如下所示。两个vLLM Pod部署在两台ECS上,每个vLLM Pod有8张GPU。两个Pod一个作为Ray head节点,一个作为Ray worker节点。
1.2 模型下载
以DeepSeek-R1模型为例,将为您演示如何下载模型、上传模型至OSS,以及在ACK集群中创建对应的存储卷PV和存储卷声明PVC。
如需上传模型至NAS,请参见使用NAS静态存储卷。
模型文件下载和上传比较慢,您可以通过提交工单快速将模型文件复制到您的OSS Bucket。
下载模型文件。
执行以下命令,安装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上的DeepSeek-R1仓库克隆到本地。
GIT_LFS_SKIP_SMUDGE=1 git clone https://modelscope.cn/models/deepseek-ai/DeepSeek-R1
执行以下命令,进入DeepSeek-R1目录,下载LFS管理的大文件。
cd DeepSeek-R1 git lfs pull
将下载的DeepSeek-R1文件上传至OSS。
为目标集群配置存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷。
以下为示例PV的配置信息:
配置项
说明
配置项
说明
存储卷类型
OSS
名称
llm-model
访问证书
配置用于访问OSS的AccessKey ID和AccessKey Secret。
Bucket ID
选择已创建的OSS Bucket。
OSS Path
选择模型所在的路径,如/models/DeepSeek-R1。
以下为示例PVC的配置信息:
配置项
说明
配置项
说明
存储声明类型
OSS
名称
llm-model
分配模式
选择已有存储卷。
已有存储卷
单击选择已有存储卷链接,选择已创建的存储卷PV。
1.3 模型部署
安装LeaderWorkerSet。
登录容器服务管理控制台,在左侧导航栏选择集群列表。单击目标集群名称,进入集群详情页面,如下图所示,按照序号依次单击,使用Helm为目标集群安装lws组件。
您无需为组件配置应用名和命名空间,单击下一步后会出现一个请确认的弹框,单击是,即可使用默认的应用名(lws)和命名空间(lws-system)。然后选择Chart 版本为最新版本,单击确定即可完成lws组件的安装。
模型部署。
以下是vLLM分布式部署架构图。
arena模型部署示例kubectl模型部署示例执行以下命令部署服务。
arena serve distributed \ --name=vllm-dist \ --version=v1 \ --restful-port=8080 \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.7.2 \ --readiness-probe-action="tcpSocket" \ --readiness-probe-action-option="port: 8080" \ --readiness-probe-option="initialDelaySeconds: 30" \ --readiness-probe-option="periodSeconds: 30" \ --share-memory=30Gi \ --data=llm-model:/models/DeepSeek-R1 \ --leader-num=1 \ --leader-gpus=8 \ --leader-command="/vllm-workspace/ray_init.sh leader --ray_cluster_size=\$(LWS_GROUP_SIZE); vllm serve /models/DeepSeek-R1 --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 8192 --gpu-memory-utilization 0.95 --tensor-parallel-size 8 --pipeline-parallel-size 2 --enforce-eager" \ --worker-num=1 \ --worker-gpus=8 \ --worker-command="/vllm-workspace/ray_init.sh worker --ray_address=\$(LWS_LEADER_ADDRESS)"
预期输出如下所示。
configmap/vllm-dist-v1-cm created service/vllm-dist-v1 created leaderworkerset.leaderworkerset.x-k8s.io/vllm-dist-v1-distributed-serving created INFO[0002] The Job vllm-dist has been submitted successfully INFO[0002] You can run `arena serve get vllm-dist --type distributed-serving -n default` to check the job status
执行下列命令,查看验证推理服务的部署情况。
arena serve get vllm-dist
预期输出如下所示。
Name: vllm-dist Namespace: default Type: Distributed Version: v1 Desired: 1 Available: 1 Age: 3m Address: 192.168.138.65 Port: RESTFUL:8080 GPU: 16 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- vllm-dist-v1-distributed-serving-0 Running 3m 1/1 0 8 cn-beijing.10.x.x.x vllm-dist-v1-distributed-serving-0-1 Running 3m 1/1 0 8 cn-beijing.10.x.x.x
执行以下
DeepSeek_R1.yaml
文件部署模型服务。apiVersion: leaderworkerset.x-k8s.io/v1 kind: LeaderWorkerSet metadata: name: vllm-dist spec: replicas: 1 leaderWorkerTemplate: size: 2 restartPolicy: RecreateGroupOnPodRestart leaderTemplate: metadata: labels: role: leader spec: volumes: - name: model persistentVolumeClaim: claimName: llm-model - name: dshm emptyDir: medium: Memory sizeLimit: 15Gi containers: - name: vllm-leader image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.7.2 command: - sh - -c - /vllm-workspace/ray_init.sh leader --ray_cluster_size=$(LWS_GROUP_SIZE); vllm serve /models/DeepSeek-R1 --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 8192 --gpu-memory-utilization 0.95 --tensor-parallel-size 8 --pipeline-parallel-size 2 --enforce-eager resources: limits: nvidia.com/gpu: "8" requests: nvidia.com/gpu: "8" ports: - containerPort: 8080 readinessProbe: initialDelaySeconds: 30 periodSeconds: 30 tcpSocket: port: 8080 volumeMounts: - mountPath: /models/DeepSeek-R1 name: model - mountPath: /dev/shm name: dshm workerTemplate: spec: volumes: - name: model persistentVolumeClaim: claimName: llm-model - name: dshm emptyDir: medium: Memory sizeLimit: 15Gi containers: - name: vllm-worker image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.7.2 command: - sh - -c - "/vllm-workspace/ray_init.sh worker --ray_address=$(LWS_LEADER_ADDRESS)" resources: limits: nvidia.com/gpu: "8" requests: nvidia.com/gpu: "8" ports: - containerPort: 8080 volumeMounts: - mountPath: /models/DeepSeek-R1 name: model - mountPath: /dev/shm name: dshm --- apiVersion: v1 kind: Service metadata: name: vllm-dist-v1 spec: type: ClusterIP ports: - port: 8080 protocol: TCP targetPort: 8080 selector: leaderworkerset.sigs.k8s.io/name: vllm-dist role: leader
kubectl create -f DeepSeek_R1.yaml
执行下列命令,查看验证推理服务的部署情况。
kubectl get po |grep vllm-dist
预期输出如下所示。
NAME READY STATUS RESTARTS AGE vllm-dist-0 1/1 Running 0 20m vllm-dist-0-1 1/1 Running 0 20m
建立本地端口转发发送模型推理请求。
使用
kubectl port-forward
在推理服务与本地环境间建立端口转发。请注意
kubectl port-forward
建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理。kubectl port-forward svc/vllm-dist-v1 8080:8080
发送模型推理请求。
curl http://localhost:8080/v1/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-r1", "prompt": "San Francisco is a", "max_tokens": 10, "temperature": 0.6 }'
预期输出如下所示。
{"id":"cmpl-15977abb0adc44d9aa03628abe9fcc81","object":"text_completion","created":1739346042,"model":"ds","choices":[{"index":0,"text":" city that needs no introduction. Known for its iconic","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":5,"total_tokens":15,"completion_tokens":10,"prompt_tokens_details":null}}
2. 使用Dify构建DeepSeek问答助手
如果您想要通过容器服务 Kubernetes 版集群安装配置Dify平台。具体操作,请参见安装ack-dify。
2.1. 配置DeepSeek模型
登录Dify应用。登录后点击头像,选择设置。点击左侧模型供应商,在右侧找到
OpenAI-API-compatible
,点击添加模型
。模型参数配置如下所示。
参数名称
设置
备注
参数名称
设置
备注
模型名称
deepseek-r1
不可修改。
API Key
如
api-deepseek-r1
可自行设置。
API endpoint URL
http://vllm-dist-v1.default:8080/v1
不可修改。值为第二步部署的本地DeepSeek服务名称。
2.2. 创建聊天助手应用
创建一个通用型AI问答助手。依次单击工作室>创建空白应用,并为AI问答助手输入名称和描述,其他参数保持默认即可。
2.3. 验证AI问答助手
现在您可以在页面右侧与DeepSeek进行对话。
如果您想将配置完成的DeepSeek问答助手集成到您的个人生产环境。具体操作,请参见应用到生产环境。
- 本页导读 (1)
- 背景介绍
- 前提条件
- 1. 多机分布式部署
- 1.1 模型切分
- 1.2 模型下载
- 1.3 模型部署
- 2. 使用Dify构建DeepSeek问答助手
- 2.1. 配置DeepSeek模型
- 2.2. 创建聊天助手应用
- 2.3. 验证AI问答助手