Quando esegui il deployment di un modello per l'inferenza online come DeployedModel
, puoi configurare
i nodi di inferenza in modo che vengano scalati automaticamente. Per farlo, imposta
dedicatedResources.maxReplicaCount
su un valore
maggiore di dedicatedResources.minReplicaCount
.
Quando configuri un DeployedModel
, devi impostare
dedicatedResources.minReplicaCount
su almeno 1. In altre parole, non puoi
configurare DeployedModel
in modo che venga scalato a 0 nodi di inferenza quando non viene
utilizzato.
In alternativa, se accetti di utilizzare la funzionalità Scale To Zero
(anteprima), il
campo dedicatedResources.minReplicaCount
può essere impostato su 0 e il workload
viene scalato a zero repliche quando non c'è traffico sull'endpoint. Per ulteriori
dettagli, vedi Scale To Zero.
Per impostazione predefinita, l'operazione di deployment viene considerata riuscita solo se il numero di nodi di inferenza raggiunge dedicatedResources.minReplicaCount
prima del valore di timeout della richiesta di deployment. In caso contrario, il deployment viene contrassegnato come non riuscito e
le risorse sottostanti vengono rilasciate.
Deployment e mutazione riusciti parzialmente
Puoi modificare il comportamento di deployment predefinito impostando
dedicatedResources.requiredReplicaCount
su un valore inferiore a
dedicatedResources.minReplicaCount
. In questo caso, quando il numero di nodi di inferenza raggiunge dedicatedResources.requiredReplicaCount
, l'operazione di deployment viene contrassegnata come riuscita, anche se non è ancora completata. Il deployment continua fino al raggiungimento di dedicatedResources.minReplicaCount
. Se dedicatedResources.minReplicaCount
non viene raggiunto
prima dell'ora della richiesta di deployment, l'operazione ha comunque esito positivo, ma in
DeployedModel.status.message
viene restituito un messaggio di errore per le repliche non riuscite.
La quota per la pubblicazione di modelli personalizzati viene calcolata in base all'utilizzo in tempo reale delle risorse di calcolo del modello di cui è stato eseguito il deployment. Se la somma di maxReplicaCount
per tutti i deployment nel tuo progetto supera la quota del progetto, la scalabilità automatica di alcuni deployment potrebbe non riuscire a causa dell'esaurimento della quota.
Gli endpoint vengono scalati in aumento e in diminuzione per macchina, ma la quota viene calcolata per CPU o GPU. Ad esempio, se il modello viene implementato nel tipo di macchina a2-highgpu-2g
, ogni replica attiva viene conteggiata come 24 CPU e 2 GPU rispetto alla quota del progetto. Per ulteriori informazioni, consulta Quote e limiti.
I nodi di inferenza per l'inferenza batch non vengono scalati automaticamente.
Vertex AI utilizza BatchDedicatedResources.startingReplicaCount
e
ignora BatchDedicatedResources.maxReplicaCount
.
Utilizzo e configurazione del target
Per impostazione predefinita, se esegui il deployment di un modello senza risorse GPU dedicate, Vertex AI aumenta o diminuisce automaticamente il numero di repliche in modo che l'utilizzo della CPU corrisponda al valore target predefinito del 60%.
Per impostazione predefinita, se esegui il deployment di un modello con risorse GPU dedicate (se
machineSpec.accelerator_count
è maggiore di 0), Vertex AI scala automaticamente il numero di repliche verso l'alto
o verso il basso in modo che l'utilizzo di CPU o GPU, a seconda di quale sia maggiore, corrisponda al valore target predefinito
del 60%. Pertanto, se la velocità effettiva di inferenza causa un utilizzo elevato della GPU, ma non della CPU, Vertex AI aumenterà le risorse e l'utilizzo della CPU sarà molto basso, il che sarà visibile nel monitoraggio. Al contrario,
se il tuo container personalizzato utilizza poco la GPU, ma ha un processo non correlato
che aumenta l'utilizzo della CPU oltre il 60%, Vertex AI eseguirà lo scale up, anche
se ciò non fosse necessario per raggiungere i target di QPS e latenza.
Puoi ignorare la metrica e il target di soglia predefiniti specificando
autoscalingMetricSpecs
.
Tieni presente che se il deployment è configurato per scalare solo in base all'utilizzo della CPU, non verrà eseguito lo scale up anche se l'utilizzo della GPU è elevato.
Sono supportate le seguenti metriche di scalabilità automatica:
- Utilizzo CPU (
aiplatform.googleapis.com/prediction/online/cpu/utilization
): Scala in base all'utilizzo della CPU. La sua unità è l'utilizzo della CPU per replica. Il valore target è una percentuale (0-100). Il valore target predefinito è 60%. - Utilizzo GPU (
aiplatform.googleapis.com/prediction/online/accelerator/duty_cycle
): scala in base all'utilizzo della GPU. La sua unità è l'utilizzo della GPU per replica. Il valore target è una percentuale (0-100). Il valore target predefinito è 60%. - Conteggio richieste (
aiplatform.googleapis.com/prediction/online/request_count
): scala in base al numero di richieste. La sua unità è richieste al minuto per replica. Il valore target è un numero intero. Questa metrica è disattivata per impostazione predefinita. - Dimensioni coda Pub/Sub (anteprima, nessun supporto di Google Cloud CLI) (
pubsub.googleapis.com/subscription/num_undelivered_messages
): scala in base al numero di messaggi non recapitati di una sottoscrizione Pub/Sub. La sua unità sono i messaggi non recapitati per replica. Il valore target è un numero intero. Questa metrica è disattivata per impostazione predefinita.
Quando configuri la scalabilità automatica, utilizza METRIC_NAME per l'identificatore della metrica e TARGET_THRESHOLD per il valore target.
Configurare la scalabilità automatica durante il deployment
Per configurare la scalabilità automatica durante il deployment di un modello, utilizza una delle seguenti interfacce:
gcloud
Per configurare la scalabilità automatica durante il deployment di un modello utilizzando gcloud CLI, utilizza il comando gcloud ai endpoints deploy-model
.
Tieni presente che per Google Cloud CLI la parola chiave della metrica è leggermente diversa. Utilizza quanto segue:
- cpu-usage
- gpu-duty-cycle
- request-counts-per-minute
Prima di utilizzare i dati dei comandi, effettua le seguenti sostituzioni:
- ENDPOINT_ID: l'ID dell'endpoint.
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
- METRIC_NAME_GCLOUD: l'identificatore della metrica di scalabilità automatica.
- TARGET_THRESHOLD: il valore target per la metrica specificata.
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
Per configurare la scalabilità automatica durante il deployment di un modello utilizzando l'API REST, utilizza il metodo projects.locations.endpoints.deployModel
.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- ENDPOINT_ID: l'ID dell'endpoint.
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- DEPLOYED_MODEL_DISPLAY_NAME: un nome visualizzato per il modello di cui è stato eseguito il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
- METRIC_NAME: l'identificatore della metrica di scalabilità automatica.
- TARGET_THRESHOLD: il valore target per la metrica specificata.
Metodo HTTP e URL:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel
Corpo JSON della richiesta:
{
"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
}
]
}
}
}
Per la scalabilità automatica basata sulle metriche relative alle dimensioni della coda Pub/Sub (anteprima), sono necessarie ulteriori informazioni sulla sottoscrizione Pub/Sub:
- PUBSUB_SUBSCRIPTION_PROJECT_ID: l'ID progetto dell'abbonamento Pub/Sub.
- PUBSUB_SUBSCRIPTION_ID: l'ID della sottoscrizione Pub/Sub.
"autoscalingMetricSpecs": [
{
"metricName": "METRIC_NAME",
"target": TARGET_THRESHOLD,
"monitoredResourceLabels": {
"project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID",
"subscription_id": "PUBSUB_SUBSCRIPTION_ID"
},
}
]
Python
La scalabilità automatica dell'SDK Python viene configurata tramite i nomi dei parametri nella chiamata di funzione deploy()
. Il comando di esempio utilizza la scalabilità automatica basata sulla concorrenza come esempio. I parametri di scalabilità automatica configurabili sono:
- autoscaling_target_cpu_utilization
- autoscaling_target_accelerator_duty_cycle
- autoscaling_target_request_count_per_minute
Per configurare la scalabilità automatica durante il deployment di un modello utilizzando l'SDK Vertex AI per Python:
Prima di eseguire il codice, effettua le seguenti sostituzioni:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- ENDPOINT_ID: l'ID dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- DEPLOYED_MODEL_DISPLAY_NAME: un nome visualizzato per il modello di cui è stato eseguito il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
- METRIC_NAME: l'identificatore della metrica di scalabilità automatica.
- TARGET_THRESHOLD: il valore target per la metrica specificata.
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,
)
Per la scalabilità automatica basata sulle metriche relative alle dimensioni della coda Pub/Sub (anteprima, è supportata solo aiplatform_v1beta1), sono necessarie ulteriori informazioni sulla sottoscrizione Pub/Sub:
- PUBSUB_SUBSCRIPTION_PROJECT_ID: l'ID progetto dell'abbonamento Pub/Sub.
- PUBSUB_SUBSCRIPTION_ID: l'ID della sottoscrizione Pub/Sub.
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"
},
)
Aggiorna la configurazione della scalabilità automatica
Per aggiornare una configurazione di scalabilità automatica esistente, utilizza una delle seguenti interfacce:
REST
Per aggiornare la configurazione della scalabilità automatica di un modello di cui è stato eseguito il deployment utilizzando l'API REST,
utilizza il metodo projects.locations.endpoints.mutateDeployedModel
.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- ENDPOINT_ID: l'ID dell'endpoint.
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- DEPLOYED_MODEL_ID: l'ID del modello di cui è stato eseguito il deployment da aggiornare.
- MIN_REPLICA_COUNT: il nuovo numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il nuovo numero massimo di repliche per la scalabilità automatica.
- METRIC_NAME: l'identificatore della metrica di scalabilità automatica.
- TARGET_THRESHOLD: il valore target per la metrica specificata.
Metodo HTTP e URL:
PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:mutateDeployedModel
Corpo JSON della richiesta:
{
"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"
]
}
}
Per la scalabilità automatica basata sulle metriche relative alle dimensioni della coda Pub/Sub (anteprima), sono necessarie ulteriori informazioni sulla sottoscrizione Pub/Sub:
- PUBSUB_SUBSCRIPTION_PROJECT_ID: l'ID progetto dell'abbonamento Pub/Sub.
- PUBSUB_SUBSCRIPTION_ID: l'ID della sottoscrizione Pub/Sub.
"autoscalingMetricSpecs": [
{
"metricName": "METRIC_NAME",
"target": TARGET_THRESHOLD,
"monitoredResourceLabels": {
"project_id": "PUBSUB_SUBSCRIPTION_PROJECT_ID",
"subscription_id": "PUBSUB_SUBSCRIPTION_ID"
},
}
]
Scalabilità fino a zero (anteprima)
La funzionalità Scale To Zero consente di scalare automaticamente i deployment del server del modello a zero repliche in assenza di traffico, con conseguente assenza di fatturazione durante questo periodo.
Quando il traffico raggiunge l'endpoint di riduzione delle dimensioni target, viene ricevuta una risposta 429 - Model is not yet
ready for inference. Wait and then try your request again
,
la richiesta viene eliminata e viene inviato un segnale di scalabilità verticale al server del modello target.
Di conseguenza, il server del modello viene scalato da zero al valore specificato nel campo DedicatedResources.initial_replica_count
. Il valore predefinito è 1.
Questa funzionalità è progettata per i seguenti casi d'uso:
- Deployment con lunghi periodi di assenza di traffico su base regolare.
- Endpoint che in genere ricevono traffico durante l'orario lavorativo e sono inattivi in altri momenti.
Attivazione e utilizzo
La funzionalità Scale To Zero non può essere abilitata sugli endpoint pubblici condivisi. Tutti gli altri tipi di endpoint sono compatibili.
Per abilitare Scale to Zero, specifica min_replica_count=0
nella sezione
DedicatedResources
della richiesta di deployment del modello (che ha come target la
versione v1beta1 dell'API Vertex Prediction).
Parametri facoltativi
In DedicatedResources
, puoi specificare un valore initial_replica_count
compreso tra 1 e max_replica_count
(inclusi).
È stata aggiunta anche una nuova sezione ScaleToZeroSpec
a DedicatedResources
che consente la configurazione di due parametri relativi alla scalabilità fino a zero:
min_scaleup_period
: durata (in secondi) prima che un server di modelli venga registrato nella valutazione di Scale to Zero. Il deployment non tenterà di ridurre di nuovo a zero le repliche fino al termine di questo periodo, anche se non c'è traffico. Ciò consente di avere un valore buffer durante l'implementazione iniziale e gli eventi di scalabilità successivi prima che il traffico venga controllato rispetto all'endpoint di destinazione (il che potrebbe comportare la riduzione dell'implementazione).- Valore predefinito: 1 ora (3600 secondi)
- Valore minimo: 5 minuti (300 secondi)
- Valore massimo: 8 ore (28.800 sec).
idle_scaledown_period
: durata (in secondi) di assenza di traffico prima dello scale down del server del modello di destinazione a zero repliche.- Valore predefinito: 1 ora (3600 secondi)
- Valore minimo: 5 minuti (300 secondi)
- Valore massimo: 8 ore (28.800 sec).
Comportamenti previsti
Una richiesta inviata a un modello ridimensionato restituirà una risposta 429 con Model is
not yet ready for inference. Please wait and then try your request again
.
Attendi e riprova a inviare la richiesta. Tieni presente che le richieste inviate in questa fase verranno eliminate.
Limitazioni
- La scalabilità fino a zero è compatibile solo con le implementazioni di un singolo modello e un modello per endpoint.
- Scale To Zero non può essere abilitato sugli endpoint pubblici condivisi. Tutti gli altri tipi di endpoint sono compatibili.
- Senza prenotazioni, è possibile che si verifichino esaurimenti delle scorte durante il ripristino da uno stato ridimensionato (a seconda del tipo di macchina).
I modelli di cui è stato eseguito il deployment e che sono stati scalati a zero per più di 30 giorni (perché non hanno ricevuto traffico) sono soggetti a annullamento automatico del deployment.
gcloud
Per configurare lo scale-to-zero durante il deployment di un modello utilizzando gcloud CLI,
utilizza il comando gcloud beta ai endpoints deploy-model
.
Prima di utilizzare i dati dei comandi, effettua le seguenti sostituzioni:
- ENDPOINT_ID: l'ID dell'endpoint.
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
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
Per configurare lo scale-to-zero durante il deployment di un modello utilizzando l'API REST,
utilizza il metodo projects.locations.endpoints.deployModel
.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- ENDPOINT_ID: l'ID dell'endpoint.
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- DEPLOYED_MODEL_DISPLAY_NAME: un nome visualizzato per il modello di cui è stato eseguito il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
Metodo HTTP e URL:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel
Corpo JSON della richiesta:
{
"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
Lo scale-to-zero dell'SDK Python viene configurato tramite il client API v1beta1.
Prima di eseguire il codice, effettua le seguenti sostituzioni:
- PROJECT_ID: il tuo ID progetto.
- LOCATION: la regione dell'endpoint.
- ENDPOINT_ID: l'ID dell'endpoint.
- MODEL_ID: l'ID del modello da eseguire il deployment.
- DEPLOYED_MODEL_DISPLAY_NAME: un nome visualizzato per il modello di cui è stato eseguito il deployment.
- MACHINE_TYPE: il tipo di macchina per il modello di cui è stato eseguito il deployment (ad es.
n1-standard-4
). - ACCELERATOR_TYPE: facoltativo. Il tipo di acceleratore GPU da collegare (ad es.
NVIDIA_L4
). - ACCELERATOR_COUNT: facoltativo. Il numero di acceleratori da collegare a ogni macchina.
- MIN_REPLICA_COUNT: il numero minimo di repliche per la scalabilità automatica.
- MAX_REPLICA_COUNT: il numero massimo di repliche per la scalabilità automatica.
- METRIC_NAME: l'identificatore della metrica di scalabilità automatica.
- TARGET_THRESHOLD: il valore target per la metrica specificata.
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()
Gestire l'utilizzo delle risorse
Puoi monitorare l'endpoint per tenere traccia di metriche come l'utilizzo di CPU e acceleratore, il numero di richieste, la latenza e il numero attuale e target di repliche. Queste informazioni possono aiutarti a comprendere l'utilizzo delle risorse e il comportamento di scalabilità dell'endpoint.
Tieni presente che ogni replica esegue un solo container. Ciò significa che se un container di inferenza non può utilizzare completamente la risorsa di calcolo selezionata, ad esempio codice a thread singolo per una macchina multicore o un modello personalizzato che chiama un altro servizio nell'ambito dell'inferenza, i nodi potrebbero non essere scalati.
Ad esempio, se utilizzi FastAPI o qualsiasi server di modelli che dispone di un numero configurabile di worker o thread, in molti casi avere più di un worker può aumentare l'utilizzo delle risorse, il che migliora la capacità del servizio di scalare automaticamente il numero di repliche.
In genere, consigliamo di iniziare con un worker o un thread per core. Se noti che l'utilizzo della CPU è basso, soprattutto in condizioni di carico elevato, o che il modello non viene scalato perché l'utilizzo della CPU è basso, aumenta il numero di worker. Se invece noti che l'utilizzo è troppo elevato e le latenze aumentano più del previsto sotto carico, prova a utilizzare meno worker. Se utilizzi già un solo worker, prova a utilizzare un tipo di macchina più piccolo.
Comportamento di scalabilità e ritardo
Vertex AI regola il numero di repliche ogni 15 secondi utilizzando i dati della finestra di 5 minuti precedente. Per ogni ciclo di 15 secondi, il sistema misura l'utilizzo del server e genera un numero target di repliche in base alla seguente formula:
target # of replicas = Ceil(current # of replicas * (current utilization / target utilization))
Ad esempio, se hai due repliche utilizzate al 100%, il target è 4:
4 = Ceil(3.33) = Ceil(2 * (100% / 60%))
Un altro esempio: se hai 10 repliche e l'utilizzo scende all'1%, il target è 1:
1 = Ceil(.167) = Ceil(10 * (1% / 60%))
Al termine di ogni ciclo di 15 secondi, il sistema regola il numero di repliche in modo che corrisponda al valore target più alto della finestra di 5 minuti precedente. Tieni presente che poiché viene scelto il valore target più alto, l'endpoint non verrà ridimensionato se si verifica un aumento improvviso dell'utilizzo durante la finestra di 5 minuti, anche se l'utilizzo complessivo è molto basso. D'altra parte, se il sistema deve essere scalato, lo farà entro 15 secondi, perché viene scelto il valore target più alto anziché la media.
Tieni presente che anche dopo che Vertex AI ha modificato il numero di repliche, è necessario del tempo per avviare o disattivare le repliche. Pertanto, c'è un ulteriore ritardo prima che l'endpoint possa adattarsi al traffico. I principali fattori che contribuiscono a questo tempo includono:
- Il tempo necessario per eseguire il provisioning e avviare le VM di Compute Engine
- Il tempo necessario per scaricare il container dal registro
- Il tempo necessario per caricare il modello dallo spazio di archiviazione
Il modo migliore per comprendere il comportamento di scalabilità del modello nel mondo reale è
eseguire un test di carico e ottimizzare le caratteristiche importanti per il modello e
il caso d'uso. Se lo scalatore automatico non esegue lo scale up abbastanza rapidamente per la tua
applicazione, esegui il provisioning di min_replicas
sufficienti per gestire il traffico
di base previsto.
Aggiorna la configurazione di scalabilità
Se hai specificato DedicatedResources
o AutomaticResources
durante il deployment del modello, puoi aggiornare la configurazione di scalabilità senza eseguire nuovamente il deployment del modello chiamando mutateDeployedModel
.
Ad esempio, la seguente richiesta aggiorna max_replica
,
autoscaling_metric_specs
e disattiva la registrazione dei log dei container.
{
"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"
]
}
}
Note sull'utilizzo:
- Non puoi modificare il tipo di macchina o passare da
DedicatedResources
aAutomaticResources
o viceversa. Gli unici campi di configurazione dello scaling che puoi modificare sono:min_replica
,max_replica
,required_replica
eAutoscalingMetricSpec
(soloDedicatedResources
). - Devi elencare tutti i campi che devi aggiornare in
updateMask
. I campi non elencati vengono ignorati. - DeployedModel
deve essere nello stato
DEPLOYED
. Può essere presente al massimo un'operazione mutate attiva per modello sottoposto a deployment. mutateDeployedModel
consente anche di attivare o disattivare la registrazione dei container. Per ulteriori informazioni, consulta Registrazione dell'inferenza online.