自動スケーリングを使用して推論ノードをスケーリングする

オンライン推論用のモデルを DeployedModel としてデプロイすると、推論ノードを自動スケーリングするよう構成できます。これを行うには、dedicatedResources.maxReplicaCountdedicatedResources.minReplicaCount より大きい値に設定します。

DeployedModel を構成する場合は、dedicatedResources.minReplicaCount を 1 以上に設定する必要があります。つまり、使用されていない DeployedModel を 0 個の推論ノードにスケーリングするように構成することはできません。

また、Scale To Zero 機能(プレビュー)の使用に同意する場合は、dedicatedResources.minReplicaCount フィールドを 0 に設定できます。エンドポイントにトラフィックがない場合、ワークロードはゼロ レプリカにスケーリングされます。詳細については、ゼロへのスケーリングをご覧ください。

デフォルトでは、デプロイ リクエストのタイムアウト値の前に推論ノードの数が dedicatedResources.minReplicaCount に達した場合にのみ、デプロイ オペレーションは成功と見なされます。それ以外の場合、デプロイは失敗としてマークされ、基盤となるリソースが解放されます。

デプロイとミューテーションの部分的成功

デフォルトのデプロイ動作を変更するには、dedicatedResources.requiredReplicaCountdedicatedResources.minReplicaCount より小さい値に設定します。この場合、推論ノードの数が dedicatedResources.requiredReplicaCount に達すると、デプロイ オペレーションは完了していなくても成功としてマークされます。デプロイは dedicatedResources.minReplicaCount に達するまで続行されます。デプロイ リクエスト時刻までに dedicatedResources.minReplicaCount に達しなかった場合でも、オペレーションは成功しますが、失敗したレプリカのエラー メッセージが DeployedModel.status.message で返されます。

カスタムモデル サービングの割り当ては、デプロイされたモデルのリアルタイムのコンピューティング リソース使用量に基づいて計算されます。たとえば、プロジェクト内のすべてのデプロイメントの maxReplicaCount の合計が、プロジェクトの割り当てを超えている場合、使用可能な割り当てがないために自動スケーリングに失敗することがあります。

エンドポイントはマシンごとにスケールアップとスケールダウンが行われますが、割り当ては CPU または GPU ごとに計算されます。たとえば、モデルが a2-highgpu-2g マシンタイプにデプロイされている場合、アクティブなレプリカごとにプロジェクトの割り当てに対して 24 個の CPU と 2 個の GPU がカウントされます。詳細については、割り当てと上限をご覧ください。

バッチ推論の推論ノードは自動的にスケーリングされません。Vertex AI は BatchDedicatedResources.startingReplicaCount を使用し、BatchDedicatedResources.maxReplicaCount を無視します。

ターゲット使用率と構成

デフォルトでは、専用の GPU リソースなしでモデルをデプロイすると、Vertex AI は CPU 使用率がデフォルトの 60% のターゲット値と一致するように、レプリカの数を自動的にスケールアップまたはスケールダウンします。

デフォルトでは、専用の GPU リソースを使用してモデルをデプロイすると(machineSpec.accelerator_count が 0 より大きい場合)、CPU 使用率または GPU 使用率のいずれか高い方がデフォルトの 60% のターゲット値と一致するように、Vertex AI は自動的にレプリカ数をスケールアップまたはスケールダウンします。そのため、推論スループットで GPU 使用率が高くても CPU 使用率が高くない場合、Vertex AI がスケールアップを行い、CPU 使用率は非常に低くなります。これは、モニタリングで確認できます。逆に、カスタム コンテナの GPU 使用率が低いものの、CPU 使用率が 60% を超える原因となる関連性のないプロセスが存在する場合は、QPS とレイテンシの目標を達成するために必要でない場合でも、Vertex AI はスケールアップを行います。

デフォルトのしきい値指標とターゲットは、autoscalingMetricSpecs を指定してオーバーライドできます。CPU 使用率のみに基づいてスケーリングするようにデプロイが構成されている場合、GPU 使用率が高い状態でも、スケールアップは行われません。

