Partager via


Concepts de matérialisation de l’ensemble de fonctionnalités

La matérialisation calcule les valeurs des fonctionnalités à partir des données sources. Les valeurs d’heure de début et d’heure de fin définissent une fenêtre de fonctionnalité. Une tâche de matérialisation calcule les fonctionnalités de cette fenêtre de fonctionnalité. Les valeurs de fonctionnalités matérialisées sont ensuite stockées dans un magasin de matérialisation en ligne ou hors connexion. Après la matérialisation des données, toutes les requêtes de fonctionnalités peuvent ensuite utiliser ces valeurs à partir du magasin de matérialisation.

Sans la matérialisation, une requête hors connexion sur un ensemble de fonctionnalités applique les transformations à la source à la volée pour calculer les fonctionnalités avant que la requête ne retourne les valeurs. Ce processus fonctionne bien lors de la phase de prototypage. Toutefois, pour les opérations de formation et d’inférence, les fonctionnalités doivent être matérialisées avant la formation ou l’inférence dans un environnement de production. La matérialisation à ce stade offre une plus grande fiabilité et une plus grande disponibilité.

Exploration de la matérialisation des fonctionnalités

L’interface utilisateur Travaux de matérialisation affiche l’état de matérialisation des données dans les magasins de matérialisation hors connexion et en ligne, ainsi qu’une liste de travaux de matérialisation.

Capture d’écran montrant l’interface utilisateur des travaux Matérialisation du jeu de fonctionnalités.

Dans une fenêtre de fonctionnalité :

  • Le graphique de série chronologique en haut affiche les intervalles de données qui se trouvent dans la fenêtre de fonctionnalité, avec l’état de matérialisation, pour les magasins hors connexion et en ligne.
  • La liste des travaux en bas affiche tous les travaux de matérialisation avec les fenêtres de traitement qui chevauchent la fenêtre de fonctionnalité sélectionnée.

État de matérialisation des données et intervalle de données

Un intervalle de données est une fenêtre de temps dans laquelle l’ensemble de fonctionnalités matérialise ses valeurs de fonctionnalités à l’un de ces états :

  • Terminé (vert) : matérialisation réussie des données
  • Incomplet (rouge) : un ou plusieurs travaux de matérialisation ont été annulés ou ont échoué pour cet intervalle de données
  • En attente (bleu) : un ou plusieurs travaux de matérialisation pour cet intervalle de données sont en cours
  • Aucun (gris) : aucun travail de matérialisation n’a été envoyé pour cet intervalle de données

À mesure que les travaux de matérialisation s’exécutent pour l’ensemble de fonctionnalités, ils créent ou fusionnent des intervalles de données :

  • Lorsque deux intervalles de données sont continus sur la chronologie et qu’ils ont le même état de matérialisation des données, ils deviennent un seul intervalle de données
  • Dans un intervalle de données, lorsqu’une partie des données de fonctionnalité est matérialisée à nouveau et que cette partie obtient un état de matérialisation des données différent, cet intervalle de données est divisé en plusieurs intervalles de données

Lorsque les utilisateurs sélectionnent une fenêtre de fonctionnalité, ils peuvent voir plusieurs intervalles de données dans cette fenêtre avec différents états de matérialisation des données. Ils peuvent voir plusieurs intervalles de données disjoints sur la chronologie. Par exemple, l’instantané précédent a 16 intervalles de données pour la fenêtre de fonctionnalité définie dans le magasin de matérialisation hors connexion.

À tout moment, un ensemble de fonctionnalités peut avoir au maximum 2000 intervalles de données. Une fois qu’un ensemble de fonctionnalités atteint cette limite, aucun travail de matérialisation ne peut s’exécuter. Les utilisateurs doivent ensuite créer une nouvelle version d’ensemble de fonctionnalités avec la matérialisation activée. Pour la nouvelle version de l’ensemble de fonctionnalités, matérialisez les fonctionnalités dans les magasins hors connexion et en ligne à partir de zéro.

Pour éviter la limite, les utilisateurs doivent exécuter des travaux de renvoi à l’avance pour combler les lacunes dans les intervalles de données. Cela fusionne les intervalles de données et réduit le nombre total.

