Szerző: Sandy Ryza | Megjelenés dátuma: 2022–10–31

Hacsak nem olyan cégnél dolgozik, amelynek küldetése az, hogy jobb osztályozót építsen az „Iris-adatkészlet” számára, a gépi tanulás az adatfolyamok kiépítését jelenti. Egy ML-modell betanításához – legyen az egy sklearn logisztikus regresszió vagy egy Tensorflow/PyTorch/Hugging Face mélytanulási modell – szükség van egy betanító készletre, amely általában adattranszformációkat igényel. Miután betanította a modellt, ki kell értékelnie azt – ami reális körülmények között gyakran újabb adatátalakításokat igényel az utólagos teszteléshez. És miután kiválasztott egy modellt, gyakran arra akarja használni, hogy következtetéseket vonjon le az adatok kötegeire, amihez – kitaláltad – több adatátalakításra van szükség.

Ezután mindezt meg kell ismételni. Amint új edzési adatok érkeznek, újra kell képeznie és újra kell értékelnie a modellt. És képesnek kell lennie az iterációra – a változtatások kipróbálásához anélkül, hogy megzavarná az éles környezetben telepített adatokat és modelleket.

Az alatt az öt év alatt, amit adattudósként és ML mérnökként töltöttem a Cloudera, a Clover Health és a Motive cégnél, rájöttem, hogy ezeknek a csővezetékeknek az építése és üzemeltetése a munkám legidőigényesebb és legfontosabb része. Ezek javítása gyakran nagyobb hatással volt a végeredményre, mint magának a modellnek a javítása.

Az ML-csővezetékek építéséhez és üzemeltetéséhez szükséges meglévő szerszámokkal kapcsolatban tapasztalt csalódottság miatt jöttem a Dagsterhez. Arra a meggyőződésre jutottam, hogy a megismételhető ML-folyamatok készítésének legjobb módja egy adatrendező: egy olyan rendszer, amely az adatvagyon és az ezeket összekötő adattranszformációk grafikonjait modellezi. A megfelelő hangszerelő drámaian felgyorsíthatja az ML-modellek fejlesztésének sebességét, csökkentheti a hibákat és az állásidőt, és segíthet csapatának megérteni, hogyan teljesít az ML-eszközök a termelésben.

ML-csővezetékek hangszerelése a Dagsterrel

A Dagster egy nyílt forráskódú adatkezelő, amelyet széles körben használnak gépi tanulási folyamatok építésére. A Dagster felhasználóinak nagyjából fele használja ML-hez.

A Dagster megkönnyíti a tanítási és kötegelt következtetési folyamatok Pythonban történő meghatározását, azok helyi tesztelését és kísérletezését, majd megbízható futtatását a termelésben. Pythonic API-i lehetővé teszik a folyamatok meghatározását azáltal, hogy dekorátorokat alkalmaznak a vanília Python függvényekhez.

Az adatfolyamok összehangolására használt munkafolyamat-kezelőkkel, például az Apache Airflow-val összehasonlítva a Dagster néhány fő dologban különbözik:

  • Fejlesztés közbeni használatra tervezték. Könnyű végrehajtási modellje azt jelenti, hogy elérheti a hangszerelő előnyeit – például a folyamat közepéről történő újrafuttatást és a lépések párhuzamosítását – miközben a funkciókkal vagy a funkciókkal kísérletezik. ML modell paraméterei.
  • Adateszközöket modellez, nem csak feladatokat. Az adatelem egy gépi tanulási modell, táblázat vagy más állandó objektum, amely megragadja a világ némi megértését. Az eszközöket megértő hangszerelő modellezheti a végpontok közötti adatfolyamot az ML-modellek és a hozzájuk tartozó adatkészletek között, így Ön módosíthat egy olyan adattranszformációt, amely messze felfelé halad, és megnézheti, hogy ez hogyan befolyásolja a modell teljesítményét, mielőtt az éles rendszerbe egyesítené.

Az ML-folyamatok eszközgráfok

Az ML-folyamat egyik módja az adatvagyon nagy vastagságú grafikonja.

A gyökérben az alapadatkészletek találhatók, amelyek az ML-modell által működtetett szolgáltatások alapját képezik. Az ML mérnököknek gyakran módosítaniuk kell ezeket az alapvető adatkészleteket, vagy hozzá kell adniuk azokat, hogy megkapják a modelljeikhez szükséges adatokat.

