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

Container Service for Kubernetes:ハイブリッドクラウド環境の ACK Edge クラスタに LLM を弾性推論サービスとしてデプロイする

最終更新日:Mar 29, 2025

大規模言語モデル(LLM)を使用してハイブリッドクラウド環境に弾性推論サービスをデプロイする場合、トラフィック分散が不均衡になり、データセンターで GPU 割り当ての問題が発生する可能性があります。これらの問題を解決するために、ACK Edge クラスタは、ハイブリッドクラウド環境に LLM を弾性推論サービスとしてデプロイするためのソリューションを提供します。このソリューションは、クラウドとデータセンターの GPU リソースを一元管理するのに役立ちます。このソリューションを使用すると、オフピーク時にはデータセンターのリソースを優先的に使用し、ピーク時にはクラウドのリソースを起動するようにビジネスを設定できます。このソリューションは、LLM を使用してデプロイされた推論サービスの運用コストを大幅に削減し、リソース供給を動的かつ柔軟に調整します。これにより、サービスの安定性が確保され、リソースのアイドル状態が防止されます。

ソリューションの概要

アーキテクチャ

このソリューションは、ACK Edge クラスタのクラウドエッジ連携機能に基づいて開発されています。このソリューションを使用すると、クラウドとデータセンターの計算リソースを一元管理し、計算タスクにリソースを動的に割り当てることができます。クラスタに LLM を推論サービスとしてデプロイした後、KServe を使用して、推論サービスのスケーリングポリシーを設定できます。

  • オフピーク時には、クラスタに ResourcePolicy を作成して、推論サービスの優先順位ベースのリソーススケジューリングを有効にできます。データセンターの計算リソースに、クラウドの計算リソースよりも高い優先順位を割り当てることができます。このようにして、推論サービスはオンプレミスの計算リソースを優先的に使用します。

  • ピーク時には、KServe は ACK Edge クラスタの監視機能を活用して、GPU 使用率とワークロードの状態をリアルタイムで監視できます。スケーリング条件が満たされると、KServe は推論サービスがデプロイされているポッドを動的にスケールアウトします。オンプレミスの GPU リソースが不足すると、システムはクラウドであらかじめ設定された弾性ノードプールによって提供される GPU リソースを推論サービスに割り当てます。これにより、サービスの安定性と継続性が確保されます。

  1. 推論リクエスト:多数の推論リクエスト

  2. リソーススケジューリング:システムは、推論サービスをデータセンターのリソースプールに優先的にスケジュールします。

  3. スケールアウトにクラウド上のリソースを使用する:データセンターのリソースが不足すると、システムはクラウドであらかじめ設定された弾性ノードプールによって提供されるリソースを推論サービスに割り当てます。

主要コンポーネント

このソリューションには、ACK Edge クラスタ、KServe、弾性ノードプール(ノードの自動スケーリング)、および ResourcePolicy(優先順位ベースのリソーススケジューリング)という主要コンポーネントが含まれています。

クリックして主要コンポーネントの概要を表示する

ACK Edge クラスタ

ACK Edge クラスタは、クラウドホスト型の Kubernetes クラスタであり、エッジコンピューティングリソースとサービスを統一的に接続および管理できるクラウドネイティブなクラウドエッジ連携プラットフォームとして機能します。

KServe

KServeは、Kubernetes 上での機械学習(ML)モデルのデプロイと実行のプロセスを簡素化するために設計された、オープンソースのクラウドネイティブモデル serviceplatform です。KServe は複数の ML フレームワークをサポートし、スケーリング機能を提供します。KServe は、単純な YAML ファイルを定義し、モデルのデプロイと管理のための宣言型 API を提供することにより、モデルサービスの構成と管理を容易にします。さらに、KServe は、ML モデルサービスを管理および配信するための一連の CustomResourceDefinitions(CRD)を提供します。

弾性ノードプール(ノードの自動スケーリング)