次の自動スケーリング指標がサポートされています。

  • CPU 使用率aiplatform.googleapis.com/prediction/online/cpu/utilization): CPU 使用率に基づいてスケーリングします。単位はレプリカあたりの CPU 使用率です。ターゲット値はパーセンテージ(0 ~ 100)です。デフォルトの目標値は 60% です。
  • GPU 使用率aiplatform.googleapis.com/prediction/online/accelerator/duty_cycle): GPU 使用量に基づいてスケーリングします。単位はレプリカあたりの GPU 使用率です。ターゲット値はパーセンテージ(0 ~ 100)です。デフォルトの目標値は 60% です。
  • リクエスト数aiplatform.googleapis.com/prediction/online/request_count): リクエスト数に基づいてスケーリングします。単位は、レプリカあたりの 1 分あたりのリクエスト数です。ターゲット値は整数です。この指標はデフォルトで無効になっています。
  • Pub/Sub キューサイズプレビュー、Google Cloud CLI のサポートなし)(pubsub.googleapis.com/subscription/num_undelivered_messages): Pub/Sub サブスクリプションの未配信メッセージの数に基づいてスケーリングします。単位はレプリカあたりの未配信メッセージ数です。ターゲット値は整数です。この指標はデフォルトで無効になっています。

自動スケーリングを構成するときは、指標 ID に METRIC_NAME を使用し、ターゲット値に TARGET_THRESHOLD を使用します。

デプロイ時に自動スケーリングを構成する

モデルのデプロイ時に自動スケーリングを構成するには、次のいずれかのインターフェースを使用します。

gcloud

gcloud CLI を使用してモデルをデプロイするときに自動スケーリングを構成するには、gcloud ai endpoints deploy-model コマンドを使用します。

Google Cloud CLI の場合、指標キーワードは若干異なります。以下を使用します。

  • cpu-usage
  • gpu-duty-cycle
  • request-counts-per-minute

コマンドデータを使用する前に、次のように置き換えます。

  • ENDPOINT_ID: エンドポイントの ID。
  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • MODEL_ID: デプロイするモデルの ID。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。
  • METRIC_NAME_GCLOUD: 自動スケーリング指標の ID。
  • TARGET_THRESHOLD: 指定された指標の目標値。
gcloud ai endpoints deploy-model ENDPOINT_ID \
    --project=PROJECT_ID \
    --region=LOCATION \
    --model=MODEL_ID \
    --display-name=DEPLOYED_MODEL_DISPLAY_NAME \
    --machine-type=MACHINE_TYPE \
    --accelerator-type=ACCELERATOR_TYPE \
    --accelerator-count=ACCELERATOR_COUNT \
    --min-replica-count=MIN_REPLICA_COUNT \
    --max-replica-count=MAX_REPLICA_COUNT \
    --autoscaling-metric-specs=METRIC_NAME_GCLOUD=TARGET_THRESHOLD

REST

REST API を使用してモデルをデプロイするときに自動スケーリングを構成するには、projects.locations.endpoints.deployModel メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • ENDPOINT_ID: エンドポイントの ID。
  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_DISPLAY_NAME: デプロイされたモデルの表示名。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。
  • METRIC_NAME: 自動スケーリング指標の ID。
  • TARGET_THRESHOLD: 指定された指標の目標値。

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel

リクエストの本文(JSON):

{
  "deployedModel": {
    "model": "projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_DISPLAY_NAME",
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT,
      "autoscalingMetricSpecs": [
        {
          "metricName": "METRIC_NAME",
          "target": TARGET_THRESHOLD
        }
      ]
    }
  }
}

Pub/Sub キューサイズの指標に基づく自動スケーリング(プレビュー)では、追加の Pub/Sub サブスクリプション情報が必要です。

  • PUBSUB_SUBSCRIPTION_PROJECT_ID: Pub/Sub サブスクリプションのプロジェクト ID。
  • PUBSUB_SUBSCRIPTION_ID: Pub/Sub サブスクリプションの ID。
      "autoscalingMetricSpecs": [
        {
          "metricName": "METRIC_NAME",
          "target": TARGET_THRESHOLD,
          "monitoredResourceLabels": {
            "project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID",
            "subscription_id": "PUBSUB_SUBSCRIPTION_ID"
          },
        }
      ]

