Priemyselné strojové učenie: 10 princípov dizajnu

Priemyselné strojové učenie: 10 princípov dizajnu

V súčasnosti sa každý deň vytvárajú nové služby, aplikácie a ďalšie dôležité programy, ktoré umožňujú vytvárať neuveriteľné veci: od softvéru na ovládanie rakety SpaceX až po interakciu s rýchlovarnou kanvicou vo vedľajšej miestnosti prostredníctvom smartfónu.

A niekedy každý začínajúci programátor, či už je to vášnivý startupista alebo obyčajný Full Stack alebo Data Scientist, skôr či neskôr príde na to, že existujú určité pravidlá programovania a tvorby softvéru, ktoré výrazne zjednodušujú život.

V tomto článku stručne popíšem 10 princípov, ako naprogramovať priemyselné strojové učenie tak, aby sa dalo jednoducho integrovať do aplikácie/služby, na základe 12-faktorovej metodiky App. navrhol tím Heroku. Mojou iniciatívou je zvýšiť povedomie o tejto technike, ktorá môže pomôcť mnohým vývojárom a ľuďom z oblasti dátovej vedy.

Tento článok je prológom k sérii článkov o priemyselnom strojovom učení. V nich budem ďalej rozprávať o tom, ako vlastne vyrobiť model a spustiť ho do výroby, vytvoriť k nemu API, ako aj príklady z rôznych oblastí a firiem, ktoré majú vo svojich systémoch zabudované ML.

Princíp 1: Jedna základňa kódu

Niektorí programátori v prvých fázach, z lenivosti na to prísť (alebo z nejakého vlastného dôvodu), zabudnú na Git. Buď úplne zabudnú na slovo, teda hádžu si súbory do mechaniky/len hádžu text/posielajú holubmi, alebo nepremyslia svoj pracovný postup a zaviažu sa každý do svojej pobočky a potom do majster.

Tento princíp hovorí: majú jednu kódovú základňu a mnoho nasadení.

Git sa dá využiť ako vo výrobe, tak aj vo výskume a vývoji (R&D), v ktorom sa až tak často nepoužíva.

Napríklad vo fáze výskumu a vývoja môžete ponechať príkazy s rôznymi metódami a modelmi spracovania údajov, aby ste potom vybrali ten najlepší a mohli s ním jednoducho ďalej pracovať.

Po druhé, vo výrobe je to nenahraditeľná vec - budete sa musieť neustále pozerať na to, ako sa váš kód mení a vedieť, ktorý model priniesol najlepšie výsledky, ktorý kód nakoniec fungoval a čo sa stalo, že prestal fungovať alebo začal produkovať nesprávne výsledky . Na to sú predsa záväzky!

Môžete si tiež vytvoriť balík svojho projektu, umiestniť ho napríklad na Gemfury a potom z neho jednoducho importovať funkcie pre iné projekty, aby ste ich neprepisovali 1000-krát, ale o tom neskôr.

Zásada 2: Jasne deklarujte a izolujte závislosti

Každý projekt má rôzne knižnice, ktoré importujete zvonku, aby ste ich niekde použili. Či už sú to knižnice Python alebo knižnice iných jazykov na rôzne účely alebo systémové nástroje - vašou úlohou je:

  • Jasne deklarujte závislosti, teda súbor, ktorý bude obsahovať všetky knižnice, nástroje a ich verzie, ktoré sa používajú vo vašom projekte a ktoré musia byť nainštalované (napríklad v Pythone to možno urobiť pomocou Pipfile alebo requirements.txt. A odkaz, ktorý umožňuje dobre pochopiť: realpython.com/pipenv-guide)
  • Počas vývoja izolujte závislosti špeciálne pre váš program. Nechcete neustále meniť verzie a preinštalovať napríklad Tensorflow?

Vývojári, ktorí sa v budúcnosti pridajú k vášmu tímu, sa tak budú môcť rýchlo zoznámiť s knižnicami a ich verziami, ktoré sa používajú vo vašom projekte, a tiež budete mať možnosť spravovať samotné verzie a knižnice nainštalované pre konkrétnu projekt, ktorý vám pomôže vyhnúť sa nekompatibilite knižníc alebo ich verzií.

Vaša aplikácia by sa tiež nemala spoliehať na systémové nástroje, ktoré môžu byť nainštalované na konkrétnom OS. Tieto nástroje musia byť tiež deklarované v manifeste závislostí. Je to potrebné, aby sa predišlo situáciám, keď sa verzia nástrojov (ako aj ich dostupnosť) nezhoduje so systémovými nástrojmi konkrétneho OS.

Aj keď je curl možné použiť takmer na všetkých počítačoch, mali by ste ho deklarovať v závislostiach, pretože pri migrácii na inú platformu tam nemusí byť alebo verzia nebude tá, ktorú ste pôvodne potrebovali.

Váš súbor requirements.txt môže vyzerať napríklad takto:

# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0

Princíp 3: Konfigurácie