Travaux de matérialisation des données

Avant d’exécuter un travail de matérialisation des données, activez les matérialisations de données hors connexion et/ou en ligne au niveau de l’ensemble de fonctionnalités.

from azure.ai.ml.entities import (
    MaterializationSettings,
    MaterializationComputeResource,
)

# Turn on both offline and online materialization on the "accounts" featureset.

accounts_fset_config = fs_client._featuresets.get(name="accounts", version="1")

accounts_fset_config.materialization_settings = MaterializationSettings(
    offline_enabled=True,
    online_enabled=True,
    resource=MaterializationComputeResource(instance_type="standard_e8s_v3"),
    spark_configuration={
        "spark.driver.cores": 4,
        "spark.driver.memory": "36g",
        "spark.executor.cores": 4,
        "spark.executor.memory": "36g",
        "spark.executor.instances": 2,
    },
    schedule=None,
)

fs_poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
print(fs_poller.result())

Vous pouvez soumettre les travaux de matérialisation des données en tant que :

  • travail de renvoi : un travail de matérialisation par lot envoyé manuellement
  • travail de matérialisation récurrent : un travail de matérialisation automatique déclenché à intervalles planifiés.

Avertissement

Les données déjà matérialisées dans la matérialisation hors connexion et/ou en ligne ne seront plus utilisables si la matérialisation des données hors connexion et/ou en ligne est désactivée au niveau de l’ensemble de fonctionnalités. L’état de matérialisation des données dans le magasin de matérialisation en ligne et/ou hors connexion sera réinitialisé à None.

Vous pouvez envoyer des travaux de renvoi en procédant comme suit :

  • État de matérialisation des données
  • L’ID d’un travail de matérialisation annulé ou ayant échoué

Renvoi des données par état de matérialisation des données

L’utilisateur peut envoyer une requête de renvoi avec :

  • Une liste des valeurs d’état de matérialisation des données : incomplet, complet ou aucun
  • Une fenêtre de fonctionnalité (facultative)
from datetime import datetime
from azure.ai.ml.entities import DataAvailabilityStatus

st = datetime(2022, 1, 1, 0, 0, 0, 0)
et = datetime(2023, 6, 30, 0, 0, 0, 0)

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version="1",
    feature_window_start_time=st,
    feature_window_end_time=et,
    data_status=[DataAvailabilityStatus.NONE],
)
print(poller.result().job_ids)

Après l’envoi de la requête de renvoi, un nouveau travail de matérialisation est créé pour chaque intervalle de données ayant un état de matérialisation des données correspondant (incomplet, complet ou aucun). En outre, les intervalles de données appropriés doivent se trouver dans la fenêtre de fonctionnalité définie. Si l’état de matérialisation des données est Pending pour un intervalle de données, aucun travail de matérialisation n’est envoyé pour cet intervalle.

L’heure de début et l’heure de fin de la fenêtre de fonctionnalité sont facultatives dans la requête de renvoi :

  • Si l’heure de début de la fenêtre de fonctionnalité n’est pas fournie, l’heure de début est définie comme celle du premier intervalle de données dont l’état de matérialisation des données n’est pas None.
  • Si l’heure de fin de la fenêtre de fonctionnalité n’est pas fournie, l’heure de fin est définie comme celle du dernier intervalle de données dont l’état de matérialisation des données n’est pas None.

Remarque

Si aucun travail de renvoi ou récurrent n’a été soumis pour un ensemble de fonctionnalités, le premier travail de renvoi doit être soumis avec une heure de début et une heure de fin de fenêtre de fonctionnalité.

Cet exemple contient ces valeurs d’état de matérialisation et d’intervalle de données actuels :

Heure de début Heure de fin État de matérialisation des données
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

Cette requête de renvoi comporte les valeurs suivantes :

  • Matérialisation des données data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete]
  • Début de la fenêtre de fonctionnalité = 2023-04-02T12:00:00.000
  • Fin de la fenêtre de fonctionnalité = 2023-04-04T12:00:00.000

