Industrijsko strojno učenje: 10 principa dizajna

Industrijsko strojno učenje: 10 principa dizajna

U današnje vrijeme svakodnevno se stvaraju nove usluge, aplikacije i drugi važni programi koji omogućuju stvaranje nevjerojatnih stvari: od softvera za upravljanje SpaceX raketom do interakcije s kuhalom za vodu u susjednoj sobi putem pametnog telefona.

I ponekad svaki programer početnik, bilo da je strastveni startupper ili obični Full Stack ili Data Scientist, prije ili kasnije shvati da postoje određena pravila programiranja i izrade softvera koja uvelike pojednostavljuju život.

U ovom ću članku ukratko opisati 10 principa kako programirati industrijsko strojno učenje tako da se može lako integrirati u aplikaciju/uslugu, na temelju 12-factor App metodologije. predložio tim Heroku. Moja inicijativa je povećati svijest o ovoj tehnici, koja može pomoći mnogim programerima i ljudima iz znanosti o podacima.

Ovaj je članak prolog nizu članaka o industrijskom strojnom učenju. U njima ću dalje govoriti o tome kako zapravo napraviti model i pokrenuti ga u produkciju, izraditi API za njega, kao i primjere iz raznih područja i tvrtki koje imaju ugrađen ML u svoje sustave.

Princip 1: Jedna baza koda

Neki programeri u prvim fazama, iz lijenosti da to shvate (ili iz nekog vlastitog razloga), zaborave na Git. Oni ili potpuno zaborave riječ, odnosno, bacaju datoteke jedni drugima u disk/samo bacaju tekst/šalju golubovima, ili ne promišljaju svoj tijek rada, već se posvećuju svatko svojoj grani, a zatim na ovladati; majstorski.

Ovo načelo kaže: imaju jednu bazu koda i mnogo implementacija.

Git se može koristiti iu proizvodnji iu istraživanju i razvoju (R&D), u kojima se ne koristi tako često.

Na primjer, u fazi istraživanja i razvoja možete ostaviti obveze s različitim metodama i modelima obrade podataka, kako biste zatim odabrali najbolji i jednostavno nastavili dalje raditi s njim.

Drugo, u proizvodnji je to nezamjenjiva stvar - morat ćete stalno gledati kako se vaš kod mijenja i znati koji je model dao najbolje rezultate, koji je kod na kraju radio i što se dogodilo da je prestao raditi ili počeo proizvoditi netočne rezultate . Tome služe obveze!

Također možete stvoriti paket svog projekta, smjestiti ga, na primjer, na Gemfury, a zatim jednostavno uvesti funkcije iz njega za druge projekte, kako ih ne biste prepisivali 1000 puta, ali više o tome kasnije.

Načelo 2: Jasno deklarirajte i izolirajte ovisnosti

Svaki projekt ima različite biblioteke koje uvozite izvana kako biste ih negdje primijenili. Bilo da se radi o Python bibliotekama, bibliotekama drugih jezika za razne namjene ili sistemskim alatima - vaš zadatak je:

  • Jasno deklarirajte ovisnosti, to jest datoteku koja će sadržavati sve biblioteke, alate i njihove verzije koje se koriste u vašem projektu i koje se moraju instalirati (na primjer, u Pythonu to se može učiniti pomoću Pipfilea ili requirements.txt. A link koji omogućuje dobro razumijevanje: realpython.com/pipenv-guide)
  • Izolirajte ovisnosti posebno za svoj program tijekom razvoja. Ne želite stalno mijenjati verzije i ponovno instalirati, na primjer, Tensorflow?

Na ovaj način programeri koji će se pridružiti vašem timu u budućnosti moći će se brzo upoznati s bibliotekama i njihovim verzijama koje se koriste u vašem projektu, a također ćete imati priliku upravljati samim verzijama i bibliotekama instaliranim za određeni projekt, koji će vam pomoći da izbjegnete nekompatibilnost biblioteka ili njihovih verzija.

Vaša se aplikacija također ne bi trebala oslanjati na sistemske alate koji mogu biti instalirani na određenom OS-u. Ovi alati također moraju biti deklarirani u manifestu ovisnosti. Ovo je neophodno kako bi se izbjegle situacije u kojima verzija alata (kao i njihova dostupnost) ne odgovara sistemskim alatima određenog OS-a.

Stoga, čak i ako se curl može koristiti na gotovo svim računalima, ipak biste ga trebali deklarirati u ovisnostima, budući da prilikom prelaska na drugu platformu možda neće biti tamo ili verzija neće biti ona koja vam je izvorno trebala.

Na primjer, vaša requirements.txt može izgledati ovako:

# 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

Načelo 3: Konfiguracije

Mnogi su čuli priče o raznim programerima koji su slučajno učitali kod na GitHub u javne repozitorije s lozinkama i drugim ključevima iz AWS-a, probudivši se sljedeći dan s dugom od 6000 USD, ili čak 50000 XNUMX USD.

