Materialiseringsbegrepp för funktionsuppsättningar

Materialisering beräknar funktionsvärden från källdata. Start- och sluttidsvärden definierar ett funktionsfönster. Ett materialiseringsjobb beräknar funktioner i det här funktionsfönstret. Materialiserade funktionsvärden lagras sedan i ett materialiseringslager online eller offline. Efter datamaterialisering kan alla funktionsfrågor sedan använda dessa värden från materialiseringslagret.

Utan materialisering tillämpar en offline-funktionsuppsättningsfråga transformationerna direkt på källan för att beräkna funktionerna innan frågan returnerar värdena. Den här processen fungerar bra i prototypfasen. För utbildnings- och slutsatsdragningsåtgärder i en produktionsmiljö bör dock funktioner materialiseras före träning eller slutsatsdragning. Materialisering i det skedet ger bättre tillförlitlighet och tillgänglighet.

Utforska funktionsmaterialisering

Användargränssnittet för materialiseringsjobb visar datamaterialiseringsstatus i materialiseringslager offline och online samt en lista över materialiseringsjobb.

Skärmbild som visar användargränssnittet för funktionsuppsättningens materialiseringsjobb.

I ett funktionsfönster:

  • Tidsseriediagrammet längst upp visar de dataintervall som ingår i funktionsfönstret , med materialiseringsstatus, för både offline- och onlinebutiker.
  • Jobblistan längst ned visar alla materialiseringsjobb med bearbetningsfönster som överlappar det valda funktionsfönstret.

Datamaterialiseringsstatus och dataintervall

Ett dataintervall är ett tidsfönster där funktionsuppsättningen materialiserar sina funktionsvärden till någon av dessa statusar:

  • Komplett (grön) – lyckad datamaterialisering
  • Ofullständig (röd) – ett eller flera avbrutna eller misslyckade materialiseringsjobb för det här dataintervallet
  • Väntar (blå) – ett eller flera materialiseringsjobb för det här dataintervallet pågår
  • Ingen (grå) – inget materialiseringsjobb skickades för det här dataintervallet

När materialiseringsjobb körs för funktionsuppsättningen skapar eller sammanfogar de dataintervall:

  • När två dataintervall är kontinuerliga på tidslinjen och de har samma datamaterialiseringsstatus blir de ett dataintervall
  • I ett dataintervall, när en del av funktionsdata materialiseras igen och den delen får en annan datamaterialiseringsstatus, delas dataintervallet upp i flera dataintervall

När en användare väljer ett funktionsfönster kan flera dataintervall, med olika datamaterialiseringsstatusar, visas i det fönstret. Dessutom kan flera dataintervall, som är uppdelade på tidslinjen, också visas. Den tidigare ögonblicksbilden har till exempel 16 dataintervall för det definierade funktionsfönstret i offline-materialiseringslagret.

Vid en viss tidpunkt kan en funktionsuppsättning ha högst 2 000 dataintervall. När en funktionsuppsättning når den gränsen kan inga fler materialiseringsjobb köras. Användarna måste sedan skapa en ny funktionsuppsättningsversion med materialisering aktiverad. För den nya versionen av funktionsuppsättningen materialiserar du funktionerna i offline- och onlinebutikerna från grunden.

För att undvika gränsen bör användarna köra återfyllnadsjobb i förväg för att fylla luckorna i dataintervallen. Detta sammanfogar dataintervallen och minskar det totala antalet.

Datamaterialiseringsjobb

Viktigt!

Materialiseringsjobb för funktionslagringssystem använder Apache Spark. Azure Synapse Runtime för Apache Spark 3.3 upphörde den 31 mars 2025. Använd Apache Spark 3.4 eller senare för dina materialiseringsjobb.

Innan du kör ett datamaterialiseringsjobb aktiverar du datamaterialiseringarna offline och/eller online på funktionsuppsättningsnivån.

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

Du kan skicka datamaterialiseringsjobben som:

Varning

Data som redan materialiserats offline och/eller online kan inte längre användas om datamaterialisering offline och/eller online inaktiveras på funktionsuppsättningsnivå. Datamaterialiseringsstatusen i offline och/eller online materialiseringslagret återställs till None.

Du kan skicka återfyllnadsjobb genom att:

  • Status för datamaterialisering
  • Jobb-ID för ett avbrutet eller misslyckat materialiseringsjobb

Datapåfyllning efter datamaterialiseringsstatus

Användare kan skicka en begäran om återfyllnad med:

  • En lista över statusvärden för datamaterialisering – Ofullständig, Slutförd eller Ingen
  • Ett funktionsfönster (valfritt)
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)