A szolgáltatáskészlet és a címkekészlet ezekből az alapvető adatkészletekből származik.

A képzési folyamat a szolgáltatáskészleten és a címkekészleten működik. A kimenete egy ML-modell – pl. sklearn LogisticRegression vagy Keras-modell – előrejelzések halmaza a betanítási és tesztadatokra vonatkozóan, valamint értékelési metrikák a modellhez.

Egy modell valódi értékeléséhez gyakran tovább kell lépni, mint pusztán a tesztkészleten a pontosság vizsgálata. Gyakran fontos, hogy ellenőrzéseket végezzenek az előzményadatokon, hogy megértsük, milyen hatással lehetnek ezek a vállalkozásra. Például, ha olyan modellt tanít, amely észleli a csalást, akkor futtathatja a múltbeli tranzakciókon, hogy megértse, mekkora összegű csalást ért volna el a modell egy adott időszak alatt.

Végül a kötegelt következtetés beállításaiban lesz egy elem, amely rögzíti a modell előrejelzéseit címkézetlen adatokon, és általában gyakrabban frissül, mint a modell újra betanítva.

Mondanom sem kell, hogy itt sok minden történik, és nehéz és hibákra hajlamos próbálkozás emlékezni arra, hogy az egyik eszköz módosítása után mi lesz hatással.

Végrehajtás vs. adatfüggőségek

Célszerű különbséget tenni az adatfüggőségek között, amelyek az eszközdiagramon jelennek meg, és a végrehajtási függőségek között.

Csak azért, mert ezek az elemek egyetlen grafikont alkotnak, nem jelenti azt, hogy mindegyiket ugyanabban az ütemezésben szeretné frissíteni:

  • A funkciókat felépítő különböző adatkészletek különböző ütemben frissülhetnek – például minden órában új események érkezhetnek a Data Lake-be, de előfordulhat, hogy egy szállító adatkiíratása csak havonta egyszer érkezik.
  • Még ha az adatkészleteket, amelyekből a funkciókat összeállítja, óránként frissítik, valószínűleg nem szeretné óránként újra betanítani a modellt. Ez nem változna jelentősen, és számításilag költséges lehet – a GPT-3 betanítása kilenc napot vett igénybe és 4,5 millió dollárt vett igénybe.
  • Érdemes gyakrabban kiértékelni vagy visszatesztelni a modellt, mint a betanítása, hogy megértse, hogyan teljesít az új adatokon.
  • Az a gyakoriság, amelyen a következtetést futtatja, attól függ, hogy a következtetés eredményeit hogyan használják fel.

Azonban gyakran hasznos elindítani az ad-hoc futtatásokat, amelyek a teljes folyamatot lefedik:

  • Amikor egy modell módosításával kísérletezik, érdemes lehet egy oszlopot hozzáadni egy alapvető adatkészlethez, szolgáltatásokat létrehozni az oszlopból, betanítani a modellt, és utólag tesztelni.
  • Ha hiba történik, vagy egy kódmódosítás bevezetése után érdemes elindítani egy háttérkitöltést, amely frissíti a grafikon összes elemét.

A Dagster szétválasztja az adatfüggőségeket a végrehajtási függőségektől: lehetővé teszi a felhasználók számára, hogy az eszközgráf bármely részgráfját ütemezzék, de olyan ad-hoc futtatásokat is elindítanak, amelyek a teljes grafikonon lévő eszközök bármely részhalmazát végrehajtják.

Hangszerelés a modellfejlesztés során

A gépi tanulás fejlődése általában egy kérdéssel kezdődik: Mi lenne, ha megváltoztatnánk ezt a hiperparaméter értéket? Mi lenne, ha hozzáadnánk ezt az új funkciót? Mi van, ha ezt az adatforrást egy másikra cseréljük?

A modell betanítási folyamatának bármely bemenete, és bármi, amitől a bemenet függ, befolyásolhatja a végső modellt. Szeretnénk megérteni ennek a változásnak a hatását:

  • Hogyan befolyásolja ez modellünk teljesítményét?
  • Futni fog egyáltalán a modellünk?