ノードの自動スケーリングは、クラスタ内の計算リソースを自動的にスケーリングするために使用される機能です。この機能は、cluster-autoscaler コンポーネントに基づいて実装されています。cluster-autoscaler コンポーネントは、クラスタの状態を定期的に監視し、クラスタ内のノードを自動的にスケーリングします。ポッドをノードにスケジュールできない場合、ノードの自動スケーリング機能はスケジューリングプロセスをシミュレートして、スケールアウトアクティビティが必要かどうかを確認します。スケールアウトアクティビティが必要な場合、ポッドのリソース要件を満たすために、ノードプールがクラスタに自動的に追加されます。これにより、効率的なリソース管理を実現し、アプリケーションの安定性を確保します。

ResourcePolicy(優先順位ベースのリソーススケジューリング)

ResourcePolicy リソースは、ACK Edge クラスタのスケジューラに優先順位ベースのリソーススケジューリングを設定するために使用されます。優先順位ベースのリソーススケジューリングは、複数のタイプのリソースが使用されるシナリオにきめ細かいリソーススケジューリングを提供します。ResourcePolicy を使用すると、複数のリソースタイプの使用ルールと優先順位を降順で指定できます。このようにして、システムは使用ルールと優先順位に基づいて、ポッドをさまざまなタイプのノードにスケジュールします。

