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

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

最終更新日:Jun 23, 2026

このトピックでは、KServe を使用して、本番環境に対応した DeepSeek モデルの推論サービスを Container Service for Kubernetes (ACK) 上にデプロイする方法について説明します。

背景情報

DeepSeek-R1 モデル

DeepSeek-R1 は、DeepSeek の第一世代の推論モデルであり、大規模な強化学習を通じて大規模言語モデル (LLM) の推論能力を向上させるように設計されています。実験により、DeepSeek-R1 は数学的推論やプログラミングコンテストなど、複数のタスクで優れたパフォーマンスを発揮することが示されています。他のクローズドソースモデルを上回るだけでなく、特定のタスクでは OpenAI-O1 シリーズに匹敵するか、それを超える性能を示します。DeepSeek-R1 は、創造的なライティングや一般的な Q&A など、知識ベースのタスクやその他の広範なタスクタイプでも優れています。また、DeepSeek は推論能力をより小さなモデルに蒸留し、ファインチューニングを通じて Qwen や Llama などの既存モデルの推論パフォーマンスを向上させます。蒸留された 14B モデルは、既存のオープンソース QwQ-32B モデルを大幅に上回り、蒸留された 32B および 70B モデルは新記録を樹立しました。DeepSeek モデルの詳細については、DeepSeek AI GitHub リポジトリをご参照ください。

KServe

KServe は、Kubernetes 上での機械学習モデルのデプロイと実行を簡素化する、オープンソースのクラウドネイティブなモデル提供プラットフォームです。複数の機械学習フレームワークをサポートし、auto scaling 機能を提供します。KServe は、シンプルな YAML ファイルに基づく宣言的な API を使用してモデルをデプロイします。このアプローチにより、モデルサービスの設定と管理が簡素化されます。KServe オープンソースプロジェクトの詳細については、KServe をご参照ください。

Arena

Arena は、機械学習向けの軽量な Kubernetes ベースのソリューションです。データ準備、モデル開発、モデルトレーニング、モデル予測を含む完全な機械学習ライフサイクルをサポートし、データサイエンティストの効率を向上させます。Arena は Alibaba Cloud サービスと深く統合されており、GPU 共有や CPFS などの機能をサポートしています。Alibaba Cloud によって最適化された深層学習フレームワークを実行して、ヘテロジニアスコンピューティングリソースのパフォーマンスとコスト効率を最大化できます。Arena の詳細については、Arena GitHub リポジトリをご参照ください。

前提条件

GPU の仕様とコスト

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

デフォルトの精度が FP16 の 7B モデルを例にとります。このモデルには 70 億のパラメーターがあります。データ型のバイト数は 2 (16 ビット浮動小数点数 / 8 ビット/バイト) です。

モデルのロードに必要な GPU メモリに加えて、計算中の KV キャッシュサイズと GPU 使用率も考慮する必要があります。通常、バッファーが予約されます。したがって、ecs.gn7i-c8g1.2xlargeecs.gn7i-c16g1.4xlarge のような 24 GiB の GPU メモリを持つ GPU インスタンスを使用することを推奨します。 GPU インスタンスの仕様と課金の詳細については、「GPU コンピューティング最適化インスタンスファミリー」および「GPU クラウドサーバーの課金」をご参照ください。

モデルのデプロイ