Python

Python SDK の自動スケーリングは、deploy() 関数呼び出しのパラメータ名で構成されます。サンプル コマンドでは、同時実行ベースの自動スケーリングを例として使用しています。構成可能な自動スケーリング パラメータは次のとおりです。

  • autoscaling_target_cpu_utilization
  • autoscaling_target_accelerator_duty_cycle
  • autoscaling_target_request_count_per_minute

Vertex AI SDK for Python を使用してモデルをデプロイするときに自動スケーリングを構成するには:

コードを実行する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • ENDPOINT_ID: エンドポイントの ID。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_DISPLAY_NAME: デプロイされたモデルの表示名。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。
  • METRIC_NAME: 自動スケーリング指標の ID。
  • TARGET_THRESHOLD: 指定された指標の目標値。
from google.cloud import aiplatform

# Initialize Vertex AI
aiplatform.init(project="PROJECT_ID", location="LOCATION")

# Get the model from Model Registry
model = aiplatform.Model("MODEL_ID")

# Get the endpoint
endpoint = aiplatform.Endpoint("ENDPOINT_ID")

# Deploy the model to the endpoint
model.deploy(
  endpoint=endpoint,
  machine_type="MACHINE_TYPE",
  accelerator_type="ACCELERATOR_TYPE",
  accelerator_count=ACCELERATOR_COUNT,
  min_replica_count=MIN_REPLICA_COUNT,
  max_replica_count=MAX_REPLICA_COUNT,
  autoscaling_target_request_count_per_minute=TARGET_THRESHOLD,
)

Pub/Sub キューサイズの指標に基づく自動スケーリング(プレビュー、aiplatform_v1beta1 のみがサポートされています)では、追加の Pub/Sub サブスクリプション情報が必要です。

  • PUBSUB_SUBSCRIPTION_PROJECT_ID: Pub/Sub サブスクリプションのプロジェクト ID。
  • PUBSUB_SUBSCRIPTION_ID: Pub/Sub サブスクリプションの ID。
from google.cloud import aiplatform_v1beta1 as aiplatform

# Initialize Vertex AI
aiplatform.init(project="PROJECT_ID", location="LOCATION")

# Get the model from Model Registry
model = aiplatform.Model("MODEL_ID")

# Get the endpoint
endpoint = aiplatform.Endpoint("ENDPOINT_ID")

# Deploy the model to the endpoint
model.deploy(
  endpoint=endpoint,
  machine_type="MACHINE_TYPE",
  accelerator_type="ACCELERATOR_TYPE",
  accelerator_count=ACCELERATOR_COUNT,
  min_replica_count=MIN_REPLICA_COUNT,
  max_replica_count=MAX_REPLICA_COUNT,
  autoscaling_target_pubsub_num_undelivered_messages=TARGET_THRESHOLD,
  autoscaling_pubsub_subscription_labels={
      "project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID",
      "subscription_id": "PUBSUB_SUBSCRIPTION_ID"
  },
)

自動スケーリング構成を更新する

既存の自動スケーリング構成を更新するには、次のいずれかのインターフェースを使用します。

REST

REST API を使用してデプロイされたモデルの自動スケーリング構成を更新するには、projects.locations.endpoints.mutateDeployedModel メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • ENDPOINT_ID: エンドポイントの ID。
  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • DEPLOYED_MODEL_ID: 更新するデプロイ済みモデルの ID。
  • MIN_REPLICA_COUNT: 自動スケーリングの新しいレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングの新しいレプリカの最大数。
  • METRIC_NAME: 自動スケーリング指標の ID。
  • TARGET_THRESHOLD: 指定された指標の目標値。

HTTP メソッドと URL:

PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:mutateDeployedModel

リクエストの本文(JSON):

{
  "deployedModel": {
    "id": "DEPLOYED_MODEL_ID",
    "dedicatedResources": {
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT,
      "autoscalingMetricSpecs": [
        {
          "metricName": "METRIC_NAME",
          "target": TARGET_THRESHOLD
        }
      ]
    }
  },
  "updateMask": {
    "paths": [
      "dedicated_resources.min_replica_count",
      "dedicated_resources.max_replica_count",
      "dedicated_resources.autoscaling_metric_specs"
    ]
  }
}

