基于ACK多机分布式部署DeepSeek满血版推理部署实战

更新时间:2025-03-17 07:37:56

本文深入解析基于阿里云容器服务ACKDeepSeek-R1-671B大模型分布式推理实战方案。针对该千亿参数模型(671B)单卡显存不足的挑战,提出混合并行策略(Pipeline Parallelism=2 + Tensor Parallelism=8),结合阿里云Arena工具,实现在2ecs.ebmgn8v.48xlarge(8*96GB)节点上的高效分布式部署。进一步演示如何将部署于ACKDeepSeek-R1无缝集成至Dify平台,快速构建支持长文本理解的企业级智能问答系统。

背景介绍

  • DeepSeek模型

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

  • vLLM

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

  • Arena

    Arena是基于Kubernetes的机器学习轻量级解决方案,支持数据准备、模型开发、模型训练、模型预测的完整生命周期,提升数据科学家的工作效率。同时和阿里云的基础云服务深度集成,支持GPU共享、CPFS等服务,可以运行阿里云优化的深度学习框架,最大化利用阿里云异构设备的性能和成本的效益。更多关于Arena的信息,请参见Arena GitHub代码库

前提条件

  • 已创建包含GPUKubernetes集群。具体操作,请参见创建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,我们可以将其切分为M1M2,M1在第一个GPU上处理输入,完成后将中间结果传递给M2,M2在第二个GPU上进行后续操作。数据并行(TP=8)在模型的每个阶段内(例如M1M2),将计算操作分配到8GPU上进行。在 M1阶段,当输入数据传入时,这些数据将被分割为8份,并分别在8GPU上同时处理。每个GPU处理一小部分数据,计算获取的结果然后合并。

image.png

本文选择vllm + ray的方式分布式部署DeepSeek-R1模型,整体部署架构如下所示。两个vLLM Pod部署在两台ECS上,每个vLLM Pod8GPU。两个Pod一个作为Ray head节点,一个作为Ray worker节点。

image

1.2 模型下载

DeepSeek-R1模型为例,将为您演示如何下载模型、上传模型至OSS,以及在ACK集群中创建对应的存储卷PV和存储卷声明PVC。

如需上传模型至NAS,请参见使用NAS静态存储卷

说明

模型文件下载和上传比较慢,您可以通过提交工单快速将模型文件复制到您的OSS Bucket。

  1. 下载模型文件。

    1. 执行以下命令,安装Git。

      # 可执行yum install git或apt install git安装。
      yum install git
    2. 执行以下命令,安装Git LFS(Large File Support)插件。

      # 可执行yum install git-lfs或apt install git-lfs安装。
      yum install git-lfs
    3. 执行以下命令,将ModelScope上的DeepSeek-R1仓库克隆到本地。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://modelscope.cn/models/deepseek-ai/DeepSeek-R1
    4. 执行以下命令,进入DeepSeek-R1目录,下载LFS管理的大文件。

      cd DeepSeek-R1
      git lfs pull
  2. 将下载的DeepSeek-R1文件上传至OSS。

    1. 登录OSS控制台,查看并记录已创建的Bucket名称。

      如何创建Bucket,请参见创建存储空间

    2. 安装和配置ossutil,用于管理OSS资源。具体操作,请参见安装ossutil

    3. 执行以下命令,在OSS创建名为DeepSeek-R1的目录。

      ossutil mkdir oss://<Your-Bucket-Name>/DeepSeek-R1
    4. 执行以下命令,上传模型文件至OSS。

      ossutil cp -r ./DeepSeek-R1 oss://<Your-Bucket-Name>/DeepSeek-R1
  3. 为目标集群配置存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷

    • 以下为示例PV的配置信息:

      配置项

      说明

      配置项

      说明

      存储卷类型

      OSS

      名称

      llm-model

      访问证书

      配置用于访问OSSAccessKey IDAccessKey Secret。

      Bucket ID

      选择已创建的OSS Bucket。

      OSS Path

      选择模型所在的路径,如/models/DeepSeek-R1。

    • 以下为示例PVC的配置信息:

      配置项

      说明

      配置项

      说明

      存储声明类型

      OSS

      名称

      llm-model

      分配模式

      选择已有存储卷

      已有存储卷

      单击选择已有存储卷链接,选择已创建的存储卷PV。

1.3 模型部署

  1. 安装LeaderWorkerSet。

    登录容器服务管理控制台,在左侧导航栏选择集群列表单击目标集群名称,进入集群详情页面,如下图所示,按照序号依次单击,使用Helm为目标集群安装lws组件

    您无需为组件配置应用名命名空间,单击下一步后会出现一个请确认的弹框,单击,即可使用默认的应用名(lws)和命名空间(lws-system)。然后选择Chart 版本为最新版本,单击确定即可完成lws组件的安装。image

  2. 模型部署。

    以下是vLLM分布式部署架构图。image.png

    arena模型部署示例
    kubectl模型部署示例
    1. 执行以下命令部署服务。

      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)" 

      展开查看参数解释

      参数

      是否必选

      说明

      --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
    2. 执行下列命令,查看验证推理服务的部署情况。

      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
    1. 执行以下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
    2. 执行下列命令,查看验证推理服务的部署情况。

      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
  3. 建立本地端口转发发送模型推理请求。

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

      说明

      请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理

      kubectl port-forward svc/vllm-dist-v1 8080:8080
    2. 发送模型推理请求。

      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模型

  1. 登录Dify应用。登录后点击头像,选择设置。点击左侧模型供应商,在右侧找到OpenAI-API-compatible,点击添加模型image

  2. 模型参数配置如下所示。

    参数名称

    设置

    备注

    参数名称

    设置

    备注

    模型名称

    deepseek-r1

    不可修改。

    API Key

    api-deepseek-r1

    可自行设置。

    API endpoint URL

    http://vllm-dist-v1.default:8080/v1

    不可修改。值为第二步部署的本地DeepSeek服务名称。

    image.png

2.2. 创建聊天助手应用

创建一个通用型AI问答助手。依次单击工作室>创建空白应用,并为AI问答助手输入名称描述,其他参数保持默认即可。

image

2.3. 验证AI问答助手

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

    image.png

  2. 如果您想将配置完成的DeepSeek问答助手集成到您的个人生产环境。具体操作,请参见应用到生产环境

    2024-08-23_14-14-02 (1)

  • 本页导读 (1)
  • 背景介绍
  • 前提条件
  • 1. 多机分布式部署
  • 1.1 模型切分
  • 1.2 模型下载
  • 1.3 模型部署
  • 2. 使用Dify构建DeepSeek问答助手
  • 2.1. 配置DeepSeek模型
  • 2.2. 创建聊天助手应用
  • 2.3. 验证AI问答助手
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等