När en begäran om återfyllnad har skickats skapas ett nytt materialiseringsjobb för varje dataintervall som har matchande datamaterialiseringsstatus (Ofullständig, Slutförd eller Ingen). Dessutom måste relevanta dataintervall ligga inom det definierade funktionsfönstret. Om datamaterialiseringsstatusen är Pending för ett dataintervall skickas inget materialiseringsjobb för det intervallet.

Både starttid och sluttid för funktionsfönstret är valfria i begäran om återfyllnad:

  • Om starttiden för funktionsfönstret inte anges definieras starttiden som starttiden för det första dataintervallet som inte har datamaterialiseringsstatusen None.
  • Om sluttiden för funktionsfönstret inte anges definieras sluttiden som sluttiden för det senaste dataintervallet som inte har datamaterialiseringsstatusen None.

Kommentar

Om inga återfyllnads- eller återkommande jobb har skickats för en funktionsuppsättning, måste det första återfyllnadsjobbet skickas med en starttid och sluttid för funktionsfönstret.

Det här exemplet har dessa aktuella värden för dataintervall och materialiseringsstatus:

Starttid Sluttid Status för datamaterialisering
2025-04-01T04:00:00.000 2025-04-02T04:00:00.000 None
2025-04-02T04:00:00.000 2025-04-03T04:00:00.000 Incomplete
2025-04-03T04:00:00.000 2025-04-04T04:00:00.000 None
2025-04-04T04:00:00.000 2025-04-05T04:00:00.000 Complete
2025-04-05T04:00:00.000 2025-04-06T04:00:00.000 None

Den här begäran om återfyllnad har följande värden:

  • Datamaterialisering data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete]
  • Start av funktionsfönster = 2025-04-02T12:00:00.000
  • Funktionsfönster avslut = 2025-04-04T12:00:00.000

Det skapar dessa materialiseringsjobb:

  • Jobb 1: processfunktionsfönstret [2025-04-02T12:00:00.000, 2025-04-03T04:00:00.000)
  • Jobb 2: processfunktionsfönstret [2025-04-04T04:00:00.000, 2025-04-04T12:00:00.000)

Om båda jobben har slutförts blir de nya värdena för dataintervall och materialiseringsstatus:

Starttid Sluttid Status för datamaterialisering
2025-04-01T04:00:00.000 2025-04-02T04:00:00.000 None
2025-04-02T04:00:00.000 2025-04-02T12:00:00.000 Incomplete
2025-04-02T12:00:00.000 2025-04-03T04:00:00.000 Complete
2025-04-03T04:00:00.000 2025-04-04T04:00:00.000 None
2025-04-04T04:00:00.000 2025-04-05T04:00:00.000 Complete
2025-04-05T04:00:00.000 2025-04-06T04:00:00.000 None

Ett nytt dataintervall skapas dag 2025-04-02, eftersom hälften av den dagen nu har en annan materialiseringsstatus: Complete. Även om ett nytt materialiseringsjobb kördes under halva dagen 2025-04-04 ändras inte dataintervallet (delas) eftersom materialiseringsstatusen inte ändrades.

Om användaren gör en återfyllnadsbegäran med endast datamaterialisering data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete], utan att ange start- och sluttid för funktionsfönstret, använder begäran standardvärdet för de parametrar som nämns tidigare i det här avsnittet och skapar följande jobb:

  • Jobb 1: processfunktionsfönstret [2025-04-02T04:00:00.000, 2025-04-03T04:00:00.000)
  • Jobb 2: processfunktionsfönstret [2025-04-04T04:00:00.000, 2025-04-05T04:00:00.000)

Jämför funktionsfönstret för de senaste begärningsjobben och de begärningsjobb som visas i föregående exempel.

Datapåfyllning efter jobb-ID

En begäran om återfyllnad kan också skapas med ett jobb-ID. Det här är ett bekvämt sätt att återuppta ett misslyckat eller avbrutet materialiseringsjobb. Leta först reda på jobb-ID:t för jobbet som ska försöka igen:

  • Navigera till funktionsuppsättningen Användargränssnitt för materialiseringsjobb
  • Välj visningsnamnet för ett visst jobb som har värdet Misslyckadstatus
  • På jobböversiktssidan letar du upp det relevanta jobb-ID-värdet under egenskapen Namn. Det börjar med 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)

Du kan skicka ett återfyllnadsjobb med jobb-ID:t för ett misslyckat eller avbrutet materialiseringsjobb. I det här fallet ska funktionsfönstrets datastatus för det ursprungliga misslyckade eller avbrutna materialiseringsjobbet vara Incomplete. Om det här villkoret inte är uppfyllt resulterar återfyllnadsjobbet med ID i ett användarfel. Ett misslyckat materialiseringsjobb kan till exempel ha ett starttidsvärde för funktionens fönster2025-04-01T04:00:00.000, och ett sluttidsvärde 2025-04-09T04:00:00.000. Ett återfyllnadsjobb som skickas med ID:t för det här misslyckade jobbet lyckas bara om datastatusen överallt, i tidsintervallet 2025-04-01T04:00:00.000 till 2025-04-09T04:00:00.000, är Incomplete.

