Ottenere inferenze online per un modello di previsione

Vertex AI offre due opzioni per proiettare i valori futuri utilizzando il modello di previsione addestrato: inferenze online e inferenze batch.

Un'inferenza online è una richiesta sincrona. Utilizza le inferenze online quando effettui richieste in risposta all'input dell'applicazione o in altre situazioni in cui è necessaria un'inferenza tempestiva.

Una richiesta di inferenza batch è una richiesta asincrona. Utilizza le inferenze batch quando non hai bisogno di una risposta immediata e vuoi elaborare i dati accumulati utilizzando una singola richiesta.

Questa pagina mostra come proiettare i valori futuri utilizzando le inferenze online. Per scoprire come proiettare i valori utilizzando le inferenze batch, consulta Ottenere inferenze batch per un modello di previsione.

Devi eseguire il deployment del modello in un endpoint prima di poterlo utilizzare per le inferenze. Un endpoint è un insieme di risorse fisiche.

Puoi richiedere una spiegazione anziché un'inferenza. I valori di importanza delle caratteristiche locali della spiegazione indicano in che misura ciascuna caratteristica ha contribuito al risultato dell'inferenza. Per una panoramica concettuale, vedi Attribuzioni delle caratteristiche per la previsione.

Per informazioni sui prezzi delle inferenze online, consulta la pagina Prezzi di Tabular Workflows.

Prima di iniziare

Prima di poter effettuare una richiesta di inferenza online, devi prima addestrare un modello.

Crea o seleziona un endpoint

Utilizza la funzione aiplatform.Endpoint.create() per creare un endpoint. Se hai già un endpoint, utilizza la funzione aiplatform.Endpoint() per selezionarlo.

Il seguente codice fornisce un esempio:

# Import required modules
from google.cloud import aiplatform
from google.cloud.aiplatform import models

PROJECT_ID = "PROJECT_ID"
REGION = "REGION"

# Initialize the Vertex SDK for Python for your project.
aiplatform.init(project=PROJECT_ID, location=REGION)
endpoint = aiplatform.Endpoint.create(display_name='ENDPOINT_NAME')

Sostituisci quanto segue:

  • PROJECT_ID: il tuo ID progetto.
  • REGION: la regione in cui utilizzi Vertex AI.
  • ENDPOINT_NAME: il nome visualizzato per l'endpoint.

Selezionare un modello addestrato

Utilizza la funzione aiplatform.Model() per selezionare un modello addestrato:

# Create reference to the model trained ahead of time.
model_obj = models.Model("TRAINED_MODEL_PATH")

Sostituisci quanto segue:

  • TRAINED_MODEL_PATH: ad esempio, projects/PROJECT_ID/locations/REGION/models/[TRAINED_MODEL_ID]

Esegui il deployment del modello sull'endpoint

Utilizza la funzione deploy() per eseguire il deployment del modello sull'endpoint. Il seguente codice fornisce un esempio:

deployed_model = endpoint.deploy(
    model_obj,
    machine_type='MACHINE_TYPE',
    traffic_percentage=100,
    min_replica_count='MIN_REPLICA_COUNT',
    max_replica_count='MAX_REPLICA_COUNT',
    sync=True,
    deployed_model_display_name='DEPLOYED_MODEL_NAME',
)

Sostituisci quanto segue:

  • MACHINE_TYPE: ad esempio, n1-standard-8. Scopri di più sui tipi di macchina.
  • MIN_REPLICA_COUNT: Il numero minimo di nodi per questo deployment. Puoi aumentare o diminuire il numero di nodi in base al carico di inferenza, fino al numero massimo di nodi e mai al di sotto di questo numero di nodi. Questo valore deve essere maggiore o uguale a 1. Se non imposti la variabile min_replica_count, il valore predefinito è 1.
  • MAX_REPLICA_COUNT: il numero massimo di nodi per questo deployment. Puoi aumentare o diminuire il conteggio di nodi in base al carico di inferenza, fino a questo numero di nodi e mai al di sotto del numero minimo di nodi. Se non imposti la variabile max_replica_count, il numero massimo di nodi viene impostato sul valore di min_replica_count.
  • DEPLOYED_MODEL_NAME: un nome per DeployedModel. Puoi utilizzare anche il nome visualizzato di Model per DeployedModel.

Il deployment del modello potrebbe richiedere circa dieci minuti.

Ottenere inferenze online

Per ottenere inferenze, utilizza la funzione predict() e fornisci una o più istanze di input. Il seguente codice mostra un esempio:

predictions = endpoint.predict(instances=[{...}, {...}])