Mnohí počuli príbehy o tom, ako rôzni vývojári omylom nahrali kód na GitHub do verejných úložísk s heslami a inými kľúčmi od AWS a na druhý deň sa zobudili s dlhom 6000 50000 alebo dokonca XNUMX XNUMX dolárov.

Priemyselné strojové učenie: 10 princípov dizajnu

Samozrejme, tieto prípady sú extrémne, ale veľmi významné. Ak v kóde ukladáte svoje prihlasovacie údaje alebo iné údaje potrebné na konfiguráciu, robíte chybu a myslím, že nie je potrebné vysvetľovať prečo.

Alternatívou k tomu je ukladanie konfigurácií do premenných prostredia. Môžete si prečítať viac o premenných prostredia tu.

Príklady údajov, ktoré sú zvyčajne uložené v premenných prostredia:

  • Doménové mená
  • API URL/URI
  • Verejné a súkromné ​​kľúče
  • Kontakty (mail, telefón, atď.)

Týmto spôsobom nemusíte neustále meniť kód, ak sa menia vaše konfiguračné premenné. To vám pomôže ušetriť čas, námahu a peniaze.

Ak napríklad používate rozhranie Kaggle API na vykonávanie testov (napríklad si stiahnete softvér a spustíte ním model, aby ste pri spustení otestovali, či model funguje dobre), potom by mali byť súkromné ​​kľúče od Kaggle, ako napríklad KAGGLE_USERNAME a KAGGLE_KEY uložené v premenných prostredia.

Zásada 4: Služby tretích strán

Myšlienkou je vytvoriť program takým spôsobom, aby neexistoval žiadny rozdiel medzi miestnymi zdrojmi a zdrojmi tretích strán z hľadiska kódu. Môžete napríklad pripojiť lokálne MySQL aj tretie strany. To isté platí pre rôzne API, ako sú Google Maps alebo Twitter API.

Ak chcete zakázať službu tretej strany alebo pripojiť inú, stačí zmeniť kľúče v konfigurácii v premenných prostredia, o ktorých som hovoril v odseku vyššie.

Napríklad namiesto toho, aby ste zakaždým špecifikovali cestu k súborom so množinami údajov v kóde, je lepšie použiť knižnicu pathlib a deklarovať cestu k množinám údajov v config.py, takže bez ohľadu na to, akú službu používate (napr. napríklad CircleCI), program dokázal zistiť cestu k súborom údajov s prihliadnutím na štruktúru nového systému súborov v novej službe.

Princíp 5. Zostavte, uvoľnite, spustite

Mnoho ľudí v Data Science považuje za užitočné zlepšiť svoje zručnosti pri písaní softvéru. Ak chceme, aby náš program padal čo najmenej a fungoval bez porúch čo najdlhšie, musíme rozdeliť proces vydania novej verzie do 3 etáp:

  1. štádium montáže. Svoj holý kód s jednotlivými zdrojmi transformujete na takzvaný balík, ktorý obsahuje všetky potrebné kódy a dáta. Tento balík sa nazýva montáž.
  2. štádium uvoľnenie — tu pripojíme našu konfiguráciu k zostave, bez ktorej by sme nemohli vydať náš program. Teraz je toto vydanie úplne pripravené na spustenie.
  3. Nasleduje fáza naplnenie. Tu uvoľňujeme aplikáciu spustením potrebných procesov z nášho vydania.

Takýto systém vydávania nových verzií modelu alebo celého potrubia umožňuje oddeliť roly medzi administrátormi a vývojármi, umožňuje sledovať verzie a zabraňuje nechceným zastaveniam programu.

Pre úlohu uvoľnenia bolo vytvorených mnoho rôznych služieb, v ktorých môžete napísať procesy, ktoré sa spustia sami, v súbore .yml (napríklad v CircleCI je to config.yml na podporu samotného procesu). Wheely je skvelý pri vytváraní balíkov pre projekty.

Môžete vytvoriť balíky s rôznymi verziami vášho modelu strojového učenia a potom ich zabaliť a odkazovať na potrebné balíky a ich verzie, aby ste použili funkcie, ktoré ste odtiaľ napísali. To vám pomôže vytvoriť API pre váš model a váš balík môže byť hostený napríklad na Gemfury.

Princíp 6. Spustite svoj model ako jeden alebo viac procesov

Okrem toho by procesy nemali mať zdieľané údaje. To znamená, že procesy musia existovať oddelene a všetky druhy údajov musia existovať oddelene, napríklad v službách tretích strán, ako je MySQL alebo iné, v závislosti od toho, čo potrebujete.

To znamená, že sa rozhodne neoplatí ukladať údaje do systému súborov procesu, inak to môže viesť k vymazaniu týchto údajov pri ďalšom vydaní/zmene konfigurácií alebo prenose systému, na ktorom program beží.

Existuje však výnimka: pre projekty strojového učenia môžete uložiť vyrovnávaciu pamäť knižníc, aby ste ich nepreinštalovali pri každom spustení novej verzie, ak v ich verziách neboli vykonané žiadne ďalšie knižnice alebo žiadne zmeny. Týmto spôsobom skrátite čas potrebný na uvedenie vášho modelu do priemyslu.