A modell fejlesztésének sebessége attól függ, hogy milyen gyorsan tud feltenni és válaszolni ezekre a kérdésekre. A kérdések egyikének megválaszolása általában néhány lépésben történik:

  1. Módosítsa azt a kódot, amely a grafikon egyik elemét generálja – pl. a szolgáltatáskészleted vagy egy adatkészlet, amelyből a szolgáltatáskészleted származik
  2. Valósítsa meg ezt az eszközt és a downstream eszközök készletét
  3. Vizsgálja meg az eredményeket

Sok ML mérnök számára a 2. lépés erősen manuális és hibalehető folyamat. Lefuttatnak néhány szkriptet, végrehajtanak néhány cellát a jegyzetfüzetben, látnak néhány eredményt, amire nem számítottak, rájönnek, hogy elfelejtettek egy fontos köztes szkriptet futtatni, megtalálják azt a köztes szkriptet stb.

Egy hangszerelő ezt jelentősen felgyorsítja. Azáltal, hogy egyetlen belépési ponttal rendelkezik minden végrehajtásához, a függőségek nyomon követéséhez és a már végrehajtottak nyomon követéséhez, a 2. lépés egyetlen gomb-kattintás vagy terminálparancs lehet. És ha valami meghiúsul a közepén, könnyen kijavíthatja a kódot, és ott folytathatja, ahol abbahagyta.

Tőr: könnyű fejlesztés, nehéz gyártás

Oka van annak, hogy az olyan hangszerelők, mint az Airflow, általában nem részei az ML fejlesztési életciklusnak: túl nehézsúlyúak.

Az Airflow futtatásához adatbázist, ütemezőt és webszervert kell futtatnia. Ezen túlmenően, amikor egy Airflow-csővezetéket ír, az általában olyan termelési szolgáltatásokhoz kapcsolódik, amelyek túlterheltek a fejlesztés során. Amikor egy modellel kísérletezik, nem szeretne minden egyes lépéshez felpörgetni egy Kubernetes pod-ot, és nem szeretne adatokat írni a termelési adattárházába.

A Dagster segít elválasztani a csővezetékben lévő „üzleti logikát” az infrastruktúrától, amelyen fut. Ez azt jelenti, hogy a fejlesztés során nagyon könnyű konfigurációt készíthet anélkül, hogy feláldozná a gyártás robusztusságát. Például:

  • A fejlesztés során közbenső adatokat tárolhat a memóriában. A gyártás során S3-ban vagy Snowflake-ben tárolhatja.
  • A fejlesztés során a folyamatban lévő összes lépést egyetlen folyamaton belül futtathatja. A gyártás során minden lépés megtörténhet a saját Kubernetes podjában.

Fejlődés a teljes eszközdiagramon

Minél inkább képes egyetlen folyamatba egyesíteni a gépi tanulási és adatfeldolgozási lépéseket, annál több „mi történik, ha…?” kérdésre tud válaszolni.

Ha bármilyen változtatást hajt végre azokon az alaptáblákon, amelyekből funkciókat vagy címkéket készít, azok hatással lesznek a modellezési fázisban zajló eseményekre. A „felhasználók” táblázatban az egyik oszlop definíciójának megváltoztatása éppúgy rontja vagy növeli a modell pontosságát, mint a hiperparaméterek módosítása.

Hasonlóképpen, gyakran sok átalakítási lépés következik a modellezés után. Ha módosít egy hiperparamétert a modellben, gyakran nem csupán arra kíváncsi, hogy a változtatás milyen hatással van a modell pontosságára. Például, ha modellt használ a kölcsönök jóváhagyására, hasznos megérteni, hogy a modell módosítása hogyan befolyásolja a valószínűleg jóváhagyott hitelek számát. Ez pedig sok lépést és adatátalakítást igényelhet a modellezési fázis után.

Ha külön folyamatokat tart fenn az alapvető adatokhoz, az ML modellekhez és az elemzésekhez, nagyon nehéz lesz ezt a megértést kialakítani. De ha a gépi tanulás, az alapvető adatok és az elemzések ugyanazon keretrendszer alatt élnek, akkor könnyen felmérhető, hogy az alaptáblázat módosítása hogyan befolyásolja az ML modelleket. Vagy annak felmérésére, hogy az ML-modellek változásai milyen hatással lesznek az üzletre.

