Obtenir des prédictions en ligne pour un modèle de prévision

Vertex AI fournit deux options pour projeter les valeurs futures à l'aide de votre modèle de prévision entraîné : les prédictions en ligne et les prédictions par lot.

Une prédiction en ligne est une requête synchrone. Utilisez les prédictions en ligne lorsque vous effectuez des requêtes en réponse à une entrée d'une application ou dans d'autres situations nécessitant une inférence rapide.

Une requête de prédiction par lot est une requête asynchrone. Utilisez les prédictions par lot lorsque vous n'avez pas besoin d'une réponse immédiate et souhaitez traiter les données accumulées en une seule requête.

Cette page explique comment projeter des valeurs futures à l'aide de prédictions en ligne. Pour apprendre à projeter des valeurs à l'aide de prédictions par lots, consultez la page Obtenir des prédictions par lots pour un modèle de prévision.

Vous devez déployer votre modèle sur un point de terminaison avant de pouvoir l'utiliser pour les prédictions. Un point de terminaison est un ensemble de ressources physiques.

Vous pouvez demander une explication au lieu d'une prédiction. Les valeurs d'importance des caractéristiques locales de l'explication indiquent dans quelle mesure chaque caractéristique a contribué au résultat de la prédiction. Pour obtenir une présentation des concepts, consultez la page Attributions de caractéristiques pour la prévision.

Pour en savoir plus sur les tarifs des prédictions par lots, consultez la page Tarifs des workflows tabulaires.

Avant de commencer

Avant de pouvoir effectuer une requête de prédiction en ligne, vous devez d'abord entraîner un modèle.

Créer ou sélectionner un point de terminaison

Utilisez la fonction aiplatform.Endpoint.create() pour créer un point de terminaison. Si vous disposez déjà d'un point de terminaison, utilisez la fonction aiplatform.Endpoint() pour le sélectionner.

Le code suivant fournit un exemple :

# 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')

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet
  • REGION : région dans laquelle vous utilisez Vertex AI.
  • ENDPOINT_NAME : nom à afficher du point de terminaison.

Sélectionner un modèle entraîné

Utilisez la fonction aiplatform.Model() pour sélectionner un modèle entraîné :

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

Remplacez les éléments suivants :

  • TRAINED_MODEL_PATH : Par exemple, projects/PROJECT_ID/locations/REGION/models/[TRAINED_MODEL_ID]

Déployer le modèle sur le point de terminaison

Utilisez la fonction deploy() pour déployer le modèle sur le point de terminaison. Le code suivant fournit un exemple :

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',
)

Remplacez les éléments suivants :

  • MACHINE_TYPE : par exemple, n1-standard-8. En savoir plus sur les types de machines
  • MIN_REPLICA_COUNT : nombre minimal de nœuds pour ce déploiement. Le nombre de nœuds peut être augmenté ou réduit selon les besoins de la charge de prédiction, dans la limite du nombre maximal de nœuds et jamais moins que ce nombre de nœuds. Cette valeur doit être supérieure ou égale à 1. Si la variable min_replica_count n'est pas définie, la valeur par défaut est 1.
  • MAX_REPLICA_COUNT : nombre maximal de nœuds pour ce déploiement. Le nombre de nœuds peut être augmenté ou diminué selon les besoins de la charge de prédiction, jusqu'à atteindre ce nombre de nœuds mais jamais moins que le nombre minimal de nœuds. Si vous ne définissez pas la variable max_replica_count, le nombre maximal de nœuds est défini sur la valeur de min_replica_count.
  • DEPLOYED_MODEL_NAME : nom de l'élément DeployedModel. Vous pouvez également utiliser le nom à afficher du Model pour le DeployedModel.

Le déploiement du modèle peut prendre environ dix minutes.

Obtenir des prédictions en ligne

Pour obtenir des prédictions, utilisez la fonction predict() et fournissez une ou plusieurs instances d'entrée. Le code suivant illustre un exemple :

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