Ogni istanza di input è un dizionario Python con lo stesso schema su cui è stato addestrato il modello. Deve contenere una coppia chiave-valore available at forecast che corrisponde alla colonna temporale e una coppia chiave-valore unavailable at forecast che contiene i valori storici della colonna di inferenza di destinazione. Vertex AI prevede che ogni istanza di input appartenga a una singola serie temporale. L'ordine delle coppie chiave-valore nell'istanza non è importante.

L'istanza di input è soggetta ai seguenti vincoli:

  • Tutte le coppie chiave-valore disponibili nella previsione devono avere lo stesso numero di punti dati.
  • Tutte le coppie chiave-valore non disponibili nella previsione devono avere lo stesso numero di punti dati.
  • Le coppie chiave-valore disponibili nella previsione devono avere almeno tanti punti dati quante le coppie chiave-valore non disponibili nella previsione.

Per scoprire di più sui tipi di colonne utilizzati nelle previsioni, vedi Tipo di funzionalità e disponibilità al momento della previsione.

Il seguente codice mostra un insieme di due istanze di input. La colonna Category contiene i dati degli attributi. La colonna Timestamp contiene dati disponibili al momento della previsione. Tre punti sono dati di contesto e due punti sono dati di orizzonte. La colonna Sales contiene dati non disponibili al momento della previsione. Tutti e tre i punti sono dati di contesto. Per scoprire come vengono utilizzati il contesto e l'orizzonte nelle previsioni, consulta Orizzonte di previsione, finestra di contesto e finestra di previsione.

instances=[
  {
    # Attribute
    "Category": "Electronics",
    # Available at forecast: three days of context, two days of horizon
    "Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
    # Unavailable at forecast: three days of context
    "Sales": [490.50, 325.25, 647.00],
  },
  {
    # Attribute
    "Category": "Food",
    # Available at forecast: three days of context, two days of horizon
    "Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
    # Unavailable at forecast: three days of context
    "Sales": [190.50, 395.25, 47.00],
  }
])

Per ogni istanza, Vertex AI risponde con due inferenze per Sales, corrispondenti ai due timestamp dell'orizzonte ("2023-08-06" e "2023-08-07").

Per prestazioni ottimali, il numero di punti dati contesto e il numero di punti dati orizzonte in ogni istanza di input devono corrispondere alle lunghezze del contesto e dell'orizzonte con cui è stato addestrato il modello. Se c'è una mancata corrispondenza, Vertex AI esegue il padding o il troncamento dell'istanza in modo che corrisponda alle dimensioni del modello.

Se il numero di punti dati contesto nell'istanza di input è inferiore o superiore al numero di punti dati contesto utilizzati per l'addestramento del modello, assicurati che questo numero di punti sia coerente in tutte le coppie chiave-valore disponibili per la previsione e in tutte le coppie chiave-valore non disponibili per la previsione.

Ad esempio, considera un modello addestrato con quattro giorni di dati di contesto e due giorni di dati di orizzonte. Puoi effettuare una richiesta di inferenza con solo tre giorni di dati di contesto. In questo caso, le coppie chiave-valore unavailable at forecast contengono tre valori. Le coppie chiave-valore Disponibile al momento della previsione devono contenere cinque valori.

Output dell'inferenza online

Vertex AI fornisce l'output dell'inferenza online nel campo value:

{
  'value': [...]
}

La lunghezza della risposta di inferenza dipende dall'orizzonte utilizzato nell'addestramento del modello e dall'orizzonte dell'istanza di input. La lunghezza della risposta dell'inferenza è il valore più piccolo tra questi due.

Considera i seguenti esempi:

  • Addestra un modello con context = 15 e horizon = 50. L'istanza di input ha context = 15 e horizon = 20. La risposta di inferenza ha una lunghezza di 20.
  • Addestra un modello con context = 15 e horizon = 50. L'istanza di input ha context = 15 e horizon = 100. La risposta di inferenza ha una lunghezza di 50.

Output delle inferenze online per i modelli TFT

Per i modelli addestrati con Temporal Fusion Transformer (TFT), Vertex AI fornisce l'interpretabilità TFT tft_feature_importance oltre alle inferenze nel campo value:

{
  "tft_feature_importance": {
    "attribute_weights": [...],
    "attribute_columns": [...],
    "context_columns": [...],
    "context_weights": [...],
    "horizon_weights": [...],
    "horizon_columns": [...]
  },
  "value": [...]
}
  • attribute_columns: Funzionalità di previsione invarianti nel tempo.
  • attribute_weights: i pesi associati a ciascuno dei attribute_columns.
  • context_columns: funzionalità di previsione i cui valori della finestra contestuale fungono da input per l'encoder LSTM (Long Short-Term Memory) di TFT.
  • context_weights: i pesi dell'importanza delle funzionalità associati a ciascuno dei context_columns per l'istanza prevista.
  • horizon_columns: funzionalità di previsione i cui valori dell'orizzonte di previsione fungono da input per il decodificatore LSTM (Long Short-Term Memory) di TFT.
  • horizon_weights: i pesi dell'importanza delle funzionalità associati a ciascuno dei horizon_columns per l'istanza prevista.