Elle crée ces travaux de matérialisation :

  • Travail 1 : traiter la fenêtre de fonctionnalité [2023-04-02T12:00:00.000, 2023-04-03T04:00:00.000)
  • Travail 2 : traiter la fenêtre de fonctionnalité [2023-04-04T04:00:00.000, 2023-04-04T12:00:00.000)

Si les deux travaux se terminent correctement, les nouvelles valeurs d’état d’intervalle de données et de matérialisation deviennent :

Heure de début Heure de fin État de matérialisation des données
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-02T12:00:00.000 Incomplete
2023-04-02T12:00:00.000 2023-04-03T04:00:00.000 Complete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

Un nouvel intervalle de données est créé à la date du 2023-04-02, car la moitié de ce jour a maintenant un état de matérialisation différent : Complete. Bien qu’un nouveau travail de matérialisation ait été exécuté pendant la moitié du jour du 2023-04-04, l’intervalle de données n’est pas modifié (fractionné), car l’état de matérialisation n’a pas changé.

Si l’utilisateur effectue une requête de renvoi avec uniquement la matérialisation des données data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete], sans définir l’heure de début et de fin de la fenêtre de fonctionnalité, la requête utilise la valeur par défaut de ces paramètres mentionnés précédemment dans cette section et crée ces travaux :

  • Travail 1 : traiter la fenêtre de fonctionnalité [2023-04-02T04:00:00.000, 2023-04-03T04:00:00.000)
  • Travail 2 : traiter la fenêtre de fonctionnalité [2023-04-04T04:00:00.000, 2023-04-05T04:00:00.000)

Comparez la fenêtre de fonctionnalité pour ces travaux de requête les plus récents et ceux indiqués dans l’exemple précédent.

Renvoi des données par ID de travail

Une requête de renvoi peut également être créée avec un ID de travail. Il s’agit d’un moyen pratique de réessayer un travail de matérialisation ayant échoué ou été annulé. Tout d’abord, recherchez l’ID du travail à réessayer :

  • Accédez à l’interface utilisateur des Travaux de matérialisation de l’ensemble de fonctionnalités
  • Sélectionnez le Nom d’affichage d’un travail spécifique qui a une valeur État Échec
  • Dans la page Vue d’ensemble du travail, recherchez la valeur d’ID du travail concernée sous la propriété Nom. Elle commence par Featurestore-Materialization-.

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version=version,
    job_id="<JOB_ID_OF_FAILED_MATERIALIZATION_JOB>",
)
print(poller.result().job_ids)

Vous pouvez soumettre un travail de renvoi avec l’ID d’un travail de matérialisation ayant échoué ou été annulé. Dans ce cas, l’état des données de la fenêtre de fonctionnalité pour le travail de matérialisation d’origine ayant échoué ou été annulé doit être Incomplete. Si cette condition n’est pas remplie, le travail de renvoi par ID entraîne une erreur utilisateur. Par exemple, un travail de matérialisation qui a échoué peut avoir une valeur 2023-04-01T04:00:00.000 pour l’heure de début de la fenêtre de fonctionnalité et une valeur 2023-04-09T04:00:00.000 pour l’heure de fin. Un travail de renvoi soumis à l’aide de l’ID de ce travail ayant échoué n’aboutit que si l’état des données est Incomplete partout, dans l’intervalle de temps 2023-04-01T04:00:00.000 à 2023-04-09T04:00:00.000.

Aide et bonnes pratiques

Établir un calendrier récurrent et un source_delay approprié

La propriété source_delay des données sources indique le délai entre le moment de l’acquisition des données prêtes à être consommées et le moment de l’événement de la génération des données. Un événement qui s’est produit à l’heure t atterrit dans la table de données source à l’heure t + x, en raison de la latence du pipeline de données en amont. La valeur x est le délai source.

Illustration qui montre le concept source_delay.

Pour une mise en place correcte, la planification récurrente des tâches de matérialisation tient compte de la latence. Le travail récurrent produit des fonctionnalités pour la fenêtre de temps [schedule_trigger_time - source_delay - schedule_interval, schedule_trigger_time - source_delay).

materialization_settings:
  schedule:
    type: recurrence
    interval: 1
    frequency: Day
    start_time: "2023-04-15T04:00:00.000"