Pub/Sub キューサイズの指標に基づく自動スケーリング(プレビュー)では、追加の Pub/Sub サブスクリプション情報が必要です。

  • PUBSUB_SUBSCRIPTION_PROJECT_ID: Pub/Sub サブスクリプションのプロジェクト ID。
  • PUBSUB_SUBSCRIPTION_ID: Pub/Sub サブスクリプションの ID。
      "autoscalingMetricSpecs": [
        {
          "metricName": "METRIC_NAME",
          "target": TARGET_THRESHOLD,
          "monitoredResourceLabels": {
            "project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID",
            "subscription_id": "PUBSUB_SUBSCRIPTION_ID"
          },
        }
      ]

ゼロへのスケーリング(プレビュー

ゼロへのスケーリング機能を使用すると、トラフィックがないときにモデルサーバーのデプロイをゼロ レプリカに自動的にスケーリングできるため、この期間の課金は発生しません。

トラフィックがスケールダウンされたターゲット エンドポイントに到達すると、429 - Model is not yet ready for inference. Wait and then try your request again レスポンスが受信され、リクエストがドロップされ、スケールアップ信号がターゲット モデルサーバーに送信されます。

これにより、モデルサーバーは 0 から DedicatedResources.initial_replica_count フィールドで指定された値までスケールアップされます。デフォルト値は 1 です。

この機能は、次のユースケースを対象としています。

  • トラフィックのない期間が定期的に長く続くデプロイ。
  • 通常、営業時間中にトラフィックを受信し、それ以外の時間はアイドル状態になるエンドポイント。

有効化と使用

Scale To Zero 機能は、共有パブリック エンドポイントで有効にすることはできません。他のすべてのエンドポイント タイプは互換性があります。

Scale To Zero を有効にするには、deploy-model リクエストの DedicatedResources セクションで min_replica_count=0 を指定します(Vertex Prediction API の v1beta1 バージョンを対象とします)。

オプション パラメータ

DedicatedResources では、1 ~max_replica_count の範囲の initial_replica_count 値を指定できます(両端を含む)。

また、DedicatedResources に新しい ScaleToZeroSpec セクションが追加され、Scale to Zero に関連する 2 つのパラメータを構成できるようになりました。

  • min_scaleup_period: モデルサーバーが Scale to Zero 評価に登録されるまでの期間(秒単位)。トラフィックがない場合でも、この期間が経過するまで、デプロイはレプリカをゼロにスケールダウンしようとしません。これにより、トラフィックがターゲット エンドポイントに対してチェックされる前に(デプロイのスケールダウンが発生する可能性があります)、初期デプロイと後続のスケールアップ イベント中にバッファ値が有効になります。
    • デフォルト値: 1 時間(3,600 秒)
    • 最小値: 5 分(300 秒)
    • 最大値: 8 時間(28,800 秒)。
  • idle_scaledown_period: ターゲット モデルサーバーをゼロ レプリカにスケールダウンするまでのトラフィックがない期間(秒単位)。
    • デフォルト値: 1 時間(3,600 秒)
    • 最小値: 5 分(300 秒)
    • 最大値: 8 時間(28,800 秒)。

想定される動作

スケールダウンされたモデルに送信されたリクエストは、Model is not yet ready for inference. Please wait and then try your request again を含む 429 レスポンスを返します。

しばらく待ってから、もう一度リクエストしてください。このフェーズで送信されたリクエストはすべて破棄されます。

制限事項

  • Scale To Zero は、単一モデルのデプロイとエンドポイントごとの 1 つのモデルにのみ対応しています。
  • 共有パブリック エンドポイントでは Scale To Zero を有効にできません。他のすべてのエンドポイント タイプは互換性があります。
  • 予約がない場合、スケールダウン状態からスケールアップすると、在庫切れが発生する可能性があります(マシンタイプによって異なります)。
  • (トラフィックを受信しないため)30 日を超えてゼロにスケーリングされた DeployedModel は、自動デプロイ解除の対象となります。

gcloud

gcloud CLI を使用してモデルをデプロイするときにスケールゼロを構成するには、gcloud beta ai endpoints deploy-model コマンドを使用します。

コマンドデータを使用する前に、次のように置き換えます。

  • ENDPOINT_ID: エンドポイントの ID。
  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • MODEL_ID: デプロイするモデルの ID。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。
gcloud beta ai endpoints deploy-model ENDPOINT_ID \
    --project=PROJECT_ID \
    --region=LOCATION \
    --model=MODEL_ID \
    --display-name=DEPLOYED_MODEL_DISPLAY_NAME \
    --machine-type=MACHINE_TYPE \
    --accelerator-type=ACCELERATOR_TYPE \
    --accelerator-count=ACCELERATOR_COUNT \
    --min-replica-count=MIN_REPLICA_COUNT \
    --max-replica-count=MAX_REPLICA_COUNT \
    --min-scaleup-period=300s \
    --idle-scaledown-period=300s

REST

REST API を使用してモデルをデプロイするときにスケールダウンを構成するには、projects.locations.endpoints.deployModel メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • ENDPOINT_ID: エンドポイントの ID。
  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_DISPLAY_NAME: デプロイされたモデルの表示名。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel

リクエストの本文(JSON):

{
  "deployedModel": {
    "model": "projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_DISPLAY_NAME",
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT,
      "scale_to_zero_spec": {
          "min_scaleup_period": "300s",
          "idle_scaledown_period": "300s",
      },
    }
  }
}

