大道至简-基于ACK的Deepseek满血版分布式推理部署实战

简介: 本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。

【阅读原文】戳:大道至简-基于ACK的Deepseek满血版分布式推理部署实战

本文是基于阿里云容器服务产品ACK,部署Deepseek大语言模型推理服务系列文章的第二篇。将介绍如何在Kubernetes管理的GPU集群中,快速部署多机分布式Deepseek-R1 671B(“满血版”)推理服务。并集成Dify应用,构建一个简单的Deepseek问答助手。关于如何在ACK部署Deepseek“蒸馏版”模型推理服务,可以参考本系列第一篇文章《基于ACK的DeepSeek蒸馏模型生产环境落地指南》

 

 

 

一. 背景介绍

 

 

1. DeepSeek模型

 

 

DeepSeek-R1[1]模型是DeepSeek推出的第一代推理模型,旨在通过大规模强化学习提升大语言模型的推理能力。实验结果表明,DeepSeek-R1在数学推理、编程竞赛等多个任务上表现出色,不仅超过了其他闭源模型,而且在某些任务上接近或超越了OpenAI-o1系列模型。DeepSeek-R1在知识类任务和其他广泛的任务类型中也表现出色,包括创意写作、一般问答等。DeepSeek还将推理能力蒸馏到小模型上,通过对已有模型(Qwen、Llama等)微调提升模型推理能力。蒸馏后的14B模型显著超越了现有的开源模型QwQ-32B,而蒸馏后的32B和70B模型均刷新纪录。更多模型信息请参考DeepSeek AI GitHub仓库[2]

 

 

2. vLLM

 

vLLM[3]是一个高效易用的大语言模型推理服务框架,vLLM支持包括通义千问在内的多种常见大语言模型。vLLM通过PagedAttention优化、动态批量推理(continuous batching)、模型量化等优化技术,可以取得较好的大语言模型推理效率。更多关于vLLM框架的信息,请参考vLLM Github代码库[4]

 

 

3. Arena

 

Arena是阿里云容器服务提供并开源,基于Kubernetes的机器学习轻量级解决方案。用户可通过Arena命令行工具管理数据准备、模型开发、模型训练、模型推理等完整ML/AI任务生命周期,提升数据科学家工作效率。同时和阿里云的基础云服务深度集成,支持GPU共享、CPFS、批量任务调度、数据缓存加速等服务,可以运行开源和阿里云优化的深度学习框架,最大化利用阿里云异构设备的性能和成本的效益。新版Arena已经支持分布式vLLM推理架构和Deepseek模型。关于Arena的信息可以参考文档[5]

 

 

4. Dify

 

Dify是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(Backend as Service)和LLMOps[6]的理念,使开发者可以快速搭建生产级的生成式AI应用。关于如何快速部署Dify应用,可以参考ACK文档[7]

 

 

 

 

二. 前提条件

 

 

 

• 已创建包含GPU的Kubernetes集群。具体操作,请参见创建包含GPU的Kubernetes集群[8]

 

推荐机型ecs.ebmgn8v.48xlarge (8 * 96GB)。分布式部署需要2台,单机部署需要1台。

 

• 已安装云原生AI套件

• 已安装Arena客户端,且版本不低于0.14.0。具体操作,请参见安装Arena[9]

• (可选)已安装ack-dify组件。具体操作,请参考文档使用Dify快速构建AI问答助手[10]中的安装ack-dify章节。

 

 

 

 

三. 多机分布式部署

 

 

3.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部署在两台EGS上,每个vLLM Pod有8张GPU。两个Pod一个作为Ray head节点,一个作为Ray worker节点。

 

 

 

3.2 准备模型数据

 

1. 从ModelScope下载模型并上传到OSS上,模型下载链接:

https://modelscope.cn/models/deepseek-ai/DeepSeek-R1

 

2. 为目标集群配置名为llm-model的存储卷PV和存储声明PVC。具体操作,请参见文章《基于ACK的DeepSeek蒸馏模型生产环境落地指南》


 

 

3.3 模型部署

 

3.3.1 安装LeaderWorkerSet

 