Output dell'inferenza online per i modelli ottimizzati per la perdita quantile

Per i modelli ottimizzati per la perdita quantile, Vertex AI fornisce il seguente output di inferenza online:

{
  "value": [...],
  "quantile_values": [...],
  "quantile_predictions": [...]
}
  • value: se il tuo insieme di quantili include la mediana, value è il valore di inferenza alla mediana. Altrimenti, value è il valore di inferenza al quantile più basso del set. Ad esempio, se il tuo insieme di quantili è [0.1, 0.5, 0.9], value è l'inferenza per il quantile 0.5. Se il tuo insieme di quantili è [0.1, 0.9], value è l'inferenza per il quantile 0.1.
  • quantile_values: i valori dei quantili, che vengono impostati durante l'addestramento del modello.
  • quantile_predictions: i valori di inferenza associati a quantile_values.

Considera, ad esempio, un modello in cui la colonna di destinazione è il valore delle vendite. I valori dei quantili sono definiti come [0.1, 0.5, 0.9]. Vertex AI restituisce le seguenti inferenze quantile: [4484, 5615, 6853]. In questo caso, l'insieme di quantili include la mediana, quindi value è l'inferenza per il quantile 0.5 (5615). Puoi interpretare le inferenze dei quantili nel seguente modo:

  • P(sales value < 4484) = 10%
  • P(sales value < 5615) = 50%
  • P(sales value < 6853) = 90%

Output dell'inferenza online per i modelli con inferenza probabilistica

Se il modello utilizza l'inferenza probabilistica, il campo value contiene il minimizzatore dell'obiettivo di ottimizzazione. Ad esempio, se l'obiettivo di ottimizzazione è minimize-rmse, il campo value contiene il valore medio. Se è minimize-mae, il campo value contiene il valore mediano.

Se il modello utilizza l'inferenza probabilistica con quantili, Vertex AI fornisce valori e inferenze dei quantili, oltre al minimizzatore dell'obiettivo di ottimizzazione. I valori dei quantili vengono impostati durante l'addestramento del modello. Le inferenze quantile sono i valori di inferenza associati ai valori quantile.

Ricevere spiegazioni online

Per ottenere spiegazioni, utilizza la funzione explain() e fornisci una o più istanze di input. Il seguente codice mostra un esempio:

explanations = endpoint.explain(instances=[{...}, {...}])

Il formato delle istanze di input è lo stesso per le inferenze online e le spiegazioni online. Per scoprire di più, consulta Ottenere inferenze online.

Per una panoramica concettuale delle attribuzioni delle caratteristiche, vedi Attribuzioni delle caratteristiche per la previsione.

Output della spiegazione online

Il seguente codice mostra come puoi restituire i risultati della spiegazione:

# Import required modules
import json
from google.protobuf import json_format

def explanation_to_dict(explanation):
  """Converts the explanation proto to a human-friendly json."""
  return json.loads(json_format.MessageToJson(explanation._pb))

for response in explanations.explanations:
  print(explanation_to_dict(response))

I risultati della spiegazione hanno il seguente formato:

{
  "attributions": [
    {
      "baselineOutputValue": 1.4194682836532593,
      "instanceOutputValue": 2.152980089187622,
      "featureAttributions": {
        ...
        "store_id": [
          0.007947325706481934
        ],
        ...
        "dept_id": [
          5.960464477539062e-08
        ],
        "item_id": [
          0.1100526452064514
        ],
        "date": [
          0.8525647521018982
        ],
        ...
        "sales": [
          0.0
        ]
      },
      "outputIndex": [
        2
      ],
      "approximationError": 0.01433318599207033,
      "outputName": "value"
    },
    ...
  ]
}

Il numero di elementi attributions dipende dall'orizzonte temporale utilizzato nell'addestramento del modello e dall'orizzonte temporale dell'istanza di input. Il numero di elementi è il più piccolo di questi due valori.

Il campo featureAttributions in un elemento attributions contiene un valore per ciascuna delle colonne nel set di dati di input. Vertex AI genera spiegazioni per tutti i tipi di funzionalità: attributo, disponibile nella previsione e non disponibile nella previsione. Per scoprire di più sui campi di un elemento attributions, consulta Attribuzione.

Elimina l'endpoint

Utilizza le funzioni undeploy_all() e delete() per eliminare l'endpoint. Il seguente codice mostra un esempio:

endpoint.undeploy_all()
endpoint.delete()

Passaggi successivi