Python

Python SDK のスケールダウン トゥ ゼロは、v1beta1 API クライアントを介して構成されます。

コードを実行する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID。
  • LOCATION: エンドポイントのリージョン。
  • ENDPOINT_ID: エンドポイントの ID。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_DISPLAY_NAME: デプロイされたモデルの表示名。
  • MACHINE_TYPE: デプロイされたモデルのマシンタイプ(例: n1-standard-4)を指定できます。
  • ACCELERATOR_TYPE: 省略可。接続する GPU アクセラレータのタイプ(例: NVIDIA_L4)を指定できます。
  • ACCELERATOR_COUNT: 省略可。各マシンに接続するアクセラレータの数。
  • MIN_REPLICA_COUNT: 自動スケーリングのレプリカの最小数。
  • MAX_REPLICA_COUNT: 自動スケーリングのレプリカの最大数。
  • METRIC_NAME: 自動スケーリング指標の ID。
  • TARGET_THRESHOLD: 指定された指標の目標値。
from google.cloud import aiplatform

# Initialize Vertex AI
aiplatform.init(project="PROJECT_ID", location="LOCATION")

# Get the model from Model Registry
model = aiplatform.Model("MODEL_ID")

# Get the endpoint
endpoint = aiplatform.Endpoint("ENDPOINT_ID")

# Deploy the model to the endpoint
model.deploy(
  endpoint=endpoint,
  machine_type="MACHINE_TYPE",
  accelerator_type="ACCELERATOR_TYPE",
  accelerator_count=ACCELERATOR_COUNT
  min_replica_count=MIN_REPLICA_COUNT,
  max_replica_count=MAX_REPLICA_COUNT,
  autoscaling_target_request_count_per_minute=TARGET_THRESHOLD,
)

import google.auth.transport.requests
import urllib3

# pip install google-cloud-aiplatform for this dependency
from google.cloud import aiplatform
from google.cloud.aiplatform_v1beta1.services import endpoint_service # For EndpointServiceClient
from google.cloud.aiplatform_v1beta1 import types as aiplatform_v1beta1_types # For message types

PROJECT_NUMBER = "PROJECT_ID"
LOCATION = "LOCATION"
ENDPOINT_DISPLAY_NAME = "stz-sdk-test"
MODEL_ID="MODEL_ID"

# Full resource name of your existing model in Vertex AI Model Registry
# e.g., "projects/your-gcp-project-id/locations/us-central1/models/your-model-id"
MODEL_RESOURCE_NAME = f"projects/{PROJECT_NUMBER}/locations/{LOCATION}/models/{MODEL_ID}"