Chaque instance d'entrée est un dictionnaire Python avec le même schéma que celui sur lequel le modèle a été entraîné. Il doit contenir une paire clé-valeur disponible au moment de la prévision correspondant à la colonne heure et une paire clé-valeur non disponible au moment de la prévision contenant l'historique des valeurs de la colonne de prédiction ciblée. Vertex AI s'attend à ce que chaque instance d'entrée appartienne à une seule série temporelle. L'ordre des paires clé/valeur dans l'instance n'a pas d'importance.

L'instance d'entrée est soumise aux contraintes suivantes :

  • Les paires clé/valeur disponibles au moment de la prévision doivent toutes avoir le même nombre de points de données.
  • Les paires clé/valeur non disponibles au moment de la prévision doivent toutes avoir le même nombre de points de données.
  • Les paires clé/valeur disponibles au moment de la prévision doivent comporter au moins autant de points de données que les paires clé/valeur non disponibles au moment de la prévision.

Pour en savoir plus sur les types de colonnes utilisés dans les prévisions, consultez la section Type de fonctionnalité et disponibilité au moment de la prévision.

Le code suivant illustre un ensemble de deux instances d'entrée. La colonne Category contient des données d'attribut. La colonne Timestamp contient des données disponibles au moment de la prévision. Trois points sont des données de contexte et deux points sont des données d'horizon. La colonne Sales contient des données qui ne sont pas disponibles au moment de la prévision. Les trois points sont des données de contexte. Pour en savoir plus sur l'utilisation du contexte et de l'horizon dans les prévisions, consultez la section Horizon de prévision, fenêtre de contexte et période de prévision.

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],
  }
])

Pour chaque instance, Vertex AI répond avec deux prédictions pour Sales, correspondant aux deux codes temporels d'horizon ("2023-08-06" et "2023-08-07").

Pour des performances optimales, le nombre de points de données de contexte et de points de données horizon dans chaque instance d'entrée doit correspondre au contexte et à la longueur des horizons utilisés pour l'entraînement du modèle. En cas de non-concordance, Vertex AI remplit ou tronque l'instance pour qu'elle corresponde à la taille du modèle.

Si le nombre de points de données de contexte dans votre instance d'entrée est inférieur ou supérieur au nombre de points de données de contexte utilisés pour l'entraînement du modèle, assurez-vous que ce nombre de points est cohérent entre toutes les paires clé/valeur disponibles au moment de la prévision et toutes les paires clé-valeur non disponibles au moment de la prévision.

Prenons l'exemple d'un modèle entraîné avec quatre jours de données de contexte et deux jours de données d'horizon. Vous pouvez envoyer une requête de prédiction avec seulement trois jours de données de contexte. Dans ce cas, les paires clé/valeur non disponibles au moment de la prévision contiennent trois valeurs. Les paires clé/valeur disponibles au moment de la prévision doivent contenir cinq valeurs.

Résultat de la prédiction en ligne

Vertex AI fournit un résultat de prédiction en ligne dans le champ value :

{
  'value': [...]
}

La longueur de la réponse de prédiction dépend de l'horizon utilisé pour l'entraînement du modèle et de l'horizon de l'instance d'entrée. La longueur de la réponse de prédiction est la plus petite de ces deux valeurs.

Prenons les exemples suivants :

  • Vous entraînez un modèle avec context = 15 et horizon = 50. Votre instance d'entrée a context = 15 et horizon = 20. La réponse de prédiction a une longueur de 20.
  • Vous entraînez un modèle avec context = 15 et horizon = 50. Votre instance d'entrée a context = 15 et horizon = 100. La réponse de prédiction a une longueur de 50.

Résultat de la prédiction en ligne pour les modèles TFT

Pour les modèles entraînés avec Temporal Fusion Transformer (TFT), Vertex AI fournit l'interprétabilité TFT tft_feature_importance en plus des prédictions dans le champ value :

{
  "tft_feature_importance": {
    "attribute_weights": [...],
    "attribute_columns": [...],
    "context_columns": [...],
    "context_weights": [...],
    "horizon_weights": [...],
    "horizon_columns": [...]
  },
  "value": [...]
}
  • attribute_columns : fonctionnalités de prévision invariantes dans le temps.
  • attribute_weights : pondérations associées à chacun des attribute_columns.
  • context_columns : caractéristiques de prévision dont les valeurs de fenêtre de contexte servent d'entrées dans l'encodeur TFT de type LSTM (Long Short-Term Memory).
  • context_weights : pondérations de l'importance des caractéristiques associées à chacune des context_columns pour l'instance prédite.
  • horizon_columns : caractéristiques de prévision dont la valeur de l'horizon de prévision est utilisée comme entrées pour le décodeur TFT de type LSTM (Long Short-Term Memory).
  • horizon_weights : pondérations de l'importance des caractéristiques associées à chacune des horizon_columns pour l'instance prédite.

