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

Container Service for Kubernetes:DeepSeek 蒸留モデルの推論サービスのデプロイ

最終更新日:Mar 27, 2026

このガイドでは、KServe と Arena を使用して、本番環境ですぐに利用できる DeepSeek-R1-Distill-Qwen-7B 推論サービスを Alibaba Cloud Container Service for Kubernetes (ACK) 上にデプロイする方法について説明します。GPU サイジング、モデルの準備、サービスデプロイ、検証、可観測性の設定について解説します。

背景情報

DeepSeek-R1

DeepSeek-R1 は、DeepSeek の第一世代の推論モデルです。大規模な強化学習を通じて大規模言語モデル (LLM) の推論能力を向上させ、数学的推論、プログラミングコンテスト、知識ベースのタスク、創造的なライティング、一般的な Q&A などで優れたパフォーマンスを発揮します。特定のタスクでは、他のクローズドソースモデルを上回り、OpenAI-O1 シリーズに匹敵するか、それを超える性能を示します。

また、DeepSeek は Qwen と Llama をファインチューニングすることで、推論能力をより小さなモデルに蒸留しています。蒸留された 14B モデルは、オープンソースの QwQ-32B を大幅に上回り、32B と 70B の蒸留モデルは新記録を樹立しました。

詳細については、「DeepSeek AI GitHub リポジトリ」をご参照ください。

KServe

KServe は、Kubernetes 向けのオープンソースでクラウドネイティブなモデルサービングプラットフォームです。複数の ML フレームワークをサポートし、弾力的スケーリングを提供し、宣言的な YAML API を使用してモデルのデプロイと管理を簡素化します。詳細については、「KServe」をご参照ください。

Arena

Arena は、データ準備、モデル開発からトレーニング、推論に至るまで、ML のライフサイクル全体をカバーする軽量な Kubernetes ベースのソリューションです。Alibaba Cloud サービスと統合されており、GPU 共有と CPFS をサポートしています。詳細については、「Arena GitHub リポジトリ」をご参照ください。

前提条件

開始する前に、以下が準備できていることを確認してください。

GPU サイジング

推論中に GPU メモリを最も消費するのはモデルパラメーターです。必要な GPU メモリを見積もるには、次の数式を使用します。

GPU メモリ = パラメーター数 × パラメーターあたりのバイト数

FP16 精度の 7B モデルの場合:7 × 10⁹ × 2 バイト ≈ 13.04 GiB

モデルの重みをロードするだけでなく、KV キャッシュと計算のために追加の GPU メモリが必要です。少なくとも 24 GiB の GPU メモリを持つ GPU インスタンスを使用してください。例えば、ecs.gn7i-c8g1.2xlargeecs.gn7i-c16g1.4xlarge などです。

インスタンスの仕様と料金については、「GPU アクセラレーテッドコンピューティング最適化インスタンスファミリー」および「Elastic GPU Service の課金」をご参照ください。

推論サービスのデプロイ

ステップ 1: モデルファイルの準備

  1. ModelScope から DeepSeek-R1-Distill-Qwen-7B モデルをダウンロードします。

    クローン作成前に、git-lfs がインストールされていることを確認してください。インストールするには、yum install git-lfs または apt-get install git-lfs を実行します。その他のオプションについては、「Git Large File Storage のインストール」をご参照ください。
    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B.git
    cd DeepSeek-R1-Distill-Qwen-7B/
    git lfs pull
  2. モデルを OSS バケットにアップロードします。

    ossutil のインストールと使用方法については、「ossutil のインストール」をご参照ください。
    ossutil mkdir oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B
    ossutil cp -r ./DeepSeek-R1-Distill-Qwen-7B oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B
  3. llm-model という名前の永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成し、モデルをクラスターにマウントします。詳細な手順については、「ossfs 1.0 の静的にプロビジョニングされたボリュームの使用」をご参照ください。

    コンソール

    以下の設定で PV を構成します:

    設定項目
    PV タイプOSS
    名前llm-model
    アクセス証明書OSS の AccessKey ID と AccessKey Secret
    バケット ID前のステップで作成した OSS バケット
    OSS パス/models/DeepSeek-R1-Distill-Qwen-7B

    以下の設定で PVC を構成します:

    設定項目
    PVC タイプOSS
    名前llm-model
    割り当てモード既存の PV を選択
    既存のボリューム上記で作成した PV を選択

    Kubectl

    以下の YAML を適用して、Secret、PV、PVC を作成します:

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
    stringData:
      akId: <your-oss-ak>       # OSS の AccessKey ID
      akSecret: <your-oss-sk>   # OSS の AccessKey Secret
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: llm-model
      labels:
        alicloud-pvname: llm-model
    spec:
      capacity:
        storage: 30Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: llm-model
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: <your-bucket-name>      # バケット名
          url: <your-bucket-endpoint>     # エンドポイント、例:oss-cn-hangzhou-internal.aliyuncs.com
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          path: <your-model-path>         # 例:/models/DeepSeek-R1-Distill-Qwen-7B/
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: llm-model
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 30Gi
      selector:
        matchLabels:
          alicloud-pvname: llm-model