ポッドを作成するときは、ビジネス要件とリソース特性に基づいて、ポッドのスケジューリング優先順位を設定できます。たとえば、計算負荷の高いアプリケーションを高パフォーマンス(HPC)ノードに、データ負荷の高いアプリケーションを豊富なストレージリソースを提供するノードに優先的にスケジュールするようにシステムを設定できます。この場合、計算負荷の高いアプリケーションは、データ負荷の高いアプリケーションよりもスケジューリング優先順位が高くなります。スケールアウトアクティビティ中は、ポッドは優先順位の低いノードから削除されます。この場合、データ負荷の高いアプリケーションのポッドが最初に削除されます。データ負荷の高いアプリケーションのすべてのポッドが削除されると、システムは計算負荷の高いアプリケーションのポッドの削除を開始します。

  1. 環境を準備します。

    1. ACK Edge クラスタを作成する

    2. 弾性ノードプールを作成する

    3. ACK Edge クラスタに KServer をインストールする

    4. Arena クライアントを設定する

    5. 監視コンポーネントをデプロイし、GPU メトリックを設定する

    上記の操作が完了したら、クラスタ内のリソースを3つのタイプに分類し、リソースを次のノードプールに追加します。

    タイプ

    ノードプールのタイプ

    説明

    クラウド上の制御リソースプール

    クラウド上

    ACK Edge クラスタと KServe などの制御コンポーネントをデプロイするために使用されるクラウド上のノードプール。

    default-nodepool

    オンプレミスリソースプール

    エッジ/専用

    LLM を使用してデプロイされた推論サービスをホストするために使用されるデータセンターの計算リソース。

    GPU-V100-Edge

    クラウド上の弾性リソースプール

    クラウド上

    スケーラブルなリソースプールは、クラスタの GPU リソース要件を満たすために動的にスケーリングし、ピーク時に LLM を使用してデプロイされた推論サービスをホストできます。

    GPU-V100-Elastic

  2. AI モデルを準備します。

    Object Storage Service(OSS)または NAS ファイルシステム(NAS)を使用して、モデルデータを準備できます。詳細については、「モデルデータを準備し、モデルデータを OSS バケットにアップロードする」をご参照ください。

  3. リソースの優先順位を指定します。

    ResourcePolicy を作成して、リソースの優先順位を指定します。この例では、ResourcePolicy の labelSelector パラメータは app: isvc.qwen-predictor に設定されており、ResourcePolicy が適用されるアプリケーションを選択します。次の ResourcePolicy は、一致するポッドが最初にオンプレミスリソースプールにスケジュールされることを指定しています。オンプレミスリソースプールによって提供されるリソースが不足すると、システムは一致するポッドをクラウド上の弾性リソースプールにスケジュールします。ResourcePolicy の設定方法の詳細については、「優先順位ベースのリソーススケジューリングを設定する」をご参照ください。

    重要

    後でアプリケーションポッドを作成するときは、次の labelSelector と一致するラベルを追加して、ここで定義されているスケジューリングポリシーに関連付ける必要があります。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: qwen-chat
      namespace: default
    spec:
      selector:
        app: isvc.qwen-predictor # ResourcePolicy を適用するポッドのラベルを指定する必要があります。
      strategy: prefer
      units:
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id: npxxxxxx  # 値をオンプレミスリソースプールの ID に置き換えます。
      - resource: elastic
        nodeSelector:
          alibabacloud.com/nodepool-id: npxxxxxy  # 値をクラウド上のリソースプールの ID に置き換えます。
  4. LLM を推論サービスとしてデプロイします。

    Arena クライアントで次のコマンドを実行して、KServe を使用して LLM に基づく推論サービスをデプロイします。

     arena serve kserve \
        --name=qwen-chat \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
        --scale-metric=DCGM_CUSTOM_PROCESS_SM_UTIL \
        --scale-target=50 \
        --min-replicas=1  \
        --max-replicas=3  \
        --gpus=1 \
        --cpu=4  \
        --memory=12Gi \
        --data="llm-model:/mnt/models/Qwen" \
        "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"

    パラメータ

    必須

    説明

    --name

    はい

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

    qwen-chat

    --image

    はい

    推論サービスイメージのアドレス。この例では、仮想大規模言語モデル(vLLM)推論フレームワークが使用されています。

    kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1

    --scale-metric

    いいえ

    スケーリングメトリック。この例では、GPU 使用率メトリック DCGM_CUSTOM_PROCESS_SM_UTIL がスケーリングメトリックとして使用されています。詳細については、「HPA を設定する」をご参照ください。

    DCGM_CUSTOM_PROCESS_SM_UTIL

    --scale-target

    いいえ

    スケーリングしきい値。この例では、スケーリングしきい値は 50% です。GPU 使用率が 50% を超えると、システムはポッドレプリカをスケーリングします。

    50

    --min-replicas

    いいえ

    ポッドレプリカの最小数。

    1

    --max-replicas

    いいえ

    ポッドレプリカの最大数。

    3

    --gpus

    いいえ

    推論サービスによってリクエストされる GPU の数。デフォルト値:0。

    1

    --cpu

    いいえ

    推論サービスによってリクエストされる vCore の数。

    4

    --memory

    いいえ

    推論サービスによってリクエストされるメモリのサイズ。

    12Gi

    --data

    いいえ

    推論サービスモデルのアドレス。この例では、モデルのボリュームは llm-model で、コンテナの /mnt/models/ ディレクトリにマウントされています。

    "llm-model:/mnt/models/Qwen" \

    "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"

  5. 弾性推論サービスがデプロイされているかどうかを確認します。

    curl -H "Host: qwen-chat-default.example.com" \ # KServe によって自動的に作成された Ingress の詳細からアドレスを取得します。
    -H "Content-Type: application/json"      \
    http://xx.xx.xx.xx:80/v1/chat/completions \
    -X POST      \
    -d '{"model": "qwen", "messages": [{"role": "user", "content": "Hello"}], "max_tokens": 512, "temperature": 0.7, "top_p": 0.9, "seed": 10, "stop":["<|endoftext|>", "<|im_end|>", "<|im_start|>"]}
  6. ストレステストツール hey を使用して、大量のリクエストを推論サービスに送信し、ピーク時のトラフィックスパイクをシミュレートして、クラウド上のリソースが起動されるかどうかをテストします。

    hey -z 2m -c 5 \
    -m POST -host qwen-chat-default.example.com \
    -H "Content-Type: application/json" \
    -d '{"model": "qwen", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}' \
    http://xx.xx.xx.xx:80/v1/chat/completions

    リクエストがポッドに送信されると、推論サービスの GPU 使用率がスケーリングしきい値(50%)を超えます。この場合、HPA は事前に定義されたスケーリングルールに基づいてポッドをスケールアウトします。次の図は、推論サービス用に作成されたポッドの数が3つに増加したことを示しています。11

    ただし、テスト環境のデータセンターは 1 つの GPU しか提供していません。その結果、新しく作成された 2 つのポッドはスケジュールできず、pending 状態のままになります。この場合、cluster-autoscaler は 2 つのクラウド上の GPU アクセラレーテッドノードを自動的に起動して、2 つの pending ポッドをホストします。123

関連情報