# Deployment settings
MACHINE_TYPE = "MACHINE_TYPE"
ACCELERATOR_TYPE ="ACCELERATOR_TYPE",
ACCELERATOR_COUNT =ACCELERATOR_COUNT

# Disable InsecureRequestWarning for the requests part as in your snippet
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# The AI Platform services require regional API endpoints.
client_options = {"api_endpoint": f"{LOCATION}-aiplatform.googleapis.com"}
endpoint_service_client = endpoint_service.EndpointServiceClient(client_options=client_options)

def main():
    aiplatform.init(project=PROJECT_NUMBER, location=LOCATION)
    model_to_deploy = aiplatform.Model(model_name=MODEL_RESOURCE_NAME) # Initialize model object

    try:
        # # --- 1. Create an Endpoint ---
        print(f"\nCreating endpoint '{ENDPOINT_DISPLAY_NAME}'...")
        endpoint = aiplatform.Endpoint.create(
            display_name=ENDPOINT_DISPLAY_NAME,
            project=PROJECT_NUMBER,
            location=LOCATION,
            sync=True, # Wait for creation to complete
            dedicated_endpoint_enabled=True,
        )
        print(f"Endpoint created: {endpoint.resource_name}")
        endpoint_numeric_id = endpoint.name # This is the numeric ID
        print(f"Numeric Endpoint ID for URL: {endpoint_numeric_id}")

        print(f"\nFetching model details for: {MODEL_RESOURCE_NAME}")
        model_to_deploy = aiplatform.Model(model_name=MODEL_RESOURCE_NAME)

        # --- 2. Deploy the Model ---
        print(f"\nDeploying model '{model_to_deploy.resource_name}' to endpoint '{endpoint.display_name}'...")
        deployed_model_config = aiplatform_v1beta1_types.DeployedModel(
            model=model_to_deploy.resource_name,
            dedicated_resources=aiplatform_v1beta1_types.DedicatedResources(
                machine_spec=aiplatform_v1beta1_types.MachineSpec(
                    machine_type=MACHINE_TYPE,
                    accelerator_type=ACCELERATOR_TYPE,
                    accelerator_count=ACCELERATOR_COUNT,
                ),
                initial_replica_count=1,
                min_replica_count=0,
                max_replica_count=1,
                scale_to_zero_spec=aiplatform_v1beta1_types.DedicatedResources.ScaleToZeroSpec(
                    min_scaleup_period=300,
                    idle_scaledown_period=300,
                )
            ),
        )

        deploy_model_request = aiplatform_v1beta1_types.DeployModelRequest(
            endpoint=endpoint.resource_name,
            deployed_model=deployed_model_config,
        )

        # Alternatively, if you've got an existing endpoint, use:
        # endpoint_path = endpoint_service_client.endpoint_path(
        #     project=PROJECT_NUMBER, location=LOCATION, endpoint={ENDPOINT_ID}
        # )

        # deploy_model_request = aiplatform_v1beta1_types.DeployModelRequest(
        #     endpoint=endpoint_path,
        #     deployed_model=deployed_model_config,
        # )

        print("\nSending v1beta1 DeployModelRequest...")
        operation = endpoint_service_client.deploy_model(request=deploy_model_request)

        print("Waiting for v1beta1 update deploy model operation to complete (this can take several minutes)...")
        operation.result()
        print("Model deployed successfully.")

    except Exception as e:
        print(f"\nAn error occurred: {e}")

if __name__ == "__main__":
    main()

リソース使用量を管理する

エンドポイントをモニタリングして、CPU とアクセラレータの使用率、リクエスト数、レイテンシ、レプリカの現在の数とターゲット数などの指標を追跡できます。この情報は、エンドポイントのリソース使用量とスケーリング動作の理解に活用できます。

各レプリカではコンテナが 1 つしか実行されないことに注意してください。つまり、推論コンテナが選択されたコンピューティング リソース(マルチコア マシンのシングル スレッドコードなど)や、推論の一環として別のサービスを呼び出すカスタムモデルを十分に利用できない場合は、ノードがスケールアップされない可能性があります。

たとえば、FastAPI、またはワーカー数やスレッド数が構成可能なモデルサーバーを使用する場合は、リソース使用率を引き上げることができる複数のワーカーが存在すると、サービスがレプリカ数を自動的にスケーリングするための機能が改善されるケースが多数存在します。