ステップ 2: 推論サービスのデプロイ

次のコマンドを実行して、推論サービスを開始します。

arena serve kserve \
    --name=deepseek \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.6.6 \
    --gpus=1 \
    --cpu=4 \
    --memory=12Gi \
    --data=llm-model:/models/DeepSeek-R1-Distill-Qwen-7B \
    "vllm serve /models/DeepSeek-R1-Distill-Qwen-7B --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager"

Arena パラメーター

パラメーター必須説明
--nameはい推論サービスの名前。グローバルに一意である必要があります。
--imageはい推論サービスのコンテナイメージ。
--gpusいいえ割り当てる GPU の数。デフォルト:0
--cpuいいえ割り当てる CPU の数。
--memoryいいえ割り当てるメモリの量。
--dataいいえllm-model PVC をコンテナ内の /models/DeepSeek-R1-Distill-Qwen-7B にマウントします。

vLLM serve パラメーター

パラメーター説明
--port 8080vLLM サーバーがリッスンするポート。
--trust-remote-codeモデルリポジトリからカスタムモデルコードのロードを許可します。DeepSeek モデルに必須です。
--served-model-name deepseek-r1API で公開されるモデル名。API リクエストの model フィールドとして使用されます。
--max-model-len 32768入力 + 出力の最大トークン長。コンテキストウィンドウと GPU メモリのバランスを取るために 32,768 に設定します。
--gpu-memory-utilization 0.95モデルと KV キャッシュ用に予約される GPU メモリの割合。メモリ使用量を最大化しつつ、余裕を残すために 0.95 に設定します。
--enforce-eagerCUDA グラフキャプチャを無効にし、Eager 実行モードで実行します。起動時のメモリオーバーヘッドを削減し、GPU メモリが逼迫している場合に役立ちます。

想定される出力:

inferenceservice.serving.kserve.io/deepseek created
INFO[0003] The Job deepseek has been submitted successfully
INFO[0003] You can run `arena serve get deepseek --type kserve -n default` to check the job status

ステップ 3: デプロイの検証

  1. サービスステータスを確認します。

    arena serve get deepseek

    想定される出力:

    Name:       deepseek
    Namespace:  default
    Type:       KServe
    Version:    1
    Desired:    1
    Available:  1
    Age:        3m
    Address:    http://deepseek-default.example.com
    Port:       :80
    GPU:        1
    
    
    Instances:
      NAME                                 STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                 ------   ---  -----  --------  ---  ----
      deepseek-predictor-7cd4d568fd-fznfg  Running  3m   1/1    0         1    cn-beijing.172.16.1.77

    Available: 1Running のステータスは、サービスの準備が完了したことを示します。

  2. NGINX Ingress ゲートウェイ経由でテストリクエストを送信します。

    # NGINX Ingress の IP アドレスを取得
    NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
    # 推論サービスのホスト名を取得
    SERVICE_HOSTNAME=$(kubectl get inferenceservice deepseek -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    # チャット補完リクエストを送信
    curl -H "Host: $SERVICE_HOSTNAME" \
         -H "Content-Type: application/json" \
         http://$NGINX_INGRESS_IP:80/v1/chat/completions \
         -d '{"model": "deepseek-r1", "messages": [{"role": "user", "content": "Say this is a test!"}], "max_tokens": 512, "temperature": 0.7, "top_p": 0.9, "seed": 10}'

    想定される出力:

    {"id":"chatcmpl-0fe3044126252c994d470e84807d4a0a","object":"chat.completion","created":1738828016,"model":"deepseek-r1","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n\n</think>\n\nIt seems like you're testing or sharing some information. How can I assist you further? If you have any questions or need help with something, feel free to ask!","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":9,"total_tokens":48,"completion_tokens":39,"prompt_tokens_details":null},"prompt_logprobs":null}

