すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK で DeepSeek 完全版を複数ノードにデプロイするためのベストプラクティス

最終更新日:Aug 22, 2025

このトピックでは、Container Service for Kubernetes (ACK) の複数ノードに DeepSeek-R1-671B モデルをデプロイするためのベストプラクティスについて説明します。 671B モデルに対して単一 GPU のメモリが不足している問題に対処するために、ハイブリッド並列戦略 (パイプライン並列 = 2 + テンソル並列 = 8) が提案されています。 Arena と組み合わせることで、2 つの ecs.ebmgn8v.48xlarge ノード (8 × 96GB) で効率的な分散デプロイメントを実装できます。 このトピックでは、ACK にデプロイされた DeepSeek-R1 を Dify プラットフォームにシームレスに統合して、長いテキストの理解をサポートするエンタープライズレベルのインテリジェントな Q&A システムを構築する方法についても説明します。

背景情報

  • DeepSeek

    DeepSeek-R1 は、DeepSeek が提供する第一世代の推論モデルであり、大規模拡張学習を使用して大規模言語モデル (LLM) の推論パフォーマンスを向上させます。 統計によると、DeepSeek-R1 は数学的推論とプログラミングのパフォーマンスにおいて他のクローズドソースモデルよりも優れています。 モデルのパフォーマンスは、特定のセクターでは OpenAI-o1 シリーズに匹敵するか、それを上回ります。 DeepSeek-R1 は、作成、ライティング、Q&A などの知識に関連するセクターでも優れています。 DeepSeek は、Qwen や Llama などのより小さなモデルに推論機能を抽出して、これらのモデルの推論パフォーマンスを微調整します。 DeepSeek から抽出された 14B モデルは、オープンソースの QwQ-32B モデルを上回っています。 DeepSeek から抽出された 32B モデルと 70B モデルも新記録を樹立しました。 DeepSeek の詳細については、「DeepSeek AI GitHub リポジトリ」をご参照ください。

  • vLLM

    vLLM は、高性能で使いやすい LLM 推論サービス フレームワークです。 vLLM は、Qwen モデルを含む、最も一般的に使用される LLM をサポートしています。 vLLM は、PagedAttention 最適化、連続バッチ処理、モデル量子化などのテクノロジーによって強化されており、LLM の推論効率を大幅に向上させます。 vLLM フレームワークの詳細については、「vLLM GitHub リポジトリ」をご参照ください。

  • Arena

    Arena は、Kubernetes ベースの機械学習タスクを管理するためのコマンドライン インターフェース ツールです。 データの準備、モデル開発、トレーニング、予測など、機械学習のライフサイクル全体を合理化し、データ サイエンティストの効率を高めます。 Arena は Alibaba Cloud サービスと緊密に統合されており、GPU 共有と Cloud Paralleled File System (CPFS) をサポートし、Alibaba Cloud に最適化された深層学習フレームワーク内で動作して、異種計算リソースのパフォーマンスを最大化できます。 Arena の詳細については、「Arena GitHub リポジトリ」をご参照ください。

前提条件

1. 複数ノードへのデプロイ

1.1 モデルの分割

DeepSeek-R1 は 6,710 億個のパラメーターを提供します。 各 GPU は最大 96 GB のメモリを提供できますが、モデル全体を読み込むには不十分です。 この問題を解決するには、モデルを分割する必要があります。 このトピックでは、TP=8 および PP=2 の分割方法を使用します。 次の図は、分割方法を示しています。 モデル並列 (PP=2) は、モデルを 2 つのフェーズに分割します。 各フェーズは、GPU アクセラレーション ノードで実行されます。 たとえば、モデル M は M1 と M2 に分割されます。 M1 は最初の GPU アクセラレーション ノードで実行され、結果を 2 番目の GPU アクセラレーション ノードで実行される M2 に渡します。 データ並列 (TP=8) は、各フェーズ (M1 または M2) で 8 つの GPU で計算操作を実行します。 M1 フェーズでは、入力データは 8 つの部分に分割され、8 つの GPU で処理されます。 各 GPU は 1 つの部分を処理し、その後、システムは 8 つの GPU からの計算結果をマージします。

image.png

このトピックでは、vLLM + ray を使用して DeepSeek-R1 モデルを分散方式でデプロイします。 次の図は、デプロイメント全体のアーキテクチャを示しています。 2 つの vLLM ポッドが 2 つの ECS インスタンスにデプロイされます。 各 vLLM ポッドには 8 つの GPU があります。 ポッドの 1 つは Ray ヘッドノードとして機能し、もう 1 つのポッドは Ray ワーカーノードとして機能します。

image

1.2 モデルのダウンロード

このセクションの例では、DeepSeek-R1 を使用して、Object Storage Service (OSS) からモデルをダウンロードし、モデルを OSS にアップロードし、ACK クラスタに永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成する方法について説明します。

Apsara File Storage NAS (NAS) にモデルをアップロードする方法の詳細については、「静的にプロビジョニングされた NAS ボリュームをマウントする」をご参照ください。