登录容器服务管理控制台[11],在左侧导航栏选择集群列表。

 

2. 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm。

 

3. 在Helm页面单击创建,然后在创建页面,将应用名设置为lws,在Chart区域的搜索栏搜索并选中lws,完成后单击下一步,在弹出的对话框中单击是,确认采用lws-system为Chart的默认的命名空间。

 

4. 在参数配置页面,确认Chart版本和参数信息后,单击确定。

 

3.3.2 模型部署

 

vLLM分布式部署架构图

 

 

执行以下命令部署服务。

 

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:/mnt/models \
        --leader-num=1 \
        --leader-gpus=8 \
        --leader-command="/vllm-workspace/ray_init.sh leader --ray_cluster_size=\$(LWS_GROUP_SIZE); vllm serve /mnt/models/DeepSeek-R1 --port 8080 --trust-remote-code --served-model-name deepseek-r1 --enable-prefix-caching --max-model-len 8192 --gpu-memory-utilization 0.98 --tensor-parallel-size 8 --pipeline-parallel-size 2 --enable-chunked-prefill" \
        --worker-num=1 \
        --worker-gpus=8 \
        --worker-command="/vllm-workspace/ray_init.sh worker --ray_address=\$(LWS_LEADER_ADDRESS)"

 

参数解释如下表所示:

 

参数 是否必选 说明
--name 提交的推理服务名称,全局唯一。
--image 推理服务的镜像地址。
--restful-port 服务端口。
--version 服务版本,默认为当前日期。
--readiness-probe-* 为服务配置就绪检测,仅当服务就绪后才可对外提供服务。
--share-memory 设置共享内存。
--leader-num leader pod数量,当前只支持设置为1。
--leader-gpus 每个leader pod使用的GPU数量。
--leader-command leader pod的启动命令。
--data 服务的模型地址,格式为<pvc-name>:<pod-path>。如上文命令llm-model:/mnt/models,即将llm-model PVC挂载到容器/mnt/models目录下。

 

预期输出:

 

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

 

3.3.3 验证推理服务

 

1. 执行下列命令,查看分布式推理服务的部署情况。

 

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

 

2. 使用kubectl port-forward在推理服务与本地环境间建立端口转发。

 

kubectl port-forward svc/vllm-dist-v1 8080:8080

 

3. 发送模型推理请求

 

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}}

 

 

 

 

四. 使用Dify构建DeepSeek问答助手

 

 

 

4.1. 配置DeepSeek模型

 

1. 登陆Dify应用。登陆后点击头像,选择设置。

 

 

2. 点击左侧模型供应商,在右侧找到OpenAI-API-compatible, 点击添加模型。

 

注意:不要在右侧直接选择DeepSeek,那是接入DeepSeek API的。

 

 

模型参数配置如下所示。模型名称为deepseek-r1不可修改。API Key可以随意设置,API endpoint URL为第二步部署的本地DeepSeek服务名称,不可修改。

 

 

 

4.2. 创建聊天助手应用

 

点击创建空白应用,选择聊天助手,点击创建。

 

 

 

4.3. 验证AI问答助手

 

现在您可以在页面右侧与DeepSeek进行对话。

 

 

 

 

 

总结

 

 

 

本文重点介绍了如何在阿里云容器服务ACK中部署DeepSeek-R1满血版推理模型。DeepSeek-R1模型参数量为671B,单张GPU卡无法加载,因此需要对模型进行切分。本文采用了模型并行(PP=2)与数据并行(TP=8)结合的切分方式,使用arena工具在2台机器上分布式部署DeepSeek-R1满血版模型,当context为8192 tokens时,并发为132.29x。最后我们介绍了如何在Dify应用中接入本地的DeepSeek-R1模型,构建私有DeepSeek问答助手。下篇文章我们将重点介绍如何提升DeepSeek模型推理效率,敬请期待。

 

 

《DeepSeek on 阿里云容器服务ACK系列文章》

 

1. 基于ACK的DeepSeek蒸馏模型生产环境落地指南

