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

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

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

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

根據預設,只有在推論節點數量達到 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。詳情請參閱「配額和限制」。

批次推論的推論節點不會自動調整資源配置。Agent Platform 會使用 BatchDedicatedResources.startingReplicaCount,並忽略 BatchDedicatedResources.maxReplicaCount

目標使用率和設定

根據預設,如果您部署模型時未指定專屬 GPU 資源,Gemini Enterprise Agent Platform 會自動調度副本數量,讓 CPU 使用率符合預設的 60% 目標值。

根據預設,如果您部署的模型使用專屬 GPU 資源 (如果 machineSpec.accelerator_count 大於 0),Gemini Enterprise Agent Platform 會自動調高或調低副本數量,讓 CPU 或 GPU 用量 (以較高者為準) 符合預設的 60% 目標值。因此,如果推論處理量導致 GPU 用量偏高,但 CPU 用量不高,Agent Platform 就會調高副本數量,而 CPU 使用率會非常低,這點會顯示在監控畫面中。反之,如果自訂容器的 GPU 使用率偏低,但有不相關的程序導致 CPU 使用率高於 60%,Agent Platform 就會調高副本數量,即使這可能並非達到 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%。
  • DCGM GPU 使用率 (預覽版)(prometheus.googleapis.com/vertex_dcgm_fi_dev_gpu_util): 根據 DCGM 指標調整 GPU 使用率。單位為每個副本的 GPU 使用率。目標值為百分比 (0 到 100)。這項指標預設為停用。
  • vLLM GPU KV 快取用量百分比 (預覽版)(prometheus.googleapis.com/vertex_vllm_gpu_cache_usage_perc): 根據 GPU KV 快取用量百分比的 vLLM 指標進行調整。單位為每個副本的 GPU KV 快取用量百分比。目標值為百分比 (0 到 100)。這項指標預設為停用。
  • 等待的 vLLM 要求數 (預先發布版)(prometheus.googleapis.com/vertex_vllm_num_requests_waiting): 根據等待的要求數 vLLM 指標進行調整。單位是每個副本等待的要求數。目標值為整數。這項指標預設為停用。
  • 要求計數 (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
  • dcgm-fi-dev-gpu-util
  • vllm-gpu-cache-usage-perc
  • vllm-num-requests-waiting
  • 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。這個欄位的長度上限為 63 個字元。
      "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_dcgm_fi_dev_gpu_util
  • autoscaling_target_vllm_gpu_cache_usage_perc
  • autoscaling_target_vllm_num_requests_waiting
  • autoscaling_target_request_count_per_minute

使用 Agent Platform 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 Agent Platform
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
from google.api_core.client_options import ClientOptions

# Initialize the EndpointServiceClient
client_options = ClientOptions(api_endpoint="LOCATION-aiplatform.googleapis.com")
client = aiplatform.EndpointServiceClient(client_options=client_options)

# Specify the location
location = "projects/PROJECT_NUMBER/locations/LOCATION"

model_name = "projects/PROJECT_NUMBER/locations/LOCATION/models/MODEL_ID"
autoscaling_metric_specs = [
    {"metric_name": "pubsub.googleapis.com/subscription/num_undelivered_messages", "target": TARGET_THRESHOLD, "monitored_resource_labels":{"project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID","subscription_id": "PUBSUB_SUBSCRIPTION_ID"}}
]

deployed_model = aiplatform.DeployedModel(
    model=model_name,
    display_name="DEPLOYED_MODEL_DISPLAY_NAME",
    dedicated_resources=aiplatform.DedicatedResources(
        machine_spec=aiplatform.MachineSpec(
            machine_type="MACHINE_TYPE"
        ),
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        autoscaling_metric_specs=autoscaling_metric_specs
    )
)

deploy_request = aiplatform.DeployModelRequest(
    deployed_model=deployed_model,
    endpoint="projects/PROJECT_NUMBER/locations/LOCATION/endpoints/ENDPOINT_ID",
    traffic_split={"0": 100}
)

deploy_operation = client.deploy_model(deploy_request)
print("Long-running operation initiated to deploy model.")
deploy_operation.result()

print("Model deployed to endpoint.")

更新自動調度資源設定

如要更新現有的自動調度資源設定,請使用下列任一介面:

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

將數量縮減為零 (預先發布版)

「縮減至零」功能可讓模型伺服器部署作業在沒有流量時,自動縮減至零個副本,因此這段期間不會產生任何費用。

當流量到達縮減規模的目標端點時,系統會收到 429 - Model is not yet ready for inference. Please wait while model completes scale-up from zero, 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:模型伺服器註冊參與「縮減至零」評估前的時間長度 (以秒為單位)。即使沒有流量,部署作業也會等到這段時間結束,才會嘗試將副本數量縮減為零。這項設定可在初始部署期間和後續擴充事件中提供緩衝值,然後再根據目標端點檢查流量 (這可能會導致部署作業縮減)。
    • 預設值: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

請稍後再試一次。請注意,系統會捨棄在此階段傳送的任何要求。

限制

  • 「將資源調度率降至零」功能僅適用於單一模型部署作業,每個端點只能有一個模型。
  • 縮減為零功能不支援多主機 GPU 或多主機 TPU 部署項目,但支援單主機 GPU 或 TPU 部署項目。
  • 共用公開端點無法啟用「縮減至零」,但其他端點類型皆可啟用。
  • 如果沒有預留項目,從縮減狀態擴充回來時,可能會發生缺貨情形 (視機型而定)。
  • 如果已部署的模型未收到任何流量,導致資源調度率降至零超過 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 Agent Platform
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 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 使用率偏低而未擴充,請增加工作站數量。另一方面,如果發現使用率過高,且負載下的延遲時間超出預期,請嘗試減少工作人員數量。如果目前只使用單一工作站,請嘗試使用較小的機器類型。

縮放行為和延遲

Gemini Enterprise Agent Platform 會使用前 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 秒內完成,因為系統會選擇最高目標值,而非平均值。

請注意,即使 Gemini Enterprise Agent Platform 調整了副本數量,啟動或關閉副本仍需要時間。因此,端點需要額外延遲時間,才能配合流量調整。造成這段時間的主要因素包括:

  • 佈建及啟動 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 您也可以啟用或停用容器記錄功能。詳情請參閱「線上推論記錄」。