Dela via


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 funktionsuppsättning offlinefråga transformeringarna på källan i farten 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 användare väljer ett funktionsfönster kan de se flera dataintervall i det fönstret med olika status för datamaterialisering. De kan se flera dataintervall som är uppdelade på tidslinjen. Den tidigare ögonblicksbilden har till exempel 16 dataintervall för det definierade funktionsfönstret i materialiseringsarkivet offline.

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

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 en:

Varning

Data som redan materialiserats i materialiseringen offline och/eller online kan inte längre användas om datamaterialisering offline och/eller online inaktiveras på funktionsuppsättningsnivå. Datamaterialiseringsstatusen i materialiseringsarkivet offline och/eller online å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ändaren 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 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
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

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

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

Det skapar dessa materialiseringsjobb:

  • Jobb 1: processfunktionsfönstret [2023-04-02T12:00:00.000, 2023-04-03T04:00:00.000)
  • Jobb 2: processfunktionsfönstret [2023-04-04T04:00:00.000, 2023-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
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

Ett nytt dataintervall skapas dag 2023-04-02, eftersom hälften av den dagen nu har en annan materialiseringsstatus: Complete. Även om ett nytt materialiseringsjobb kördes under halva dagen 2023-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 [2023-04-02T04:00:00.000, 2023-04-03T04:00:00.000)
  • Jobb 2: processfunktionsfönstret [2023-04-04T04:00:00.000, 2023-04-05T04:00:00.000)

Jämför funktionsfönstret för de senaste jobben för begäran och de begärandejobb 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 praktiskt sätt att försöka igen med 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 Misslyckad status
  • 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 uppfylls resulterar återfyllnadsjobbet efter ID i ett användarfel. Ett misslyckat materialiseringsjobb kan till exempel ha ett starttidsvärde 2023-04-01T04:00:00.000 för funktionsfönstret och ett sluttidsvärde2023-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 2023-04-01T04:00:00.000 till 2023-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 står det återkommande materialiseringsjobbschemat för svarstid. 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: "2023-04-15T04:00:00.000"

I det här exemplet definieras ett dagligt jobb som utlöses kl. 04.00, med början den 15.00.2023. Beroende på inställningen source_delay genererar jobbkörningen för 2023-05-1-2023 funktioner i olika tidsfönster:

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

Uppdatera materialiseringsarkiv

Innan du uppdaterar en funktionsbutik online eller offline materialiseringslager bör alla funktionsuppsättningar i funktionsarkivet ha motsvarande offline- och/eller onlinematerialisering inaktiverad. Uppdateringsåtgärden misslyckas som UserError, om vissa funktionsuppsättningar har materialisering aktiverat.

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.

Onlinedata bootstrap

Onlinedata bootstrap är endast tillämpligt om inskickade offline materialiseringsjobb 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 offlinearkivet för att beräkna onlinefunktioner. Detta kallas för onlinedatastövlar. Online-datastövlar sparar beräkningskostnaden eftersom den återanvänder redan beräknade funktioner som sparats i materialiseringsarkivet offline Den här tabellen sammanfattar värdena för offline- och onlinedatastatus i dataintervall som skulle resultera i onlinedatastövlar:

    Starttid Sluttid Status för offlinedata Onlinedatastatus Onlinedata bootstrap
    2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None None Nej
    2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete None Nej
    2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 Pending None Inget materialiseringsjobb har skickats
    2023-04-04T04:00:00.000 2023-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 materialiseringsbegäran för felaktig eller inaktuell funktionsdatamatchning i funktionsfönstret, för datastatusarna None, Completeoch Incomplete.

Du bör skicka en materialiseringsbegäran för en funktionsdatauppdatering endast när funktionsfönstret inte innehåller något dataintervall med Pending datastatus.

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] att fylla luckorna. En enda materialiseringsbegäran fyller alla luckor i funktionsfönstret.

Nästa steg