使用自動調度功能調整推論節點

將模型部署為 DeployedModel 以進行線上推論時,您可以設定推論節點自動調度資源。如要這麼做,請將 dedicatedResources.maxReplicaCount 設為大於 dedicatedResources.minReplicaCount 的值。

設定 DeployedModel 時,dedicatedResources.minReplicaCount 至少須設為 1。換句話說,您無法設定 DeployedModel,在閒置時將推論節點數量調度為 0。

或者,如果您接受使用「調度至零」功能 (預先發布版),則可將 dedicatedResources.minReplicaCount 欄位設為 0,且端點沒有流量時,工作負載會將副本數量調度至零。詳情請參閱「Scale To Zero」。

根據預設,只有在推論節點數量達到 dedicatedResources.minReplicaCount 前,部署要求逾時值才會視為部署作業成功。否則部署作業會標示為失敗,並釋出基礎資源。

部分成功部署及突變

如要修改預設部署行為,請將 dedicatedResources.requiredReplicaCount 設為小於 dedicatedResources.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),Vertex AI 會自動調高或調低副本數量,使 CPU 或 GPU 用量 (以較高者為準) 符合預設的 60% 目標值。因此,如果推論輸送量導致 GPU 使用率偏高,但 CPU 使用率不高,Vertex AI 就會擴充資源,而 CPU 使用率會非常低,這點會顯示在監控畫面中。反之,如果自訂容器的 GPU 使用率偏低,但有不相關的程序導致 CPU 使用率高於 60%,Vertex AI 就會擴充,即使這可能並非達到 QPS 和延遲目標的必要做法。

如要覆寫預設的門檻指標和目標,請指定 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): 根據要求數調整規模。單位為每個副本每分鐘的要求數。目標值為整數。這項指標預設為停用。
  • Pub/Sub 佇列大小 (預先發布,不支援 Google Cloud CLI) (pubsub.googleapis.com/subscription/num_undelivered_messages): 根據 Pub/Sub 訂閱項目未傳送的訊息數量進行調整。單位是每個副本的未傳送訊息數。目標值為整數。這項指標預設為停用。

設定自動調度資源時,請使用 METRIC_NAME 做為指標 ID,並使用 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 方法和網址:

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

使用 Python 適用的 Vertex AI SDK 部署模型時,如要設定自動調度資源,請按照下列步驟操作:

執行程式碼前,請先替換以下項目:

  • 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 方法和網址:

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"
          },
        }
      ]

將資源調度率降至零 (預先發布版)

「Scale To Zero」功能可讓您在沒有流量時,自動將模型伺服器部署作業的副本數調度為零,因此這段期間不會產生任何費用。

當流量到達目標縮減端點時,系統會收到 429 - Model is not yet ready for inference. Wait and then try your request again 回應、捨棄要求,並將擴充信號傳送至目標模型伺服器。

這會導致模型伺服器從零擴充至 DedicatedResources.initial_replica_count 欄位中指定的值。預設值為 1。

這項功能適用於下列用途:

  • 部署作業定期出現長時間無流量的情況。
  • 通常在營業時間內會收到流量,其他時間則處於閒置狀態的端點。

啟用和使用

共用公開端點無法啟用「縮減至零」功能。其他端點類型皆可使用。

如要啟用「Scale To Zero」,請在部署模型要求的 DedicatedResources 區段中指定 min_replica_count=0 (以 Vertex Prediction API 的 v1beta1 版為目標)。

選用參數

DedicatedResources 中,您可以指定介於 1 和 max_replica_count (含) 之間的 initial_replica_count 值。

此外,DedicatedResources 中也新增了 ScaleToZeroSpec 區段,可供設定與「縮減至零」相關的兩個參數:

  • min_scaleup_period:模型伺服器註冊 Scale to Zero 評估前的時間長度 (以秒為單位)。即使沒有流量,部署作業也不會嘗試將副本數調度回零,直到這段時間結束為止。這項設定可在初始部署期間和後續擴充事件中啟用緩衝區值,然後再根據目標端點檢查流量 (這可能會導致部署作業縮減)。
    • 預設值:1 小時 (3600 秒)
    • 最小值:5 分鐘 (300 秒)
    • 最大值:8 小時 (28800 秒)。
  • idle_scaledown_period:將目標模型伺服器縮減至零個副本前,沒有流量的時間長度 (以秒為單位)。
    • 預設值:1 小時 (3600 秒)
    • 最小值:5 分鐘 (300 秒)
    • 最大值:8 小時 (28800 秒)。

預期行為

如果傳送要求給縮減規模的模型,系統會傳回 429 回應和 Model is not yet ready for inference. Please wait and then try your request again

請稍候片刻再重新提出要求。請注意,在此階段傳送的任何要求都會遭到捨棄。

限制

  • 「縮減為零」功能僅適用於單一模型部署作業,且每個端點只能有一個模型。
  • 共用公開端點無法啟用「縮減至零」,但其他端點類型皆可啟用。
  • 如果沒有預留項目,從縮減狀態擴充回來時,可能會發生缺貨情形 (視機器類型而定)。
  • 如果 DeployedModel 擴充至零的時間超過 30 天 (因為沒有收到流量),系統會自動取消部署。

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 方法和網址:

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 和加速器用量、要求數、延遲時間,以及目前和目標副本數等指標。這項資訊可協助您瞭解端點的資源用量和擴縮行為。

請注意,每個副本只會執行單一容器。也就是說,如果推論容器無法充分運用所選的運算資源 (例如多核心機器的單一執行緒程式碼,或呼叫其他服務的自訂模型,做為推論程序的一部分),節點可能不會擴充。

舉例來說,如果您使用 FastAPI,或任何可設定工作站或執行緒數量的模型伺服器,在許多情況下,使用多個工作站可提高資源使用率,進而提升服務自動調度副本數量的能力。

一般而言,我們建議每個核心先從一個工作者或執行緒開始。如果發現 CPU 使用率偏低 (尤其是在高負載情況下),或是模型因 CPU 使用率偏低而未擴充,請增加工作站數量。另一方面,如果發現使用率過高,且負載量增加時延遲時間超出預期,請嘗試減少工作人員數量。如果目前只使用單一工作站,請嘗試使用較小的機器類型。

縮放行為和延遲

Vertex AI 會使用前 5 分鐘時間範圍的資料,每 15 秒調整一次副本數量。系統會以每 15 秒為週期測量伺服器用量,並根據下列公式產生目標副本數:

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

舉例來說,如果您有兩個副本的使用率為 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,以處理預期的基準流量。

更新資源調度設定

如果您在部署模型時指定 DedicatedResourcesAutomaticResources,則可呼叫 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_replicaAutoscalingMetricSpec (僅限 DedicatedResources)。
  • 您必須在 updateMask 中列出所有需要更新的欄位。系統會忽略未列出的欄位。
  • DeployedModel 必須處於 DEPLOYED 狀態。每個已部署的模型最多只能有一個有效的變動作業。
  • mutateDeployedModel 您也可以透過這項設定啟用或停用容器記錄功能。詳情請參閱「線上推論記錄」。