Vägledning och metodtips

Ange rätt source_delay och återkommande schema

Egenskapen source_delay för källdata anger fördröjningen mellan anskaffningstiden för förbrukningsklara data jämfört med händelsetiden för datagenerering. En händelse som inträffade vid tidpunkten t hamnar i källdatatabellen vid den tidpunkten t + xpå grund av den överordnade datapipelinens svarstid. Värdet x är källfördröjningen.

Bild som visar begreppet source_delay.

För korrekt konfiguration tar det återkommande materialiseringsjobbschemat hänsyn till fördröjning. Det återkommande jobbet genererar funktioner för tidsfönstret [schedule_trigger_time - source_delay - schedule_interval, schedule_trigger_time - source_delay) .

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

I det här exemplet definieras ett dagligt jobb som utlöses kl. 04.00 från och med 2025-04-15. Beroende på inställningen source_delay genererar jobbkörningen för 2025-05-01 egenskaper i olika tidsfönster:

  • source_delay=0 skapar funktionsvärden i fönstret [2025-04-30T04:00:00.000, 2025-05-01T04:00:00.000)
  • source_delay=2hours skapar funktionsvärden i fönstret [2025-04-30T02:00:00.000, 2025-05-01T02:00:00.000)
  • source_delay=4hours skapar funktionsvärden i fönstret [2025-04-30T00:00:00.000, 2025-05-01T00:00:00.000)

Uppdatera materialiseringsarkiv

Innan du uppdaterar en onlinefunktionsbutik eller ett materialiseringslager offline bör alla funktionsuppsättningar i funktionsarkivet ha motsvarande materialisering offline och/eller online inaktiverad. "Uppdateringsåtgärden misslyckas om vissa funktionsuppsättningar har materialisering aktiverad."

Materialiseringsstatusen för data i materialiseringsarkivet offline och/eller online återställs om offline- och/eller onlinematerialisering inaktiveras på en funktionsuppsättning. Återställningen återger materialiserade data som inte går att använda. Om offline- och/eller onlinematerialisering på funktionsuppsättningen aktiveras senare måste användarna skicka sina materialiseringsjobb på nytt.

Online-databootstrap

Online-databootstrap är endast tillämpligt om inskickade offline materialiseringsuppdrag har slutförts. Om endast offlinematerialisering ursprungligen aktiverades för en funktionsuppsättning, och onlinematerialisering aktiveras senare, så:

  • Standardstatusen för datamaterialisering för data i onlinelagret är None

  • När ett onlinematerialiseringsjobb skickas används data med Complete materialiseringsstatus i offline-lagret för att beräkna online-funktioner. Detta kallas för online-databoostrapping. Online-bootstrapping sparar beräkningskostnader eftersom det återanvänder redan beräknade funktioner som sparats i det offline materialiseringslagret. Den här tabellen sammanfattar värdena för offline- och online-datastatus i data-intervall som skulle resultera i online-bootstrapping.

    Starttid Sluttid Status för offlinedata Status för onlinedata Online-data startpaket
    2025-04-01T04:00:00.000 2025-04-02T04:00:00.000 None None Nej
    2025-04-02T04:00:00.000 2025-04-03T04:00:00.000 Incomplete None Nej
    2025-04-03T04:00:00.000 2025-04-04T04:00:00.000 Pending None Inget materialiseringsjobb har skickats
    2025-04-04T04:00:00.000 2025-04-05T04:00:00.000 Complete None Ja

Åtgärda källdatafel och ändringar

Vissa scenarier ändrar källdata på grund av ett fel eller andra orsaker efter datamaterialiseringen. I dessa fall kan en funktionsdatauppdatering, för ett specifikt funktionsfönster över flera dataintervall, lösa felaktiga eller inaktuella funktionsdata. Skicka begäran om materialisering för att åtgärda felaktig eller inaktuell funktionsdata i funktionsfönstret, för datastatusarna None, Complete och Incomplete.

Du bör skicka en begäran om materialisering av en funktionsdatauppdatering endast när funktionsfönstret inte innehåller något dataintervall med datastatusen Pending.

Fylla luckorna

I materialiseringslagret kan materialiserade data ha luckor eftersom:

  • ett materialiseringsjobb skickades aldrig för funktionsfönstret
  • materialiseringsjobb som skickats för funktionsfönstret misslyckades eller avbröts

I det här fallet skickar du en materialiseringsbegäran i funktionsfönstret för data_status=[DataAvailabilityStatus.NONE,DataAvailabilityStatus.Incomplete] för att täcka alla luckor. En enda materialiseringsbegäran fyller alla luckor i funktionsfönstret.

Nästa steg