Résultat de la prédiction en ligne pour les modèles optimisés pour la perte de quantile

Pour les modèles optimisés pour la perte de quantile, Vertex AI fournit la sortie de prédiction en ligne suivante :

{
  "value": [...],
  "quantile_values": [...],
  "quantile_predictions": [...]
}
  • value : si votre ensemble de quantiles inclut la médiane, value est la valeur de prédiction correspondant à la médiane. Sinon, value est la valeur de prédiction au quantile le plus bas de l'ensemble. Par exemple, si votre ensemble de quantiles est [0.1, 0.5, 0.9], value correspond à la prédiction pour le quantile 0.5. Si votre ensemble de quantiles est [0.1, 0.9], value correspond à la prédiction pour le quantile 0.1.
  • quantile_values : valeurs des quantiles, qui sont définies lors de l'entraînement du modèle.
  • quantile_predictions : valeurs de prédiction associées aux valeurs de quantiles.

Prenons l'exemple d'un modèle dans lequel la colonne cible correspond à la valeur des ventes. Les valeurs de quantile sont définies sur [0.1, 0.5, 0.9]. Vertex AI renvoie les prédictions de quantiles suivantes : [4484, 5615, 6853]. Ici, l'ensemble de quantiles inclut la médiane. Par conséquent, value est la prédiction pour le quantile 0.5 (5615). Les prédictions de quantiles peuvent être interprétées comme suit :

  • P(valeur de vente < 4484) = 10 %
  • P(valeur de vente < 5615) = 50 %
  • P(valeur de vente < 6853) = 90 %

Résultat de la prédiction en ligne pour les modèles avec inférence probabiliste

Si votre modèle utilise une inférence probabiliste, le champ value contient la minimisation de l'objectif d'optimisation. Par exemple, si votre objectif d'optimisation est minimize-rmse, le champ value contient la valeur moyenne. Si la valeur est minimize-mae, le champ value contient la valeur médiane.

Si votre modèle utilise une inférence probabiliste avec des quantiles, Vertex AI fournit des valeurs et des prédictions de quantiles en plus de la minimisation de l'objectif d'optimisation. Les valeurs de quantile sont définies lors de l'entraînement du modèle. Les prédictions de quantiles sont les valeurs de prédiction associées aux valeurs quantiles.

Obtenir des explications en ligne

Pour obtenir des explications, utilisez la fonction explain() et fournissez une ou plusieurs instances d'entrée. Le code suivant illustre un exemple :

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

Le format des instances d'entrée est le même pour les prédictions et les explications en ligne. Pour en savoir plus, consultez Obtenir des prédictions en ligne.

Pour obtenir une présentation des concepts liés aux attributions de caractéristiques, consultez la page Attributions de caractéristiques pour la prévision.

Résultat de l'explication en ligne

Le code suivant montre comment générer les résultats de l'explication :

# 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))

Les résultats de l'explication ont le format suivant :

{
  "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"
    },
    ...
  ]
}

Le nombre d'éléments attributions dépend de l'horizon utilisé pour l'entraînement du modèle et de l'horizon de l'instance d'entrée. Le nombre d'éléments correspond à la plus petite de ces deux valeurs.

Le champ featureAttributions d'un élément attributions contient une valeur pour chacune des colonnes de l'ensemble de données d'entrée. Vertex AI génère des explications pour tous les types de caractéristiques : attribut, disponible au moment de la prévision et non disponible au moment de la prévision. Pour en savoir plus sur les champs d'un élément attributions, consultez la section Attribution.

Supprimer le point de terminaison

Utilisez les fonctions undeploy_all() et delete() pour supprimer votre point de terminaison. Le code suivant illustre un exemple :

endpoint.undeploy_all()
endpoint.delete()

Étapes suivantes