De mindent összerakni könnyebb mondani, mint megtenni. Több nehézség is felmerül:

  1. Megállapodás a csővezetékek meghatározásának keretéről. Az analitikai mérnökök szeretik a dbt-t. Az ML mérnökei Pythonic API-t és olyan fejlesztői környezetet szeretnének, amely lehetővé teszi a gyors iterációt.
  2. Kód kezelése. Ha a teljes folyamatot egyetlen DAG objektumon belül kell meghatározni, ez nehézkes vitaponttá válik a különböző csapatok között

A Dagster az alábbi nehézségek enyhítésére készült:

  • Pythonic API-val és könnyű lábnyommal rendelkezik, amely elérhetővé teszi az ML mérnökök és adattudósok számára. A folyamatokat úgy határozhatja meg, hogy olyan függvényeket ír, amelyek elfogadják és visszaadják a keretrendszerek, például a sklearn, a PyTorch, a TensorFlow vagy a Keras által közzétett Python-objektumokat.
  • Mélyen integrálható olyan eszközökkel, mint a dbt — képes a dbt gráfot teljes pontossággal ábrázolni, és a dbt modelleket Dagster eszközökkel átlapolni.
  • Lehetővé teszi a csővezetékek „alulról felfelé” történő meghatározását a „felülről lefelé” helyett. Nincs szükség monolit objektumra, amely rögzíti az összes függőséget. Ehelyett minden csomópont hivatkozásokat tartalmaz azokra az upstream csomópontokra, amelyektől függ.

Notebookok és újrafelhasználható adateszközök

Az adatrendezők és a notebookok, mint például a Jupyter, jellemzőik és filozófiáik átfedésben vannak. Mindkettő lehetővé teszi a program felosztását egymástól függetlenül végrehajtható darabokra: cellákra a notebookokban és műveletekre a Dagsterben. Ez lehetővé teszi, hogy a végrehajtást a közepétől kezdje meg: a szkriptekkel ellentétben nem kell elölről kezdenie, amikor változtatásokat hajt végre.

A hangszerelők valószínűleg soha nem fogják lecserélni a notebookokat. Ha azonban a notebook egyes részei elérik a stabilitás szintjét, a csővezetékbe való kihúzásuk nagyobb megbízhatóságot és megfigyelhetőséget biztosíthat a gyártás során, valamint lehetővé teszi, hogy máshol is újrafelhasználhassák őket.

A jegyzetfüzet minden cellája jellemzően egy vagy néhány adatvagyonnak felel meg – bizonyos objektumokat hoz létre, amelyeket a jegyzetfüzet későbbi cellái használnak. Ezek az objektumok gyakran széles körben hasznosak lehetnek az adatplatformon. Ha ezeket nyilvánosságra tudná hozni és folyamatosan naprakészen tartani, akkor más notebookok és adatfolyamok is kihasználhatnák őket.

A notebook cellájának egy újrafelhasználható Dagster eszközbe történő beszámítása egyszerű: ehhez csak a kódot kell áthelyezni egy szerkesztőbe, körbe kell venni egy függvénydefinícióval, és alkalmazni kell az @asset dekorátort. Az eszköz továbbra is elérhető a notebookon belül: meghívhat egy függvényt a megvalósításához, vagy egy függvényt az értékének betöltéséhez.

A Dagster a Papermill és Noteable integrációkat is tartalmazza, amelyek lehetővé teszik a notebookok adatfolyam részeként történő végrehajtását.

Következtetés

A gépi tanulási modell csak annyira jó, mint az azt betanító és kiértékelő folyamat.

Az ML-csővezetékek építése és karbantartása nehéz és időigényes munka, de valószínűleg ez a legfontosabb része egy ML-mérnök munkájának.

Az adatrögzítő eszköz ezeknek a csővezetékeknek a fejlesztéséhez és működtetéséhez. A megfelelő hangszerelő nagy hatással lehet ennek a törekvésnek a sikerére.

Mivel elég könnyű ahhoz, hogy a fejlesztés és a gépi tanulási modellt körülvevő eszközök teljes grafikonjának modellezése során lehessen használni, a Dagster lehetővé teszi az ML mérnökei számára, hogy gyorsabban próbálják ki az ötleteket, könnyebben fordítsák át a termelésbe, és megértsék, hogyan teljesítenek az idő múlásával.

Eredetileg a https://dagster.io címen tették közzé