通常は、コアごとに 1 つのワーカーまたはスレッドから始めることをおすすめします。CPU 使用率が低い場合(特に負荷が高い状況下で)、または CPU 使用率が低いためにモデルがスケールアップされない場合は、ワーカー数を引き上げる必要があります。一方、使用率が過剰に高く、負荷が生じた状態でレイテンシが予想以上に増加した場合は、使用するワーカーの数を削減してみてください。すでに 1 つのワーカーのみを使用している場合は、より小さなマシンタイプを使用してみてください。

スケーリングの動作とラグ

Vertex AI は、過去 5 分間のデータを使用して 15 秒ごとにレプリカの数を調整します。15 秒サイクルごとに、サーバー使用率が測定され、次の式に基づいてレプリカのターゲット数が生成されます。

target # of replicas = Ceil(current # of replicas * (current utilization / target utilization))

たとえば、2 つのレプリカが 100% 使用されている場合、ターゲットは以下のとおり 4 になります。

4 = Ceil(3.33) = Ceil(2 * (100% / 60%))

別の例として、10 個のレプリカがあり、使用率が 1% に低下した場合、ターゲットは以下のとおり 1 になります。

1 = Ceil(.167) = Ceil(10 * (1% / 60%))

15 秒の各サイクルの終了時に、過去 5 分間の最大ターゲット値に一致するようにレプリカの数を調整します。最大ターゲット値が選択されているため、全体の使用率が非常に低い場合でも、該当する 5 分間に使用率が急増しても、エンドポイントはスケールダウンされません。一方、システムをスケールアップする必要がある場合は、平均ではなく最大ターゲット値が選択されるため、15 秒以内にスケーリングが行われます。

Vertex AI がレプリカの数を調整しても、レプリカの起動または停止には時間を要することに注意してください。このため、エンドポイントがトラフィックに調整されるまでに、さらに遅延が発生します。この時間の原因となる主な要因は次のとおりです。

  • Compute Engine VM のプロビジョニングと起動に要する時間
  • レジストリからコンテナをダウンロードするために必要な時間
  • ストレージからモデルを読み込むために必要な時間

モデルの実際のスケーリング動作を理解する最善の方法は、負荷テストを実施し、モデルとユースケースにとって重要な特性を最適化することです。オートスケーラーのスケールアップ速度がアプリケーションに対して十分でない場合は、予想されるベースライン トラフィックを処理するのに十分な min_replicas をプロビジョニングします。

スケーリング構成を更新する

モデルのデプロイ時に DedicatedResources または AutomaticResources を指定した場合は、mutateDeployedModel を呼び出してモデルを再デプロイすることなくスケーリングの構成を更新できます。

たとえば、次のリクエストでは max_replicaautoscaling_metric_specs が更新され、コンテナ ロギングが無効に設定されます。

{
  "deployedModel": {
    "id": "2464520679043629056",
    "dedicatedResources": {
      "maxReplicaCount": 9,
      "autoscalingMetricSpecs": [
        {
          "metricName": "aiplatform.googleapis.com/prediction/online/cpu/utilization",
          "target": 50
        }
      ]
    },
    "disableContainerLogging": true
  },
  "update_mask": {
    "paths": [
      "dedicated_resources.max_replica_count",
      "dedicated_resources.autoscaling_metric_specs",
      "disable_container_logging"
    ]
  }
}

使用上の注意:

  • マシンタイプの変更や、DedicatedResources から AutomaticResources(またはその逆)への切り替えはできません。変更できるスケーリング構成フィールドは、min_replicamax_replicarequired_replicaAutoscalingMetricSpecDedicatedResources のみ)のみです。
  • 更新するフィールドはすべて updateMask にリストする必要があります。リストにないフィールドは無視されます。
  • DeployedModelDEPLOYED 状態である必要があります。デプロイされたモデルごとに、存在できるアクティブな変更オペレーションは 1 つのみです。
  • mutateDeployedModel を使用すると、コンテナ ロギングを有効または無効にすることもできます。詳細については、オンライン推論のロギングをご覧ください。