Tere kõigile! Olen CV arendaja ettevõttes CROC. Oleme CV valdkonna projekte ellu viinud nüüdseks 3 aastat. Selle aja jooksul tegime palju asju, näiteks: jälgisime juhte, et nad roolis ei jooks, ei suitsetaks, ei räägiks telefoniga, ei vaataks teed, mitte unenägusid ega pilvi. ; Salvestasime inimesed, kes sõidavad selleks ettenähtud radadel ja hõivavad mitu parkimiskohta; tagas, et töötajad kannaksid kiivreid, kindaid jne; tuvastas töötaja, kes soovib objekti siseneda; Lugesime kõik üle, mis suutsime.
Milleks ma seda kõike teen?
Projektide elluviimise käigus tabab meid konarusi, palju konarusi, mõningaid probleeme, mis on teile tuttavad või tulevikus tuttavad.
Simuleerime olukorda
Kujutagem ette, et saime tööd noores firmas “N”, mille tegevus on seotud ML-ga. Töötame ML (DL, CV) projekti kallal, seejärel läheme mingil põhjusel teisele tööle, teeme üldiselt pausi ja pöördume tagasi enda või kellegi teise neuroni juurde.
Tõehetk saabub, peate kuidagi meeles pidama, kus peatusite, milliseid hüperparameetreid proovisite ja mis kõige tähtsam, milliste tulemusteni need viisid. Selle jaoks, kes salvestas teabe kõigi käivitamiste kohta, võib olla palju võimalusi: peas, konfiguratsioonides, märkmikus, töökeskkonnas pilves. Juhtusin nägema võimalust, kui hüperparameetrid salvestati koodis kommenteeritud ridadena, üldiselt on see fantastiline lend. Kujutage nüüd ette, et te ei pöördunud tagasi mitte oma projekti, vaid ettevõttest lahkunud inimese projekti juurde ja pärisite koodi ja mudeli nimega model_1.pb. Pildi täiendamiseks ja valu edasi andmiseks kujutage ette, et olete ka algaja spetsialist.
Lase käia. Koodi käitamiseks peame meie ja kõik, kes sellega töötavad, looma keskkonna. Tihti juhtub, et nad ei jätnud teda mingil põhjusel meie pärandiks. Sellest võib saada ka mittetriviaalne ülesanne. Sa ei taha sellele sammule aega raisata, eks?
Koolitame modelli (näiteks autodetektorit). Jõuame punktini, kus see muutub väga heaks – on aeg tulemus salvestada. Nimetagem seda car_detection_v1.pb-ks. Seejärel treenime veel ühe - car_detection_v2.pb. Mõni aeg hiljem õpetavad meie kolleegid või meie ise üha rohkem, kasutades erinevaid arhitektuure. Selle tulemusena moodustub hunnik artefakte, mille kohta teavet tuleb hoolikalt koguda (aga teeme seda hiljem, sest praegu on meil prioriteetsemad asjad).
OK, nüüd on kõik läbi! Meil on modell! Kas saame hakata koolitama järgmist mudelit, välja töötama uue probleemi lahendamiseks arhitektuuri või võiksime minna teed jooma? Ja kes kasutusele võtab?
Probleemide tuvastamine
Projekti või toote kallal töötamine on paljude inimeste töö. Ja aja jooksul inimesed lahkuvad ja tulevad, projekte tuleb juurde ja projektid ise muutuvad keerulisemaks. Ühel või teisel viisil ilmnevad olukorrad ülalkirjeldatud tsüklist (ja mitte ainult) teatud kombinatsioonides iteratsioonist iteratsiooni. Kõik see toob kaasa raisatud aja, segaduse, närvid, võib-olla klientide rahulolematuse ja lõpuks raha kaotamise. Kuigi me kõik järgime tavaliselt sama vana reha, usun, et keegi ei taha neid hetki ikka ja jälle uuesti läbi elada.
Seega oleme ühe arendustsükli läbinud ja näeme, et on probleeme, mis vajavad lahendamist. Selleks vajate:
konfigureerida mudeli versioonide loomise protsess;
omama mugavat võimalust mudelite valideerimiseks;
leida näidisriigi juhtimise tööriist;
leida viis mudelite tootmisse tarnimiseks.
Ilmselt on vaja välja mõelda töövoog, mis võimaldaks seda elutsüklit lihtsalt ja mugavalt hallata? Seda praktikat nimetatakse MLOks
MLOps ehk masinõppe DevOps võimaldab andmeteaduse ja IT-meeskondadel teha koostööd ning suurendada mudelite arendamise ja juurutamise tempot masinõppemudelite jälgimise, valideerimise ja juhtimise kaudu.
Võite loeMida Google'i poisid sellest kõigest arvavad? Artiklist selgub, et MLOps on üsna mahukas asi.
Edasi kirjeldan oma artiklis ainult osa protsessist. Rakendamiseks kasutan MLflow tööriista, sest... See on avatud lähtekoodiga projekt, ühenduse loomiseks on vaja väikest kogust koodi ja see on integreeritud populaarsete ml-raamistikega. Saate Internetist otsida muid tööriistu, nagu Kubeflow, SageMaker, Trains jne, ja võib-olla leida oma vajadustele paremini sobiva.
MLO-de "ehitamine" MLFlow tööriista kasutamise näitel
MLFlow on avatud lähtekoodiga platvorm ml mudelite elutsükli haldamiseks (https://mlflow.org/).
MLflow sisaldab nelja komponenti:
MLflow Tracking – hõlmab tulemuste ja parameetrite salvestamise küsimusi, mis selle tulemuseni viisid;
MLflow Project – võimaldab koodi pakendada ja reprodutseerida mis tahes platvormil;
MLflow register – võimaldab salvestada mudeleid ja hallata nende olekut tsentraliseeritud hoidlas.
MLflow töötab kahel olemil:
käivitamine on koolituste, parameetrite ja mõõdikute täielik tsükkel, mille alusel soovime registreeruda;
Katse on „teema”, mis jookseb koos.
Kõik näite sammud on rakendatud operatsioonisüsteemis Ubuntu 18.04.
1. juurutage server
Selleks, et saaksime oma projekti hõlpsalt hallata ja kogu vajaliku teabe kätte saada, võtame kasutusele serveri. MLflow jälgimisserveril on kaks põhikomponenti:
taustapood – vastutab registreeritud mudelite teabe salvestamise eest (toetab 4 DBMS-i: mysql, mssql, sqlite ja postgresql);
Match Group sftpg
ChrootDirectory /data/%u
ForceCommand internal-sftp
taaskäivitage teenus
$ sudo systemctl restart sshd
Kuna taustapood Võtame postgresqli.
$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db
Serveri käivitamiseks peate installima järgmised pythoni paketid (soovitan luua eraldi virtuaalse keskkonna):
Selleks, et meie koolituse tulemused kaotsi ei läheks, tulevased arendajate põlvkonnad mõistaksid toimuvat ning et vanemad kamraadid saaksid rahulikult õppeprotsessi analüüsida, peame lisama jälgimise. Jälgimine tähendab parameetrite, mõõdikute, artefaktide ja igasuguse koolituse alguse kohta lisateabe salvestamist meie puhul serverisse.
Näiteks lõin väikese projekt githubis Keras, et segmenteerida kõike, mis sees on COCO andmestik. Jälgimise lisamiseks lõin faili mlflow_training.py.
Siin on read, kus kõige huvitavamad asjad juhtuvad:
def run(self, epochs, lr, experiment_name):
# getting the id of the experiment, creating an experiment in its absence
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# creating a "run" and getting its id
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# indicate that we want to save the results on a remote server
mlflow.set_tracking_uri(self.tracking_uri)
mlflow.set_experiment(experiment_name)
with mlflow.start_run(run_id=remote_run_id, nested=False):
mlflow.keras.autolog()
self.train_pipeline.train(lr=lr, epochs=epochs)
try:
self.log_tags_and_params(remote_run_id)
except mlflow.exceptions.RestException as e:
print(e)
Siin self.remote_server on mlflow.tracking meetodite väike ümbris. MlflowClient (tegin selle mugavuse pärast), mille abil koostan katse ja käivitan selle serveris. Järgmisena näitan, kuhu käivitamistulemused ühendada (mlflow.set_tracking_uri(self.tracking_uri)). Luban automaatse logimise mlflow.keras.autolog(). Praegu toetab MLflow Tracking automaatset logimist TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark jaoks. Kui te pole oma raamistikku või teeki leidnud, saate alati selgelt sisse logida. Alustame treeningutega. Registreerige sildid ja sisendparameetrid kaugserveris.
Paar rida ja teil, nagu kõigil teistel, on juurdepääs teabele kõigi käivitamiste kohta. Lahe?
3. Koostame projekti
Teeme nüüd projekti käivitamise lihtsaks. Selleks lisa projekti juure failid MLproject ja conda.yaml.
MLprojekt
Saate kasutada dokkerit oma käituskeskkonnana, lisateabe saamiseks vaadake dokumentatsioon.
4. Alustame treeningutega
Kloonime projekti ja läheme projekti kataloogi:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Käivitamiseks peate installima teegid
pip install mlflow
pip install pysftp
Sest näites kasutan conda_env, peab Anaconda arvutisse installitud olema (aga sellest saate mööda, kui installite kõik vajalikud paketid ise ja mängite käivitusparameetritega).
Kõik ettevalmistusetapid on tehtud ja saame alustada koolitust. Projekti juurtest:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
Pärast käsu sisestamist luuakse automaatselt conda keskkond ja koolitus algab.
Ülaltoodud näites läbisin koolituse epohhide arvu, kategooriad, millesse tahame segmenteerida (näete täielikku loendit siin) ja meie kaugserveri aadress.
Võimalike parameetrite täieliku loendi leiate failist MLproject.
Siin näeme kõigi katsete loendit (vasakul ülaosas) ja teavet käituste kohta (keskel). Iga käivitamise kohta saame vaadata üksikasjalikumat teavet (parameetrid, mõõdikud, artefaktid ja mõningane lisateave).
Iga mõõdiku puhul saame jälgida muutuste ajalugu
Need. Hetkel saame tulemusi analüüsida “käsitsi” režiimis, samuti saab seadistada automaatse valideerimise MLflow API abil.
6. Registreerige mudel
Kui oleme oma mudelit analüüsinud ja otsustanud, et see on lahinguks valmis, jätkame selle registreerimist, selleks valime vajaliku käivituse (nagu on näidatud eelmises lõigus) ja läheme alla.
Kui oleme oma mudelile nime andnud, on sellel versioon. Kui salvestate teise mudeli sama nimega, uuendatakse versiooni automaatselt.
Iga mudeli jaoks saame lisada kirjelduse ja valida ühe kolmest olekust (Staging, Production, Archived); seejärel pääseme API abil neile olekutele juurde, mis koos versioonide loomisega annab täiendavat paindlikkust.
Meil on ka lihtne juurdepääs kõikidele mudelitele
ja nende versioonid
Nagu eelmises lõigus, saab kõiki toiminguid teha API abil.
7. Mudeli juurutamine
Selles etapis on meil juba koolitatud (keras) mudel. Näide selle kasutamise kohta:
Siin on self.registry mugavuse huvides jällegi väike ümbris mlflow.tracking.MlflowClient peal. Asi on selles, et ma pöördun kaugserveri poole ja otsin sealt mudelit, millel on määratud nimi ja uusim tootmisversioon. Järgmiseks laadin artefakti lokaalselt alla kausta ./model ja koostan mudeli sellest kataloogist mlflow.keras.load_model(local_path). Nüüd saame oma mudelit kasutada. CV (ML) arendajad saavad mudelit hõlpsalt täiustada ja uusi versioone avaldada.
Kokkuvõttes
Esitasin süsteemi, mis võimaldab:
salvestada tsentraalselt teavet ML mudelite, treeningute edenemise ja tulemuste kohta;
kiiresti arenduskeskkonda juurutada;
jälgida ja analüüsida mudelitega tehtava töö edenemist;
mudelite olekut on mugav versioonida ja hallata;
Saadud mudeleid on lihtne juurutada.
See näide on mänguasi ja see on lähtepunktiks oma süsteemi loomisel, mis võib hõlmata tulemuste hindamise ja mudelite registreerimise automatiseerimist (vastavalt punktid 5 ja 6) või lisate andmekogumite versioonide või võib-olla midagi muud? Püüdsin öelda, et vajate MLO-sid tervikuna, MLflow on vaid vahend eesmärgi saavutamiseks.
Kirjutage, milliste probleemidega te kokku puutusite, mida ma ei kuvanud?
Mida lisaksite süsteemi, et see vastaks teie vajadustele?
Milliseid vahendeid ja lähenemisviise kasutate probleemide või osade lahendamiseks?
Meie ettevõttes toimub perioodiliselt erinevaid IT-spetsialistidele suunatud üritusi, näiteks: 8. juulil kell 19:00 Moskva aja järgi toimub CV kohtumine online formaadis, huvi korral saab osa võtta, registreerimine siin .