Ak chcete spustiť model ako niekoľko procesov, môžete vytvoriť súbor .yml, v ktorom špecifikujete potrebné procesy a ich postupnosť.

Zásada 7: Recyklovateľnosť

Procesy, ktoré bežia vo vašej modelovej aplikácii, by sa mali dať ľahko spustiť a zastaviť. To vám umožní rýchlo nasadiť zmeny kódu, zmeny konfigurácie, rýchlo a flexibilne škálovať a predchádzať možným poruchám pracovnej verzie.

To znamená, že váš proces s modelom by mal:

  • Minimalizujte čas spustenia. V ideálnom prípade by čas spustenia (od okamihu, keď bol zadaný príkaz na spustenie do okamihu spustenia procesu) nemal byť dlhší ako niekoľko sekúnd. Ukladanie do vyrovnávacej pamäte knižnice, opísané vyššie, je jednou z techník na skrátenie času spustenia.
  • Ukončite správne. To znamená, že počúvanie na porte služby je v skutočnosti pozastavené a nové požiadavky odoslané na tento port nebudú spracované. Tu musíte buď nastaviť dobrú komunikáciu s inžiniermi DevOps, alebo sami pochopiť, ako to funguje (samozrejme, najlepšie to druhé, ale komunikácia by mala byť vždy zachovaná, v každom projekte!)

Zásada 8: Nepretržité zavádzanie/integrácia

Mnoho spoločností používa oddelenie medzi tímami pre vývoj a nasadenie aplikácií (sprístupnenie aplikácie koncovým používateľom). To môže výrazne spomaliť vývoj softvéru a pokrok v jeho zlepšovaní. Kazí to aj kultúru DevOps, kde sa vývoj a integrácia, zhruba povedané, spájajú.

Preto tento princíp uvádza, že vaše vývojové prostredie by malo byť čo najbližšie k vášmu produkčnému prostrediu.

To umožní:

  1. Znížte čas uvoľnenia na desiatky krát
  2. Znížte počet chýb v dôsledku nekompatibility kódu.
  3. To tiež znižuje pracovné zaťaženie zamestnancov, pretože vývojári a ľudia, ktorí aplikáciu nasadzujú, sú teraz jeden tím.

Nástroje, ktoré vám s tým umožňujú pracovať, sú CircleCI, Travis CI, GitLab CI a ďalšie.

Do modelu môžete rýchlo pridávať doplnky, aktualizovať ho a okamžite spustiť, pričom v prípade porúch sa dá veľmi rýchlo vrátiť k pracovnej verzii, takže si to koncový používateľ ani nevšimne. To sa dá urobiť obzvlášť jednoducho a rýchlo, ak máte dobré testy.

Minimalizujte rozdiely!!!

Zásada 9. Vaše denníky

Protokoly (alebo „Logs“) sú udalosti, zvyčajne zaznamenané v textovom formáte, ktoré sa vyskytujú v rámci aplikácie (stream udalostí). Jednoduchý príklad: "2020-02-02 - úroveň systému - názov procesu." Sú navrhnuté tak, aby vývojár doslova videl, čo sa deje, keď je program spustený. Vidí priebeh procesov a chápe, či je to tak, ako to zamýšľal samotný vývojár.

Tento princíp hovorí, že by ste svoje protokoly nemali ukladať vo svojom súborovom systéme – mali by ste ich iba „vytlačiť“ na obrazovku, napríklad to urobiť na štandardnom výstupe systému. A takto bude možné sledovať tok v termináli počas vývoja.

Znamená to, že protokoly nie je potrebné ukladať vôbec? Samozrejme, že nie. Vaša aplikácia by to jednoducho nemala robiť – nechajte to na služby tretích strán. Vaša aplikácia môže posielať protokoly iba do konkrétneho súboru alebo terminálu na prezeranie v reálnom čase alebo ich posielať do všeobecného systému na ukladanie údajov (napríklad Hadoop). Vaša aplikácia samotná by nemala uchovávať denníky ani s nimi interagovať.

Zásada 10. Test!

Pre priemyselné strojové učenie je táto fáza mimoriadne dôležitá, pretože musíte pochopiť, že model funguje správne a produkuje to, čo ste chceli.

Testy je možné vytvoriť pomocou pytestu a testovať pomocou malého súboru údajov, ak máte úlohu regresie/klasifikácie.

Nezabudnite nastaviť rovnaký základ pre modely hlbokého učenia, aby neustále neprodukovali rôzne výsledky.

Toto bol stručný popis 10 princípov a, samozrejme, je ťažké ich použiť bez toho, aby ste si ich vyskúšali a nevideli, ako fungujú, takže tento článok je len prológom k sérii zaujímavých článkov, v ktorých vám prezradím, ako vytvoriť modely priemyselného strojového učenia, ako ich integrovať do systémov a ako môžu tieto princípy uľahčiť život nám všetkým.

Pokúsim sa tiež použiť skvelé zásady, ktoré môže ktokoľvek zanechať v komentároch, ak chce.

Zdroj: hab.com

Pridať komentár