ACKでDeepSeek蒸留モデルからプロダクション環境をデプロイするためのガイド

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/a-guide-to-deploy-a-production-environment-from-a-deepseek-distilled-model-in-ack_602158?spm=a2c65.11461433.0.0.4ee35355bu6s4v)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# 深Seek蒸留モデルからの推論サービスをACKクラスターでKServeを使用してデプロイする方法

**著者**: Jing Gu (Zibai)

この記事では、<a href=https://www.alibabacloud.com/product/kubernetes?spm=a3c0i.26967091.6791778070.128.44033c14hywrea target=_blank>Container Service for Kubernetes (ACK)</a> クラスターの本番環境で、DeepSeek蒸留モデルに基づいた推論サービスをKServeを使ってデプロイする方法に焦点を当てます。

## 背景

### 1. DeepSeek R1 モデル

<a href=https://github.com/deepseek-ai/DeepSeek-R1 target=_blank>DeepSeek-R1</a>は、大規模な強化学習を通じて大規模言語モデル（LLM）の推論性能を向上させるためにDeepSeekが提供する第一世代の推論モデルです。統計によると、DeepSeek-R1は数学的推論やプログラミング性能において他のクローズドソースモデルよりも優れています。また、特定の分野ではOpenAI-o1シリーズに匹敵またはそれを超える性能を達成しています。DeepSeek-R1は、創作、ライティング、Q&Aなどの知識に関連する分野でも優れた性能を発揮します。DeepSeekは、推論能力をQwenやLlamaのような小型モデルに蒸留し、これらのモデルの推論性能を微調整しています。DeepSeekから蒸留された14Bモデルは、オープンソースのQwQ-32Bモデルを超えており、32Bおよび70Bのモデルも新記録を樹立しています。詳細情報は <a href=https://github.com/deepseek-ai target=_blank>DeepSeek AI GitHubリポジトリ</a> をご覧ください。

### 2. KServe

KServeは、Kubernetes上で機械学習モデルのデプロイと実行を簡素化するために設計されたオープンソースのクラウドネイティブモデルサービスポラットフォームです。KServeは複数の機械学習フレームワークをサポートし、自動スケーリング機能を提供します。KServeを使うと、シンプルなYAML設定ファイルと宣言型APIを使ってモデルをデプロイできるため、モデルサービスを簡単に構成および管理できます。詳細情報は <a href=https://xiumi.us/studio/v5#/paper/for/523334546/cube/0 target=_blank>KServe</a> を参照してください。

### 3. Arena

Arenaは、Kubernetesベースの機械学習タスクを管理するための軽量クライアントです。Arenaはデータ準備、モデル開発、モデルトレーニング、モデル予測など、機械学習のライフサイクル全体を通じて作業を効率化します。これにより、データサイエンティストの作業効率が向上します。Arenaはアリババクラウドの基本サービスとも深く統合されており、GPU共有やCloud Parallel File System (CPFS)をサポートしています。Arenaはアリババクラウドによって最適化されたディープラーニングフレームワークで動作し、アリババクラウドが提供するヘテロジニアスコンピューティングリソースのパフォーマンスと利用率を最大化します。Arenaに関する詳細情報は <a href=https://github.com/kubeflow/arena target=_blank>Documentation</a> を参照してください。

## 前提条件

- GPUアクセラレーションノードを含むACKクラスターが作成されていること。詳細は <a href=https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-with-gpu-accelerated-nodes?spm=a2c4g.171073.0.0.4c78f95a00Mb5P target=_blank>GPUアクセラレーションノード付きのACKクラスターを作成する</a> を参照してください。GPUモデルとしてA10を選択し、推奨される仕様としてecs.gn7i-c8g1.2xlargeを選択してください。
- ack-kserveコンポーネントがインストールされていること。詳細は <a href=https://www.alibabacloud.com/help/en/ack/cloud-native-ai-suite/user-guide/installation-ack-kserve target=_blank>ack-kserveコンポーネントのインストール</a> を参照してください。
- Arenaクライアントがインストールされていること。詳細は <a href=https://www.alibabacloud.com/help/en/ack/cloud-native-ai-suite/user-guide/install-arena#task-1917487 target=_blank>Arenaのインストール</a> を参照してください。

## モデルデプロイ

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

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

   bash
   # git-lfsプラグインがインストールされているか確認します。
   # インストールされていない場合、yum install git-lfs または apt install git-lfs を実行してインストールします。
   git lfs install
   
   # DeepSeek-R1-Distill-Qwen-7Bプロジェクトをクローンします。
   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バケットにファイルをアップロードします。

   bash
   # ディレクトリを作成します。
   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）と`llm-model`という名前の永続ボリューム要求（PVC）を設定します。詳細は <a href=https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/mount-statically-provisioned-oss-volumes target=_blank>静的にプロビジョニングされたOSSボリュームをマウントする</a> を参照してください。

- 以下の表は、PVを作成するために使用される基本パラメータを説明しています。

| パラメータまたは設定 | 説明 |
|-------------------|------|
| PVCタイプ         | OSS  |
| ボリューム名       | llm-model |
| アクセス証明書     | OSSバケットにアクセスするために使用されるAccessKeyペア（AccessKey IDとAccessKeyシークレット）。 |
| バケットID        | 前のステップで作成したOSSバケットを選択します。 |
| OSSパス           | モデルのパス、例：`/models/DeepSeek-R1-Distill-Qwen-7B`。 |