ステップ 1: DeepSeek-R1-Distill-Qwen-7B モデルファイルの準備

  1. 次のコマンドを実行して、ModelScope から DeepSeek-R1-Distill-Qwen-7B モデルをダウンロードします。

    説明

    Git Large File Storage (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. 永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。ターゲットクラスターに 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 ファイルを提供します。

    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: 推論サービスのデプロイ

  1. 次のコマンドを実行して、deepseek という名前の推論サービスを開始します。

    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"

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

    パラメーター

    必須

    説明

    --name

    はい

    推論サービスの名前。名前はグローバルで一意である必要があります。

    --image

    はい

    推論サービスのイメージ。

    --gpus

    いいえ

    推論サービスに必要な GPU の数。デフォルト値:0。

    --cpu

    いいえ

    推論サービスに必要な CPU の数。

    --memory

    いいえ

    推論サービスに必要なメモリ量。

    --data

    いいえ

    モデルアーティファクトへのパス。この例では、前のステップの llm-model 永続ボリューム (PV) がコンテナ内の /models/ ディレクトリにマウントされます。

    期待される出力:

    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. 次のコマンドを実行して、KServe 推論サービスのデプロイ状況を確認します。

    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

    この出力は、KServe 推論サービスが正常にデプロイされたことを確認します。

  2. NGINX Ingress ゲートウェイの IP アドレスを使用して、推論サービスにリクエストを送信します。

    # 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 フレームワークは、さまざまな LLM 推論メトリックを提供します。詳細については、メトリックのドキュメントをご参照ください。KServe は、モデルサービスのパフォーマンスと健全性を監視するためのメトリックも提供します。これらの機能は Arena に統合されています。これらを有効にするには、アプリケーションを送信する際に --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 でデプロイされた LLM 推論サービスは、Grafana ダッシュボードでモニターできます。ダッシュボードを作成するには、まず vLLM 公式サイトから公式の vLLM ダッシュボード JSON を取得し、Grafana にインポートします。 構成後、ダッシュボードは次の図のように表示されます。

image

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

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

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

  2. 左側のナビゲーションウィンドウで、アクセス管理 をクリックします。

  3. [連携済み環境] タブで、[コンテナ環境] を選択し、ACK クラスター名で環境を検索して、ターゲット環境をクリックします。

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

    ダッシュボードディレクトリ名には、対応するクラスター ID が含まれています。

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

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

    説明

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

  7. デフォルト設定を維持し、[インポート] をクリックします。LLM 推論サービスの可観測性ダッシュボードがインポートされます。

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

  1. 保存したクラスター ID または Prometheus インスタンス ID を使用してデータソースを検索し、ターゲットデータソースを選択します。

    image

  2. 推論トラフィックをシミュレートするために、推論サービスにアクセスするためにいくつかのリクエストを送信します。[トークンスループット] などのデータが可観測性ダッシュボードに表示されることを確認します。

    image

Auto Scaling

KServe モデルサービスをデプロイおよび管理する際、ワークロードが変動することがあります。KServe は、Kubernetes Horizontal Pod Autoscaler (HPA) と ACK の ack-alibaba-cloud-metrics-adapter コンポーネントを使用して、モデルサービス Pod の数を自動的に調整します。この auto scaling は、CPU、メモリ、GPU 使用率、またはカスタムメトリックに基づいて行うことができ、サービスの安定性と効率性を確保します。詳細については、「サービスの auto scaling の設定」をご参照ください。

モデルの高速化

AI 技術の進歩に伴い、モデルアーティファクトはますます大きくなっています。OSS や NAS などのストレージサービスからこれらの大きなファイルをプルすると、長い遅延やコールドスタートが発生する可能性があります。Fluid を使用すると、特に KServe ベースの推論サービスにおいて、モデルのロードを大幅に高速化し、推論パフォーマンスを最適化できます。詳細については、「Fluid を使用したモデルの高速化」をご参照ください。

カナリアリリース

本番環境では、更新のデプロイは一般的なタスクです。サービスの安定性を確保し、リスクを軽減するためには、カナリアリリースが不可欠です。ACK は、パーセンテージによるトラフィック分割やヘッダーベースのルーティングなど、さまざまなカナリアリリース戦略をサポートしています。詳細については、「推論サービスのカナリアリリースの実装」をご参照ください。

GPU 共有推論

DeepSeek-R1-Distill-Qwen-7B モデルは、14 GB の GPU メモリしか必要としません。より大きな GPU を持つインスタンスを使用する場合、GPU 共有推論を使用して使用率を向上させることができます。この技術は、単一の物理 GPU をパーティション分割し、複数の推論サービスがそれを共有できるようにすることで、効率を高めます。詳細については、「GPU 共有推論サービスのデプロイ」をご参照ください。

関連ドキュメント