全部產品
Search
文件中心

Container Service for Kubernetes:基於ACK多機分布式部署DeepSeek滿血版推理部署實戰

更新時間:Aug 14, 2025

本文深入解析基於阿里雲Container ServiceACK的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

    Arena是基於Kubernetes的機器學習輕量級解決方案,支援資料準備、模型開發、模型訓練、模型預測的完整生命週期,提升資料科學家的工作效率。同時和阿里雲的基礎雲端服務深度整合,支援GPU共用、CPFS等服務,可以運行阿里雲最佳化的深度學習架構,最大化利用阿里雲異構裝置的效能和成本的效益。更多關於Arena的資訊,請參見Arena GitHub程式碼程式庫

前提條件

  • 已建立包含GPU的Kubernetes叢集。具體操作,請參見為叢集添加GPU節點。推薦機型ecs.ebmgn8v.48xlarge (8*96GB)

    重要

    GPU節點請使用550及以上版本的驅動,您可以通過為GPU節點池添加標籤ack.aliyun.com/nvidia-driver-version:550.144.03指定驅動版本為550.144.03。具體操作,請參見通過指定版本號碼自訂節點GPU驅動版本

  • Kubernetes叢集版本需要≥1.28。

  • (可選)已安裝雲原生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處理一小部分資料,計算擷取的結果然後合并。

image.png

本文選擇vllm + ray的方式分布式部署DeepSeek-R1模型,整體部署架構如下所示。兩個vLLM Pod部署在兩台ECS上,每個vLLM Pod有8張GPU。兩個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>/models/DeepSeek-R1
    4. 執行以下命令,上傳模型檔案至OSS。

      ossutil cp -r ./DeepSeek-R1 oss://<Your-Bucket-Name>/models/DeepSeek-R1
  3. 為目的地組群配置儲存卷PV和儲存聲明PVC。具體操作,請參見使用ossfs 1.0靜態儲存卷

    1. 建立PV。

      • 登入Container Service管理主控台,在左側導覽列選擇叢集列表

      • 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存卷

      • 儲存卷頁面,單擊右上方的建立

      • 建立儲存卷對話方塊中配置參數。

        以下為樣本PV的基本配置資訊:

        配置項

        說明

        儲存卷類型

        OSS

        名稱

        llm-model

        訪問認證

        配置用於訪問OSS的AccessKey ID和AccessKey Secret。

        Bucket ID

        選擇上一步所建立的OSS Bucket。

        OSS Path

        選擇模型所在的路徑,如/models/DeepSeek-R1。

    2. 建立PVC。

      • 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存聲明

      • 儲存聲明頁面,單擊右上方的建立

      • 建立儲存聲明頁面中,填寫介面參數。

        以下為樣本PVC的基本配置資訊:

        配置項

        說明

        儲存宣告類型

        OSS

        名稱

        llm-model

        分配模式

        選擇已有儲存卷。

        已有儲存卷

        單擊選擇已有儲存卷連結,選擇已建立的儲存卷PV。

1.3 模型部署

  1. 安裝LeaderWorkerSet。

    登入Container Service管理主控台,在左側導覽列選擇叢集列表單擊目的地組群名稱,進入叢集詳情頁面,使用Helm為目的地組群安裝lws。您無需為組件配置應用程式名稱命名空間,單擊下一步後會出現一個請確認的彈框,單擊,即可使用預設的應用程式名稱(lws)和命名空間(lws-system)。然後選擇Chart 版本為最新版本,單擊確定即可完成lws的安裝。image

  2. 模型部署。

    以下是vLLM分布式部署架構圖。image.png

    arena模型部署樣本

    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.10.0 \
              --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="bash /vllm-workspace/examples/online_serving/multi-node-serving.sh leader --ray_cluster_size=\$(LWS_GROUP_SIZE); python3 -m vllm.entrypoints.openai.api_server --model /models/DeepSeek-R1 --port 8080 --trust-remote-code --served-model-name deepseek-r1 --gpu-memory-utilization 0.95 --tensor-parallel-size 8 --pipeline-parallel-size 2 --enforce-eager" \
              --worker-num=1 \
              --worker-gpus=8 \
              --worker-command="bash /vllm-workspace/examples/online_serving/multi-node-serving.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

    kubectl模型部署樣本

    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.10.0
                  command:
                    - sh
                    - -c
                    - >-
                      bash /vllm-workspace/examples/online_serving/multi-node-serving.sh leader --ray_cluster_size=$(LWS_GROUP_SIZE); 
                      python3 -m vllm.entrypoints.openai.api_server --model /models/DeepSeek-R1 --port 8080 --trust-remote-code --served-model-name deepseek-r1 --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.10.0
                  command:
                    - sh
                    - -c
                    - "bash /vllm-workspace/examples/online_serving/multi-node-serving.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問答助手

如果您想要通過Container Service for 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)