使用自动扩缩功能扩缩推理节点

当您将模型作为 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,并计入项目的配额。如需了解详情,请参阅配额和限制

用于批量推理的推理节点不会自动扩缩。 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 作为指标标识符,并使用 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:自动扩缩指标的标识符。
  • 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:自动扩缩指标的标识符。
  • 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_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:自动扩缩指标的标识符。
  • 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
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:自动扩缩指标的标识符。
  • 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。

此功能专为以下使用场景设计:

  • 部署定期出现长时间无流量的情况。
  • 端点通常在营业时间内接收流量,而在其他时间处于空闲状态。

启用和使用

“缩减至零”功能无法在共享公共端点上启用。所有其他端点类型均兼容。

如需启用“缩减至零”,请在 deploy-model 请求的 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 部署是兼容的。
  • “缩减至零”无法在共享公共端点上启用,所有其他端点类型均兼容。
  • 如果没有预留,在从已缩容状态重新扩容时可能会遇到资源短缺问题(取决于机器类型)。
  • 如果 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:自动扩缩指标的标识符。
  • 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 每 15 秒根据过去 5 分钟窗口内的数据调整副本数量。在每个 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 虚拟机的时间
  • 从注册数据库下载容器的时间
  • 从存储空间加载模型的时间

如需了解模型的实际扩缩行为,最佳方法是运行负载测试并优化对您的模型和用例至关重要的特征。如果自动扩缩器为应用扩容的速度不够快,请预配足够的 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 还可让您启用或停用容器日志记录。如需了解详情,请参阅在线推理日志记录