Industrijsko mašinsko učenje: 10 principa dizajna

Industrijsko mašinsko učenje: 10 principa dizajna

Danas se svakodnevno stvaraju novi servisi, aplikacije i drugi važni programi koji omogućavaju stvaranje nevjerovatnih stvari: od softvera za upravljanje SpaceX raketom do interakcije s čajnikom u susjednoj prostoriji putem pametnog telefona.

I, ponekad, svaki programer početnik, bilo da je strastveni startaper ili običan Full Stack ili Data Scientist, prije ili kasnije dođe do spoznaje da postoje određena pravila za programiranje i kreiranje softvera koja uvelike pojednostavljuju život.

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

Ovaj članak je uvod u seriju članaka o industrijskom mašinskom učenju. U njima ću dalje govoriti o tome kako zapravo napraviti model i lansirati ga u proizvodnju, kreirati API za njega, kao i primjere iz raznih oblasti i kompanija koje imaju ugrađen ML u svoje sisteme.

Princip 1: Jedna kodna baza

Neki programeri u prvim fazama, iz lijenosti da to shvate (ili iz nekog svog razloga), zaborave na Git. Ili potpuno zaborave riječ, odnosno dobacuju jedni drugima fajlove u drajv/samo dobacuju tekst/šalju od golubova, ili ne razmišljaju o svom toku rada, i posvećuju se svaki svojoj grani, a zatim majstor.

Ovaj princip glasi: imaju jednu kodnu bazu i mnogo implementacija.

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

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

Drugo, u proizvodnji je ovo nezamjenjiva stvar - morat ćete stalno gledati kako se vaš kod mijenja i znati koji model je dao najbolje rezultate, koji je kod na kraju uspio i šta se dogodilo zbog čega je prestao raditi ili početi proizvoditi pogrešne rezultate . Eto čemu služe obaveze!

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

Princip 2: Jasno deklarišite i izolujte zavisnosti

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

  • Jasno deklarirajte zavisnosti, odnosno datoteku koja će sadržavati sve biblioteke, alate i njihove verzije koje se koriste u vašem projektu i koje moraju biti instalirane (na primjer, u Pythonu se to može učiniti pomoću Pipfile ili requirements.txt. A link koji omogućava dobrom razumijevanju: realpython.com/pipenv-guide)
  • Izolirajte zavisnosti posebno za vaš program tokom razvoja. Ne želite stalno mijenjati verzije i ponovo 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 verzijama i samim bibliotekama instaliranim za određeni projekta, koji će vam pomoći da izbjegnete nekompatibilnost biblioteka ili njihovih verzija.

Vaša aplikacija se također ne bi trebala oslanjati na sistemske alate koji mogu biti instalirani na određenom OS-u. Ovi alati takođe moraju biti deklarisani u manifestu zavisnosti. 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 skoro svim računarima, ipak biste ga trebali deklarirati u zavisnostima, jer prilikom migracije na drugu platformu možda neće biti tamo ili verzija neće biti ona koja vam je prvobitno bila potrebna.

Na primjer, vaš zahtjev.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

Princip 3: Konfiguracije

Mnogi su čuli priče o raznim programerima koji su slučajno učitali kod na GitHub u javna spremišta sa lozinkama i drugim ključevima iz AWS-a, probudivši se sljedećeg dana s dugom od 6000 dolara ili čak 50000 dolara.

Industrijsko mašinsko učenje: 10 principa dizajna

Naravno, ovi slučajevi su ekstremni, ali veoma značajni. Ako svoje vjerodajnice ili druge podatke potrebne za konfiguraciju pohranite unutar koda, pravite grešku i mislim da nema potrebe objašnjavati zašto.

Alternativa ovome je pohranjivanje konfiguracija u varijablama okruženja. Možete pročitati više o varijablama okruženja ovdje.

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

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

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

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

Princip 4: Usluge treće strane

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

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

Dakle, na primjer, umjesto da svaki put specificirate putanju do datoteka sa skupovima podataka unutar koda, bolje je koristiti biblioteku pathlib i deklarirati putanju do skupova podataka u config.py, tako da bez obzira koji servis koristite (za na primjer, CircleCI), program je uspio pronaći putanju do skupova podataka uzimajući u obzir strukturu novog sistema datoteka u novom servisu.

Princip 5. Izrada, izdavanje, vrijeme izvođenja

Mnogi ljudi u Data Science smatraju korisnim da poboljšaju svoje vještine pisanja softvera. Ako želimo da se naš program ruši što je moguće rjeđe i da radi bez kvarova što je duže moguće, moramo podijeliti proces izdavanja nove verzije u 3 faze:

  1. Scena sklopovi. Svoj goli kod sa pojedinačnim resursima transformišete u takozvani paket koji sadrži sav potreban kod i podatke. Ovaj paket se zove sklop.
  2. Scena puštanje — ovdje povezujemo našu konfiguraciju sa sklopom, bez kojeg ne bismo mogli objaviti naš program. Sada je ovo potpuno spremno za lansiranje.
  3. Sljedeća je faza ispunjenje. Ovdje oslobađamo aplikaciju pokretanjem potrebnih procesa iz našeg izdanja.

Takav sistem za izdavanje novih verzija modela ili čitavog pipeline-a omogućava vam da odvojite uloge između administratora i programera, omogućava vam praćenje verzija i sprečava neželjena zaustavljanja programa.

Za zadatak izdavanja kreirano je mnogo različitih servisa u kojima možete pisati procese koji će se sami pokrenuti u .yml datoteci (na primjer, u CircleCI-ju ovo je config.yml za podršku samom procesu). Wheely je odličan u kreiranju paketa za projekte.