説明

ファイルのダウンロードとアップロードを高速化するには、してファイルを OSS バケットに直接コピーできます。

  1. モデル ファイルをダウンロードします。

    1. 次のコマンドを実行して Git をインストールします。

      # yum install git または apt install git を実行します。
      yum install git
    2. 次のコマンドを実行して、Git Large File Support (LFS) プラグインをインストールします。

      # 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 コンソール にログインして、作成した OSS バケットの名前を表示およびコピーします。

      OSS バケットの作成方法の詳細については、「バケットを作成する」をご参照ください。

    2. OSS リソースを管理するために ossutil をインストールおよび設定します。 詳細については、「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 を作成する

      • ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスタ] をクリックします。

      • [クラスタ] ページで、目的のクラスタを見つけて名前をクリックします。 左側のウィンドウで、[ボリューム] > [永続ボリューム] を選択します。

      • [永続ボリューム] ページで、右上隅にある [作成] をクリックします。

      • [永続ボリュームの作成] ダイアログボックスで、パラメーターを設定します。

        次の表に、PV のパラメーターを示します。

        パラメーター

        説明

        PV タイプ

        この例では、[OSS] を選択します。

        ボリューム名

        この例では、[llm-model] と入力します。

        アクセス証明書

        OSS バケットにアクセスするために使用される AccessKey ペア。 AccessKey ペアは、AccessKey ID と AccessKey シークレットで構成されます。

        バケット ID

        前の手順で作成した OSS バケットを選択します。

        OSS パス

        /models/DeepSeek-R1 などのモデルのパスを入力します。

    2. PVC を作成する

      • [クラスタ] ページで、目的のクラスタを見つけて名前をクリックします。 左側のウィンドウで、[ボリューム] > [永続ボリューム要求] を選択します。

      • [永続ボリューム要求] ページで、右上隅にある [作成] をクリックします。

      • [永続ボリューム要求の作成] ページで、パラメーターを入力します。

        次の表に、PVC のパラメーターを示します。

        パラメーター

        説明

        PVC タイプ

        この例では、[OSS] を選択します。

        名前

        この例では、[llm-model] と入力します。

        割り当てモード

        この例では、[既存のボリューム] を選択します。

        既存のストレージ クラス

        [PV の選択] ハイパーリンクをクリックし、作成した PV を選択します。

1.3 モデルのデプロイ

  1. LeaderWorkerSet をインストールします。

    1. ACK コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[クラスタ] をクリックし、作成したクラスタの名前をクリックします。

    3. 左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] をクリックします。 [Helm] ページで、[デプロイ] をクリックします。

    4. [基本情報] ステップで、[アプリケーション名][名前空間] を入力し、[チャート] セクションで [lws] を見つけて、[次へ] をクリックします。 この例では、アプリケーション名 ([lws]) と名前空間 ([lws-system]) を使用します。

    5. [パラメーター] ステップで、最新の [チャートバージョン] を選択し、[OK] をクリックして [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

      はい

      リーダー ポッドの数。 この値は 1 にのみ設定できます。

      --leader-gpus

      いいえ

      各リーダー ポッドで使用される GPU の数。

      --leader-command

      はい

      リーダー ポッドを起動するコマンド。

      --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 コマンドを実行してポート フォワーディングを設定する場合、サービスは本番環境では信頼性、安全性、または拡張性がありません。 このサービスは、開発とデバッグにのみ使用できます。 本番環境では、このコマンドを実行してポート フォワーディングを設定しないでください。 ACK クラスタでの本番を容易にするために使用されるネットワーキング ソリューションの詳細については、「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 Q&A アシスタントを構築する

Container Service for Kubernetes クラスタに Dify をインストールして設定できます。 詳細については、「ack-dify をインストールする」をご参照ください。

2.1. DeepSeek モデルを設定する

  1. Dify プラットフォームにログインします。 プロフィール写真をクリックし、[設定] をクリックします。 左側のナビゲーションウィンドウで、[モデル プロバイダー] をクリックします。 OpenAI-API-compatible を見つけて、[追加] をクリックします。 image

  2. 次の表にパラメーターを示します。

    パラメーター

    設定

    注記

    モデル名

    deepseek-r1

    このパラメーターは変更できません。

    API キー

    例: api-deepseek-r1

    ビジネス要件に基づいてこのパラメーターを設定できます。

    API エンドポイント URL

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

    このパラメーターは変更できません。 このパラメーターの値は、2 番目のステップでデプロイされたローカル DeepSeek サービスの名前です。

    image.png

2.2. Q&A アシスタントを作成する

[スタジオ] > [空白から作成] を選択します。 アシスタントの [名前][説明] を指定します。 その他のパラメーターにはデフォルト設定を使用します。

image

2.3 AI 搭載 Q&A アシスタントをテストする

  1. ページの右側で、DeepSeek との会話を開始できます。

    image.png

  2. 設定済みの DeepSeek Q&A アシスタントを個人の本番環境に統合できます。 詳細については、「本番環境での使用」をご参照ください。

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