https://mp.weixin.qq.com/s/SSGD5G7KL8iYLy2jxh9FOg

 

2. 使用ACS GPU算力构建DeepSeek蒸馏模型推理服务

https://help.aliyun.com/zh/cs/user-guide/use-acs-gpu-computing-power-to-build-deepseek-distillation-model-reasoning-service

 

相关链接:

 

[1] DeepSeek-R1

https://github.com/deepseek-ai/DeepSeek-R1

 

[2] DeepSeek AI GitHub仓库

https://github.com/deepseek-ai

 

[3] vLLM

https://github.com/vllm-project/vllm

 

[4] vLLM Github代码库

https://github.com/vllm-project/vllm

 

[5] 文档

https://github.com/kubeflow/arena

 

[6] LLMOps

https://docs.dify.ai/zh-hans/learn-more/extended-reading/what-is-llmops

 

[7] ACK文档

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/use-cases/building-customized-ai-question-and-answer-assistant-based-on-dify?spm=5176.21213303.J_v8LsmxMG6alneH-O7TCPa.9.42c72f3dS132An&scm=20140722.S_help@@%E6%96%87%E6%A1%A3@@2842906._.ID_help@@%E6%96%87%E6%A1%A3@@2842906-RL_dify-LOC_2024SPHelpResult-OR_ser-PAR1_213e368817394392451973907e9a10-V_4-RE_new4-P0_2-P1_0

 

[8] 创建包含GPU的Kubernetes集群

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-with-gpu-accelerated-nodes?spm=a2c4g.171073.0.0.4c78f95a00Mb5P

 

[9] 安装Arena

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/install-arena#task-1917487

 

[10] 使用Dify快速构建AI问答助手

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/use-cases/building-customized-ai-question-and-answer-assistant-based-on-dify?spm=5176.21213303.J_v8LsmxMG6alneH-O7TCPa.9.42c72f3dwOToE5&scm=20140722.S_help@@%E6%96%87%E6%A1%A3@@2842906._.ID_help@@%E6%96%87%E6%A1%A3@@2842906-RL_dify-LOC_2024SPHelpResult-OR_ser-PAR1_2150457c17394150119097968e6777-V_4-RE_new4-P0_2-P1_0#6ab35f025cpzv

 

[11] 容器服务管理控制台

https://csnew.console.aliyun.com/#/authorize



我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
3
3
0
230
分享
相关文章
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
3FS是DeepSeek开源的高性能分布式文件系统,专为AI训练和推理任务设计,提供高达6.6 TiB/s的读取吞吐量,支持强一致性保障和通用文件接口,优化AI工作负载。
332 2
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
45 12
Python 高级编程与实战:深入理解并发编程与分布式系统
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发、API 设计、网络编程和异步IO。本文将深入探讨 Python 在并发编程和分布式系统中的应用,并通过实战项目帮助你掌握这些技术。
Python 高级编程与实战:构建分布式系统
本文深入探讨了 Python 中的分布式系统,介绍了 ZeroMQ、Celery 和 Dask 等工具的使用方法,并通过实战项目帮助读者掌握这些技术。ZeroMQ 是高性能异步消息库,支持多种通信模式;Celery 是分布式任务队列,支持异步任务执行;Dask 是并行计算库,适用于大规模数据处理。文章结合具体代码示例,帮助读者理解如何使用这些工具构建分布式系统。
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
|
25天前
|
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
本文介绍了从单机锁到分布式锁的演变,重点探讨了使用Redis实现分布式锁的方法。分布式锁用于控制分布式系统中多个实例对共享资源的同步访问,需满足互斥性、可重入性、锁超时防死锁和锁释放正确防误删等特性。文章通过具体示例展示了如何利用Redis的`setnx`命令实现加锁,并分析了简化版分布式锁存在的问题,如锁超时和误删。为了解决这些问题,文中提出了设置锁过期时间和在解锁前验证持有锁的线程身份的优化方案。最后指出,尽管当前设计已解决部分问题,但仍存在进一步优化的空间,将在后续章节继续探讨。
473 131
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
|
1月前
|
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
161 83
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?