- 以下の表は、PVCを作成するために使用される基本パラメータを説明しています。

| パラメータまたは設定 | 説明 |
|-------------------|------|
| PVCタイプ         | OSS  |
| ボリューム名       | llm-model |
| 割り当てモード     | 既存のボリュームを選択。 |
| 既存のボリューム   | 「既存のボリューム」をクリックし、作成したPVを選択します。 |

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

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

   bash
   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:/model/DeepSeek-R1-Distill-Qwen-7B \
       vllm serve /model/DeepSeek-R1-Distill-Qwen-7
# 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_disabled -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:&lt;think&gt;\n\n&lt;/think&gt;\n\nIt seems like youre 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 推論メトリクスを提供しています。具体的なメトリクスについては、<a href=https://docs.vllm.ai/en/stable/serving/metrics.html target=_blank>Metrics documentation</a> を参照してください。KServe も同様に、モデルサービスのパフォーマンスや健全性を監視するためのいくつかのメトリクスを提供しています。Alibaba Cloud は、これらの LLM 推論サービスのメトリクスを Arena に統合しました。メトリクスを有効にするには、アプリケーション設定に --enable-prometheus=true パラメータを追加します。bash
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:/model/DeepSeek-R1-Distill-Qwen-7B \
    vllm serve /model/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

以下の図は、設定された Grafana ダッシュボードを示しています。
![1](https://yqintl.alicdn.com/55c4a22b88364c3c8406f80eb9e96ad93505308d.jpeg)

## 自動スケーリング
KServe を使用してモデルを推論サービスとしてデプロイする場合、デプロイされたモデルは動的に変動する負荷を処理する必要があります。KServe は Kubernetes ネイティブの Horizontal Pod Autoscaler (HPA) 技術とスケーリングコントローラーを統合し、CPU 使用率、メモリ使用量、GPU 使用率、カスタムパフォーマンスメトリクスに基づいて、ポッドを自動かつ柔軟にスケールします。これにより、サービスのパフォーマンスと安定性が確保されます。bash
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 \
    --scale-metric=DCGM_CUSTOM_PROCESS_SM_UTIL \
    --scale-target=80 \
    --min-replicas=1 \
    --max-replicas=2 \
     --data=llm-model:/model/DeepSeek-R1-Distill-Qwen-7B \
    vllm serve /model/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

上記の例は、ポッドの GPU 使用率に基づいてオートスケーリングポリシーを設定する方法を示しています。`--scale-metric` はスケーリングの指標を DCGM_CUSTOM_PROCESS_SM_UTIL に指定し、`--scale-target` は閾値を指定します。GPU 使用率が 80% を超えた場合、スケールアウトがトリガーされます。`--min-replicas` および `--max-replicas` は最小および最大レプリカ数を設定します。ビジネス要件に応じて他の指標も設定できます。詳細情報は、<a href=https://www.alibabacloud.com/help/en/ack/cloud-native-ai-suite/user-guide/configure-an-elastic-scaling-policy-for-a-service?spm=a2c4g.11186623.help-menu-85222.d_2_4_5_4.5ae11b97C1VtV7&amp;scm=20140722.H_2785369._.OR_help-T_cn~zh-V_1 target=_blank>Configure an auto scaling policy for a service by using KServe</a> を参照してください。

## モデルの加速
技術の発展に伴い、AI アプリケーションで使用されるモデルのファイルサイズはますます大きくなっています。ただし、Object Storage Service (OSS) や Apsara File Storage NAS (NAS) などのストレージサービスからこれらの大規模なファイルをプルすると、レイテンシが長くなることやコールドスタートの問題が発生することがあります。Fluid を使用することで、モデルのファイルプルを加速し、特に KServe を使用してデプロイされた推論サービスのパフォーマンスを最適化できます。実験結果によると、DeepSeek-R1-Distill-Qwen-7B モデルを A10 上にロードした場合、OSS のイントラネットプルと比較して Fluid を使用することで LLM 推論の準備時間が 50.9% 短縮されました。

## カナリアリリース
アプリケーションリリースは、プロダクション環境でのサービス更新を公開するために使用されます。カナリアリリースはサービスの安定性を確保し、サービス更新中に発生する可能性のあるリスクを軽減します。ACK はさまざまなカナリアリリースポリシーをサポートしています。たとえば、トラフィック比率やリクエストヘッダーに基づいてカナリアリリースを実装できます。詳細情報は、<a href=https://www.alibabacloud.com/help/en/ack/cloud-native-ai-suite/user-guide/implementation-of-gray-scale-publishing-of-inference-service?spm=a2c4g.11186623.help-menu-85222.d_2_4_5_3.d97e63c5xf0Mnc&amp;scm=20140722.H_2785368._.OR_help-T_cn~zh-V_1 target=_blank>Implement a canary release for an inference service based on the NGINX Ingress controller</a> を参照してください。

## 推論タスク間での GPU 共有
DeepSeek-R1-Distill-Qwen-7B モデルはわずか 14 GB の GPU メモリしか必要としません。高仕様の GPU（例：A100 GPU）を使用する場合、複数の推論サービスをデプロイして GPU を共有し、GPU 利用率を向上させることができます。これを行うには、GPU パー