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

将用于在线推理的模型部署为 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。
      "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

# 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:自动扩缩指标的标识符。
  • 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. Wait and then try your request again 响应,丢弃请求,并向目标模型服务器发送扩缩信号。

这会导致模型服务器从零扩展到 DedicatedResources.initial_replica_count 字段中指定的任何值。默认值为 1。

此功能适用于以下使用场景:

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

启用和使用

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

如需启用“缩放至零”,请在部署模型请求的 DedicatedResources 部分(以 Vertex Prediction API 的 v1beta1 版本为目标)中指定 min_replica_count=0

可选参数

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 秒)。

预期行为

向缩减版模型发送请求会返回包含 Model is not yet ready for inference. Please wait and then try your request again 的 429 响应。

请稍等片刻,然后重试您的请求。请注意,在此阶段发送的任何请求都会被舍弃。

局限性

  • “缩减到零”功能仅与单模型部署兼容,并且每个端点只能有一个模型。
  • 无法在共享公共端点上启用“缩放至零”,但所有其他端点类型均兼容。
  • 如果没有预留,从缩减状态重新伸缩时可能会出现缺货情况(具体取决于机器类型)。
  • 如果 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 还可让您启用或停用容器日志记录。如需了解详情,请参阅在线推理日志记录