Industrijsko strojno učenje: 10 principa dizajna

Naravno, ovi slučajevi su ekstremni, ali vrlo značajni. Ako svoje vjerodajnice ili druge podatke potrebne za konfiguraciju pohranjujete unutar koda, griješite, a mislim da nema potrebe objašnjavati zašto.

Alternativa ovome je pohranjivanje konfiguracija u varijable okoline. Možete pročitati više o varijablama okruženja здесь.

Primjeri podataka koji se obično pohranjuju u varijablama okruženja:

  • Imena domena
  • API URL-ovi/URI-ji
  • Javni i privatni ključevi
  • Kontakti (mail, telefoni, itd.)

Na ovaj način ne morate stalno mijenjati kod ako se vaše konfiguracijske varijable mijenjaju. To će vam pomoći uštedjeti vrijeme, trud i novac.

Na primjer, ako koristite Kaggle API za provođenje testova (na primjer, preuzmite softver i pokrenite model kroz njega da testirate da li model dobro radi), tada bi privatni ključevi iz Kagglea, kao što su KAGGLE_USERNAME i KAGGLE_KEY, trebali biti pohranjeni u varijablama okruženja.

Načelo 4: Usluge trećih strana

Ideja je ovdje kreirati program na takav način da nema razlike između lokalnih i resursa trećih strana u smislu koda. Na primjer, možete povezati lokalni MySQL i one treće strane. Isto vrijedi i za razne API-je kao što su Google Maps ili Twitter API.

Da biste onemogućili uslugu treće strane ili povezali drugu, samo trebate promijeniti ključeve u konfiguraciji u varijablama okruženja, o čemu sam govorio u gornjem odlomku.

Tako, na primjer, umjesto da svaki put specificirate put do datoteka sa skupovima podataka unutar koda, bolje je koristiti biblioteku pathlib i deklarirati put do skupova podataka u config.py, tako da bez obzira koju uslugu koristite (za na primjer, CircleCI), program je uspio saznati put do skupova podataka uzimajući u obzir strukturu novog datotečnog sustava u novoj usluzi.

Načelo 5. Build, release, runtime

Mnogi ljudi u znanosti o podacima smatraju korisnim poboljšati svoje vještine pisanja softvera. Ako želimo da nam se program ruši što je moguće rjeđe i da što duže radi bez kvarova, proces izdavanja nove verzije trebamo podijeliti u 3 faze:

  1. faza sklopovi. Pretvarate svoj goli kod s pojedinačnim resursima u takozvani paket koji sadrži sav potreban kod i podatke. Ovaj paket se naziva sklop.
  2. faza puštanje — ovdje povezujemo našu konfiguraciju sa sklopom, bez kojeg ne bismo mogli izdati naš program. Sada je ovo potpuno izdanje spremno za lansiranje.
  3. Slijedi pozornica ispunjenje. Ovdje izdajemo aplikaciju pokretanjem potrebnih procesa iz našeg izdanja.

Takav sustav za puštanje novih verzija modela ili cijelog cjevovoda omogućuje odvajanje uloga između administratora i programera, omogućuje praćenje verzija i sprječava neželjena zaustavljanja programa.

Za zadatak izdanja stvoreno je mnogo različitih usluga u kojima možete pisati procese koje sami pokrećete u .yml datoteci (na primjer, u CircleCI ovo je config.yml za podršku samog procesa). Wheely je izvrstan u stvaranju paketa za projekte.

Možete stvoriti pakete s različitim verzijama vašeg modela strojnog učenja, a zatim ih pakirati i uputiti na potrebne pakete i njihove verzije kako biste koristili funkcije koje ste tamo napisali. To će vam pomoći da izradite API za svoj model, a vaš paket može biti hostiran na Gemfuryju, na primjer.

Načelo 6. Pokrenite svoj model kao jedan ili više procesa

Štoviše, procesi ne bi trebali imati dijeljene podatke. Odnosno, procesi moraju postojati odvojeno, a sve vrste podataka moraju postojati odvojeno, na primjer, na uslugama trećih strana poput MySQL-a ili drugih, ovisno o tome što trebate.

To jest, definitivno se ne isplati pohranjivati ​​podatke unutar datotečnog sustava procesa, inače bi to moglo dovesti do brisanja ovih podataka tijekom sljedećeg izdanja/promjene konfiguracija ili prijenosa sustava na kojem se program izvodi.

Ali postoji iznimka: za projekte strojnog učenja možete pohraniti predmemoriju biblioteka kako ih ne biste ponovno instalirali svaki put kada pokrenete novu verziju, ako nema dodatnih biblioteka ili promjena u njihovim verzijama. Na taj ćete način skratiti vrijeme potrebno za lansiranje vašeg modela u industriji.

