このガイドでは、KServe と Arena を使用して、本番環境ですぐに利用できる DeepSeek-R1-Distill-Qwen-7B 推論サービスを Alibaba Cloud Container Service for Kubernetes (ACK) 上にデプロイする方法について説明します。GPU サイジング、モデルの準備、サービスデプロイ、検証、可観測性の設定について解説します。
背景情報
DeepSeek-R1
KServe
Arena
前提条件
開始する前に、以下が準備できていることを確認してください。
GPU ノードを持つ Kubernetes クラスター — 「クラスターへの GPU ノードプールの追加」をご参照ください。
クラスターに接続された kubectl — 「kubectl を使用したクラスターへの接続」をご参照ください。
インストール済みの ack-kserve コンポーネント — 「ack-kserve コンポーネントのインストール」をご参照ください。
設定済みの Arena クライアント — 「Arena クライアントの設定」をご参照ください。
GPU サイジング
推論中に GPU メモリを最も消費するのはモデルパラメーターです。必要な GPU メモリを見積もるには、次の数式を使用します。
GPU メモリ = パラメーター数 × パラメーターあたりのバイト数FP16 精度の 7B モデルの場合:7 × 10⁹ × 2 バイト ≈ 13.04 GiB
モデルの重みをロードするだけでなく、KV キャッシュと計算のために追加の GPU メモリが必要です。少なくとも 24 GiB の GPU メモリを持つ GPU インスタンスを使用してください。例えば、ecs.gn7i-c8g1.2xlarge や ecs.gn7i-c16g1.4xlarge などです。
インスタンスの仕様と料金については、「GPU アクセラレーテッドコンピューティング最適化インスタンスファミリー」および「Elastic GPU Service の課金」をご参照ください。
推論サービスのデプロイ
ステップ 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モデルを 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-7Bllm-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 8080 | vLLM サーバーがリッスンするポート。 |
--trust-remote-code | モデルリポジトリからカスタムモデルコードのロードを許可します。DeepSeek モデルに必須です。 |
--served-model-name deepseek-r1 | API で公開されるモデル名。API リクエストの model フィールドとして使用されます。 |
--max-model-len 32768 | 入力 + 出力の最大トークン長。コンテキストウィンドウと GPU メモリのバランスを取るために 32,768 に設定します。 |
--gpu-memory-utilization 0.95 | モデルと KV キャッシュ用に予約される GPU メモリの割合。メモリ使用量を最大化しつつ、余裕を残すために 0.95 に設定します。 |
--enforce-eager | CUDA グラフキャプチャを無効にし、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: デプロイの検証
サービスステータスを確認します。
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.77Available: 1とRunningのステータスは、サービスの準備が完了したことを示します。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 ダッシュボードのインポート
本番環境向けの機能強化
弾力的スケーリング
推論ワークロードのトラフィックが変動する場合、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 共有推論サービスのデプロイ」をご参照ください。