Možete kreirati pakete s različitim verzijama vašeg modela strojnog učenja, a zatim ih pakirati i uputiti se na potrebne pakete i njihove verzije da biste koristili funkcije koje ste napisali odatle. Ovo će vam pomoći da kreirate API za vaš model, a vaš paket može biti hostovan na Gemfuryju, na primer.

Princip 6. Pokrenite svoj model kao jedan ili više procesa

Štaviše, procesi ne bi trebali imati zajedničke podatke. To jest, procesi moraju postojati odvojeno, a sve vrste podataka moraju postojati odvojeno, na primjer, na uslugama trećih strana kao što je MySQL ili drugi, ovisno o tome šta vam je potrebno.

Odnosno, definitivno se ne isplati pohranjivati ​​podatke unutar procesa datoteka sistema, inače to može dovesti do brisanja ovih podataka prilikom sljedećeg izdanja/promjene konfiguracija ili prijenosa sistema na kojem program radi.

Ali postoji izuzetak: za projekte strojnog učenja možete pohraniti predmemoriju biblioteka kako ih ne biste ponovno instalirali svaki put kada pokrenete novu verziju, ako nisu napravljene dodatne biblioteke ili bilo kakve promjene u njihovim verzijama. Na ovaj način ćete smanjiti vrijeme potrebno za lansiranje vašeg modela u industriji.

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

Princip 7: Reciklabilnost

Procesi koji se pokreću u aplikaciji vašeg modela trebali bi biti laki za pokretanje i zaustavljanje. Dakle, ovo će vam omogućiti da brzo implementirate promjene koda, promjene konfiguracije, brzo i fleksibilno skalirajte i spriječite moguće kvarove radne verzije.

To jest, vaš proces sa modelom bi trebao:

  • Minimizirajte vrijeme pokretanja. U idealnom slučaju, vrijeme pokretanja (od trenutka izdavanja naredbe za pokretanje do trenutka kada proces počne) ne bi trebalo biti duže od nekoliko sekundi. Keširanje biblioteke, gore opisano, jedna je od tehnika za smanjenje vremena pokretanja.
  • Završi ispravno. To jest, slušanje na servisnom portu je zapravo obustavljeno, a novi zahtjevi koji se podnose ovom portu neće biti obrađeni. Ovdje morate ili uspostaviti dobru komunikaciju sa DevOps inženjerima ili sami razumjeti kako to funkcionira (po mogućnosti, naravno, ovo drugo, ali komunikacija treba uvijek biti održavana, u svakom projektu!)

Princip 8: Kontinuirana implementacija/integracija

Mnoge kompanije koriste razdvajanje između timova za razvoj i implementaciju aplikacije (čini aplikaciju dostupnom krajnjim korisnicima). Ovo može značajno usporiti razvoj softvera i napredak u njegovom poboljšanju. To također kvari DevOps kulturu, gdje su razvoj i integracija, grubo govoreći, kombinovani.

Stoga, ovaj princip kaže da vaše razvojno okruženje treba da bude što bliže vašem proizvodnom okruženju.

Ovo će omogućiti:

  1. Smanjite vrijeme oslobađanja za desetine puta
  2. Smanjite broj grešaka zbog nekompatibilnosti koda.
  3. Ovo također smanjuje opterećenje osoblja, budući da su programeri i ljudi koji implementiraju aplikaciju sada jedan tim.

Alati koji vam omogućavaju 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 i ne primijeti. To se može učiniti posebno lako i brzo ako imate dobre testove.

Minimizirajte razlike!!!

Princip 9. Vaši dnevnici

Dnevnici (ili “Evidencija”) su događaji, obično snimljeni u tekstualnom formatu, koji se javljaju unutar aplikacije (tok događaja). Jednostavan primjer: "2020-02-02 - nivo sistema - naziv procesa." Dizajnirani su tako da programer može doslovno vidjeti šta se dešava kada je program pokrenut. On vidi napredak procesa i razumije da li je to kako je sam programer zamislio.

Ovaj princip kaže da ne bi trebalo da skladištite svoje logove unutar vašeg sistema datoteka – trebalo bi da ih samo “iznesete” na ekran, na primer, uradite to na standardnom izlazu sistema. I na taj način će biti moguće pratiti protok u terminalu tokom razvoja.

Znači li to da uopće nema potrebe za spremanjem dnevnika? Naravno da ne. Vaša aplikacija to jednostavno ne bi trebala raditi – prepustite to uslugama trećih strana. Vaša aplikacija može samo proslijediti zapisnike određenoj datoteci ili terminalu za gledanje u stvarnom vremenu, ili ih proslijediti sistemu za pohranu podataka opće namjene (kao što je Hadoop). Sama vaša aplikacija ne bi trebala pohranjivati ​​dnevnike ili komunicirati s njima.

Princip 10. Test!

Za industrijsko mašinsko učenje ova faza je izuzetno važna, jer morate shvatiti da model radi ispravno i da proizvodi ono što želite.

Testovi se mogu kreirati pomoću pytest-a i testirati pomoću malog skupa podataka ako imate zadatak regresije/klasifikacije.

Ne zaboravite postaviti isto sjeme za modele dubokog učenja kako ne bi stalno proizvodili različite rezultate.

Ovo je bio kratak opis 10 principa i, naravno, teško ih je koristiti bez isprobavanja i uvida kako funkcioniraju, tako da je ovaj članak samo uvod u seriju zanimljivih članaka u kojima ću otkriti kako kreirati modeli industrijskog mašinskog učenja, kako ih integrisati u sisteme i kako ovi principi mogu svima nama olakšati život.

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

izvor: www.habr.com

Dodajte komentar