Cet exemple définit un travail quotidien qui se déclenche à 4h00, à compter du 15/4/2023. En fonction du paramètre source_delay, l’exécution du travail du 1/5/2023 produit des fonctionnalités dans différentes fenêtres temporelles :

  • source_delay=0 produit des valeurs de fonctionnalité dans la fenêtre [2023-04-30T04:00:00.000, 2023-05-01T04:00:00.000)
  • source_delay=2hours produit des valeurs de fonctionnalité dans la fenêtre [2023-04-30T02:00:00.000, 2023-05-01T02:00:00.000)
  • source_delay=4hours produit des valeurs de fonctionnalité dans la fenêtre [2023-04-30T00:00:00.000, 2023-05-01T00:00:00.000)

Mettre à jour le magasin de matérialisation

Avant de mettre à jour un magasin de fonctionnalités en ligne ou hors connexion, tous les ensembles de fonctionnalités de ce magasin de fonctionnalités doivent avoir la matérialisation hors connexion et/ou en ligne correspondante désactivée. L’opération de mise à jour se solde par une UserError si certains ensembles de fonctionnalités ont la matérialisation activée.

L’état de matérialisation des données dans le magasin de matérialisation hors connexion et/ou en ligne se réinitialise si la matérialisation hors connexion et/ou en ligne est désactivée sur un ensemble de fonctionnalités. La réinitialisation rend les données matérialisées inutilisables. Si la matérialisation hors connexion et/ou en ligne sur l’ensemble de fonctionnalités est activée ultérieurement, les utilisateurs doivent soumettre à nouveau leurs travaux de matérialisation.

Amorçage de données en ligne

L’amorçage des données en ligne s’applique uniquement si des travaux de matérialisation hors connexion ont été correctement effectués. Si seule la matérialisation hors connexion a été initialement activée pour un ensemble de fonctionnalités et que la matérialisation en ligne est activée ultérieurement, alors :

  • L’état de matérialisation des données par défaut des données dans le magasin en ligne est None

  • Lorsqu’un travail de matérialisation en ligne est soumis, les données avec le statut de matérialisation Complete dans le magasin hors connexion sont utilisées pour calculer les fonctionnalités en ligne. Cela s’appelle l’amorçage des données en ligne. L’amorçage des données en ligne permet d’économiser des coûts de calcul, car il réutilise des fonctionnalités déjà calculées et enregistrées dans le magasin de matérialisation hors connexion. Ce tableau résume les valeurs d’état des données hors connexion et en ligne dans les intervalles de données qui entraîneraient l’amorçage des données en ligne :

    Heure de début Heure de fin État des données hors connexion État des données en ligne Amorçage de données en ligne
    2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None None Non
    2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete None Non
    2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 Pending None Aucun travail de matérialisation envoyé
    2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete None Oui

Résoudre les erreurs et modifications des données sources

Certains scénarios modifient les données sources après la matérialisation des données, suite à une erreur ou pour d’autres raisons. Dans ces cas, une actualisation des données de fonctionnalité, pour une fenêtre de fonctionnalité spécifique sur plusieurs intervalles de données, peut résoudre des données de fonctionnalités erronées ou obsolètes. Envoyez la requête de matérialisation pour une résolution des données de fonctionnalité erronée ou obsolète dans la fenêtre de fonctionnalité, pour les états des données None, Complete et Incomplete.

Vous ne devriez envoyer une requête de matérialisation pour une actualisation des données de fonctionnalité que si la fenêtre de fonctionnalité ne contient aucun intervalle de données avec un état de données Pending.

Combler les lacunes

Dans le magasin de matérialisation, les données matérialisées peuvent avoir des lacunes, car :

  • un travail de matérialisation n’a jamais été envoyé pour la fenêtre de fonctionnalité
  • des travaux de matérialisation envoyés pour la fenêtre de fonctionnalité ont échoué ou ont été annulés

Dans ce cas, envoyez une requête de matérialisation dans la fenêtre de fonctionnalité pour data_status=[DataAvailabilityStatus.NONE,DataAvailabilityStatus.Incomplete] afin de combler les lacunes. Une requête de matérialisation unique remplit toutes les lacunes de la fenêtre de fonctionnalité.

Étapes suivantes