将用于在线推理的模型部署为 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
以处理预期的基准流量。
更新扩缩配置
如果您在部署模型时指定了 DedicatedResources
或 AutomaticResources
,您可以通过调用 mutateDeployedModel
来更新扩缩配置,而无需重新部署模型。
例如,以下请求会更新 max_replica
、autoscaling_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_replica
、max_replica
、required_replica
和AutoscalingMetricSpec
(仅限DedicatedResources
)。 - 您必须在
updateMask
中列出要更新的每个字段。不公开列出的字段会被忽略。 - DeployedModel 必须处于
DEPLOYED
状态。每个已部署的模型最多只能有一个活跃的变更操作。 mutateDeployedModel
还可让您启用或停用容器日志记录。如需了解详情,请参阅在线推理日志记录。