Da biste pokrenuli model kao nekoliko procesa, možete stvoriti .yml datoteku u kojoj specificirate potrebne procese i njihov redoslijed.

Načelo 7: Mogućnost recikliranja

Procesi koji se izvode u vašoj aplikaciji modela trebali bi se lako pokretati i zaustavljati. Stoga će vam to omogućiti brzu implementaciju promjena koda, konfiguracijskih promjena, brzo i fleksibilno skaliranje i sprječavanje mogućih kvarova radne verzije.

To jest, vaš proces s modelom trebao bi:

  • Minimizirajte vrijeme pokretanja. U idealnom slučaju, vrijeme pokretanja (od trenutka kada je izdana naredba za pokretanje do trenutka kada proces počne raditi) ne bi trebalo biti duže od nekoliko sekundi. Predmemoriranje knjižnice, gore opisano, jedna je tehnika za smanjenje vremena pokretanja.
  • Završite ispravno. To jest, slušanje na servisnom priključku je zapravo obustavljeno, a novi zahtjevi poslani na ovaj priključak neće biti obrađeni. Ovdje morate ili uspostaviti dobru komunikaciju s DevOps inženjerima, ili sami razumjeti kako to funkcionira (poželjno je, naravno, ovo drugo, ali komunikaciju treba uvijek održavati, u bilo kojem projektu!)

Načelo 8: Kontinuirana implementacija/integracija

Mnoge tvrtke koriste odvajanje između timova za razvoj aplikacije i timova za implementaciju (čineći aplikaciju dostupnom krajnjim korisnicima). To može uvelike usporiti razvoj softvera i napredak u njegovom poboljšanju. Također kvari DevOps kulturu, gdje su razvoj i integracija, grubo rečeno, spojeni.

Stoga ovo načelo kaže da vaše razvojno okruženje treba biti što bliže vašem proizvodnom okruženju.

Ovo će omogućiti:

  1. Smanjite vrijeme otpuštanja desetke puta
  2. Smanjite broj pogrešaka zbog nekompatibilnosti koda.
  3. Ovo također smanjuje radno opterećenje osoblja, budući da su programeri i ljudi koji implementiraju aplikaciju sada jedan tim.

Alati koji vam omogućuju rad s ovim su CircleCI, Travis CI, GitLab CI i drugi.

Možete brzo dopuniti model, ažurirati ga i odmah pokrenuti, dok će se lako, u slučaju kvarova, vrlo brzo vratiti na radnu verziju, tako da krajnji korisnik to niti ne primijeti. To se može učiniti posebno jednostavno i brzo ako imate dobre testove.

Smanjite razlike!!!

Načelo 9. Vaši dnevnici

Dnevnici (ili "Dnevnici") su događaji, obično zabilježeni u tekstualnom formatu, koji se događaju unutar aplikacije (stream događaja). Jednostavan primjer: "2020-02-02 - razina sustava - naziv procesa." Dizajnirani su tako da programer doslovno može vidjeti što se događa dok je program pokrenut. On vidi napredak procesa i razumije je li to onako kako je sam programer zamislio.

Ovo načelo kaže da ne biste trebali pohranjivati ​​svoje zapise unutar svog datotečnog sustava - trebali biste ih samo "izbaciti" na ekran, na primjer, učiniti to na standardnom izlazu sustava. I na taj način će se moći pratiti protok u terminalu tijekom razvoja.

Znači li to da uopće nema potrebe za spremanjem zapisa? Naravno da ne. Vaša aplikacija to jednostavno ne bi trebala činiti - prepustite to uslugama trećih strana. Vaša aplikacija može samo proslijediti zapise u određenu datoteku ili terminal za pregled u stvarnom vremenu ili ih proslijediti sustavu za pohranu podataka opće namjene (kao što je Hadoop). Sama vaša aplikacija ne bi trebala pohranjivati ​​niti komunicirati s zapisnicima.

Načelo 10. Testirajte!

Za industrijsko strojno učenje, ova faza je izuzetno važna, jer morate razumjeti da model radi ispravno i proizvodi ono što ste htjeli.

Testovi se mogu izraditi pomoću pytesta i testirati pomoću malog skupa podataka ako imate zadatak regresije/klasifikacije.

Ne zaboravite postaviti isto početno mjesto za modele dubinskog učenja kako ne bi stalno proizvodili različite rezultate.

Ovo je bio kratki opis 10 principa i, naravno, teško ih je koristiti bez isprobavanja i uvida u njihov rad, stoga je ovaj članak samo prolog nizu zanimljivih članaka u kojima ću otkriti kako kreirati modele industrijskog strojnog učenja, kako ih integrirati u sustave i kako ta načela mogu svima nama olakšati život.

Također ću pokušati koristiti cool principe koje svatko može ostaviti u komentarima ako želi.

Izvor: www.habr.com

Dodajte komentar