可観測性

LLM 推論サービスは豊富なメトリックセットを生成します。vLLM はトークンスループットやレイテンシなどの推論メトリックを公開し、KServe はサービスヘルスとパフォーマンスメトリックを追加します。どちらも Arena に統合されており、1 つのフラグで有効にできます。

Prometheus メトリックを有効にするには、arena serve kserve コマンドに --enable-prometheus=true を追加します:

arena serve kserve \
    --name=deepseek \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.6.6 \
    --gpus=1 \
    --cpu=4 \
    --memory=12Gi \
    --enable-prometheus=true \
    --data=llm-model:/models/DeepSeek-R1-Distill-Qwen-7B \
    "vllm serve /models/DeepSeek-R1-Distill-Qwen-7B --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager"

vLLM メトリックの全リストについては、「vLLM メトリックドキュメント」をご参照ください。

Grafana ダッシュボードのインポート

vLLM Grafana ダッシュボードを使用して推論メトリックを可視化します。設定されたダッシュボードは次のようになります:

image

ダッシュボードのインポート

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

  2. 左側のナビゲーションウィンドウで、[統合管理] をクリックします。

  3. [統合環境] タブで [Container Service] を選択し、ACK クラスターを名前で検索して、対象の環境をクリックします。

    image

  4. [コンポーネント管理] タブで、クラスター ID をコピーし、[ダッシュボードディレクトリ] の横にあるリンクをクリックします。

    image

  5. [ダッシュボード] タブの右側にある [インポート] をクリックします。

    image

  6. grafana.json ファイルの内容をコピーし、[パネル JSON でインポート] エリアに貼り付けて、[ロード] をクリックします。

    JSON ファイルを直接アップロードしてインポートすることもできます。

    image

  7. デフォルト設定のまま、[インポート] をクリックします。

ダッシュボードデータの検証

  1. コピーしたクラスター ID または Prometheus インスタンス ID を使用してデータソースを検索し、対象のデータソースを選択します。

    image

  2. トラフィックをシミュレートするために推論サービスにいくつかのリクエストを送信し、ダッシュボードで [Token Throughput] などのメトリックを確認します。

    image

本番環境向けの機能強化

弾力的スケーリング

推論ワークロードのトラフィックが変動する場合、KServe の Horizontal Pod Autoscaler (HPA) 統合と ACK の ack-alibaba-cloud-metrics-adapter コンポーネントを使用して、CPU、メモリ、GPU 使用率、およびカスタムメトリックに基づいて Pod を自動的にスケーリングします。これにより、過剰プロビジョニングすることなく、トラフィックスパイク時にもサービスの安定性を維持できます。

詳細については、「サービスの自動スケーリングの設定」をご参照ください。

モデルアクセラレーション

クラスターが OSS や NAS から大きなモデルファイルを取得する際、高レイテンシやコールドスタートの遅延がサービス可用性に影響を与える可能性があります。Fluid を使用してモデルデータを推論 Pod の近くにキャッシュすることで、ロード時間を大幅に短縮できます。

詳細については、「Fluid を使用したモデルアクセラレーション」をご参照ください。

段階的リリース

本番環境でモデルや構成を更新する際、段階的リリースを使用して、まず一部のトラフィックに変更を展開し、完全なロールアウトの前に安定性を検証します。ACK は、トラフィックパーセンテージベースとリクエストヘッダーベースの両方の段階的リリース戦略をサポートしています。

詳細については、「推論サービスの段階的リリースの実装」をご参照ください。

GPU 共有

DeepSeek-R1-Distill-Qwen-7B モデルには約 14 GB の GPU メモリが必要です。より高性能な GPU を使用している場合は、GPU 共有を検討して、単一の GPU で複数の推論サービスを実行し、全体的な GPU 使用率を向上させることができます。

詳細については、「GPU 共有推論サービスのデプロイ」をご参照ください。

次のステップ