Pershendetje te gjitheve! Unë jam një zhvillues CV në CROC. Tashmë prej 3 vitesh zbatojmë projekte në fushën e CV-së. Gjatë kësaj kohe, ne bëmë shumë gjëra, për shembull: monitoruam shoferët në mënyrë që gjatë vozitjes të mos pinin, të mos pinin duhan, të mos flisnin në telefon, të shikonin rrugën dhe jo ëndrrat ose retë. ; Kemi regjistruar persona që lëvizin në korsi të veçanta dhe zënë disa vende parkimi; siguroi që punëtorët të mbanin helmeta, doreza, etj.; identifikoi një punonjës që dëshiron të hyjë në objekt; Ne numëruam gjithçka që mundëm.
Për çfarë po i bëj të gjitha këto?
Në procesin e zbatimit të projekteve, ne kemi goditur gunga, shumë gunga, disa nga problemet me të cilat ose jeni njohur ose do të njiheni në të ardhmen.
Le të simulojmë situatën
Le të imagjinojmë se kemi marrë një punë në një kompani të re "N", aktivitetet e së cilës lidhen me ML. Ne punojmë në një projekt ML (DL, CV), pastaj për ndonjë arsye kalojmë në një punë tjetër, në përgjithësi bëjmë një pushim dhe kthehemi në neuronin tonë ose të dikujt tjetër.
Vjen momenti i së vërtetës, duhet të mbani mend disi se ku u ndalët, cilat hiperparametra keni provuar dhe, më e rëndësishmja, në çfarë rezultatesh çuan. Mund të ketë shumë opsione se kush ka ruajtur informacionin në të gjitha lëshimet: në kokë, konfigurime, bllok shënimesh, në një mjedis pune në renë kompjuterike. Më ka ndodhur të shoh një opsion kur hiperparametrat janë ruajtur si rreshta të komentuar në kod, në përgjithësi, një fluturim i zbukuruar. Tani imagjinoni që nuk jeni kthyer në projektin tuaj, por në projektin e një personi që u largua nga kompania dhe ju keni trashëguar një kod dhe një model të quajtur model_1.pb. Për të plotësuar figurën dhe për të përcjellë të gjithë dhimbjen, le të imagjinojmë se jeni gjithashtu një specialist fillestar.
Shkoni përpara. Për të ekzekutuar kodin, ne dhe të gjithë ata që do të punojnë me të duhet të krijojmë një mjedis. Ndodh shpesh që për ndonjë arsye nuk e kanë lënë si trashëgimi. Kjo gjithashtu mund të bëhet një detyrë jo e parëndësishme. Ju nuk doni të humbni kohë në këtë hap, apo jo?
Ne trajnojmë një model (për shembull, një detektor makine). Ne arrijmë në pikën ku bëhet shumë mirë - është koha për të ruajtur rezultatin. Le ta quajmë car_detection_v1.pb. Pastaj stërvitim një tjetër - car_detection_v2.pb. Pak kohë më vonë, kolegët tanë ose ne vetë mësojmë gjithnjë e më shumë, duke përdorur arkitektura të ndryshme. Si rezultat, formohen një mori objektesh, informacioni për të cilin duhet të mblidhen me kujdes (por këtë do ta bëjmë më vonë, sepse tani për tani kemi çështje më prioritare).
OK tani ka mbaruar! Ne kemi një model! A mund të fillojmë të trajnojmë modelin tjetër, të zhvillojmë një arkitekturë për të zgjidhur një problem të ri, apo mund të shkojmë të pimë pak çaj? Dhe kush do të vendoset?
Identifikimi i problemeve
Puna në një projekt ose produkt është puna e shumë njerëzve. Dhe me kalimin e kohës, njerëzit largohen dhe vijnë, ka më shumë projekte, dhe vetë projektet bëhen më komplekse. Në një mënyrë apo tjetër, situatat nga cikli i përshkruar më sipër (dhe jo vetëm) në kombinime të caktuara do të ndodhin nga përsëritja në përsëritje. E gjithë kjo rezulton në humbje kohe, konfuzion, nerva, ndoshta pakënaqësi të klientëve dhe në fund të fundit, humbje të parave. Edhe pse ne të gjithë zakonisht ndjekim të njëjtën grabujë të vjetër, besoj se askush nuk dëshiron t'i rijetojë këto momente pa pushim.
Pra, ne kemi kaluar një cikël zhvillimi dhe shohim se ka probleme që duhen zgjidhur. Për ta bërë këtë ju duhet:
ruaj me lehtësi rezultatet e punës;
të thjeshtojë procesin e përfshirjes së punonjësve të rinj;
thjeshtimi i procesit të vendosjes së një mjedisi zhvillimi;
konfiguroni procesin e versionimit të modelit;
të ketë një mënyrë të përshtatshme për të vërtetuar modelet;
gjeni një mjet model për menaxhimin e shtetit;
gjeni një mënyrë për të ofruar modele në prodhim.
Me sa duket është e nevojshme të krijoni një rrjedhë pune që do t'ju lejojë të menaxhoni lehtësisht dhe me lehtësi këtë cikël jetësor? Kjo praktikë quhet MLOps
MLOps, ose DevOps për mësimin e makinerive, lejon ekipet e shkencës së të dhënave dhe IT të bashkëpunojnë dhe të rrisin ritmin e zhvillimit dhe vendosjes së modelit përmes monitorimit, vërtetimit dhe qeverisjes për modelet e mësimit të makinerive.
Ju mundeni per te nderuarÇfarë mendojnë djemtë e Google për gjithë këtë? Nga artikulli është e qartë se MLOps është një gjë mjaft voluminoze.
Më tej në artikullin tim do të përshkruaj vetëm një pjesë të procesit. Për implementim, do të përdor mjetin MLflow, sepse... Ky është një projekt me burim të hapur, kërkohet një sasi e vogël kodi për t'u lidhur dhe ka integrim me kornizat popullore ml. Mund të kërkoni në internet për mjete të tjera, si Kubeflow, SageMaker, Trains, etj., dhe ndoshta të gjeni një që i përshtatet më mirë nevojave tuaja.
“Ndërtimi” i MLO-ve duke përdorur shembullin e përdorimit të mjetit MLFlow
MLFlow është një platformë me burim të hapur për menaxhimin e ciklit jetësor të modeleve ml (https://mlflow.org/).
MLflow përfshin katër komponentë:
MLflow Tracking - mbulon çështjet e regjistrimit të rezultateve dhe parametrave që çuan në këtë rezultat;
Projekti MLflow - ju lejon të paketoni kodin dhe ta riprodhoni atë në çdo platformë;
Modelet MLflow - përgjegjës për vendosjen e modeleve në prodhim;
Regjistri MLflow - ju lejon të ruani modelet dhe të menaxhoni gjendjen e tyre në një depo të centralizuar.
MLflow operon në dy entitete:
nisja është një cikël i plotë i trajnimeve, parametrave dhe matjeve me të cilat duam të regjistrohemi;
Një eksperiment është një "temë" që shkon së bashku.
Të gjithë hapat e shembullit zbatohen në sistemin operativ Ubuntu 18.04.
1. Vendosni serverin
Në mënyrë që ne të menaxhojmë me lehtësi projektin tonë dhe të marrim të gjithë informacionin e nevojshëm, ne do të vendosim një server. Serveri i përcjelljes MLflow ka dy komponentë kryesorë:
backend store - përgjegjës për ruajtjen e informacionit rreth modeleve të regjistruara (mbështet 4 DBMS: mysql, mssql, sqlite dhe postgresql);
dyqani i objekteve - përgjegjës për ruajtjen e objekteve (mbështet 7 opsione ruajtjeje: Amazon S3, Azure Blob Storage, Google Cloud Storage, server FTP, Server SFTP, NFS, HDFS).
Si dyqan objektesh Për thjeshtësi, le të marrim një server sftp.
krijoni një grup
$ sudo groupadd sftpg
shtoni një përdorues dhe vendosni një fjalëkalim për të
Match Group sftpg
ChrootDirectory /data/%u
ForceCommand internal-sftp
rinisni shërbimin
$ sudo systemctl restart sshd
Si dyqan backend Le të marrim postgresql.
$ 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
Për të nisur serverin, duhet të instaloni paketat e mëposhtme të python (Unë rekomandoj krijimin e një mjedisi të veçantë virtual):
Në mënyrë që rezultatet e trajnimit tonë të mos humbasin, brezat e ardhshëm të zhvilluesve të kuptojnë se çfarë po ndodhte, dhe që shokët më të vjetër dhe ju të jeni në gjendje të analizoni me qetësi procesin e mësimit, ne duhet të shtojmë gjurmimin. Gjurmimi nënkupton ruajtjen e parametrave, metrikave, objekteve dhe çdo informacioni shtesë në lidhje me fillimin e trajnimit, në rastin tonë, në server.
Për shembull, kam krijuar një të vogël projekt në github në Keras për segmentimin e gjithçkaje që është në Të dhënat e COCO-s. Për të shtuar gjurmimin, kam krijuar një skedar mlflow_training.py.
Këtu janë rreshtat ku ndodhin gjërat më interesante:
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)
Këtu self.remote_server është një mbështjellës i vogël mbi metodat e mlflow.tracking. MlflowClient (e bëra për lehtësi), me ndihmën e të cilit krijoj një eksperiment dhe e drejtoj në server. Më pas, unë tregoj se ku duhet të bashkohen rezultatet e nisjes (mlflow.set_tracking_uri(self.tracking_uri)). Aktivizoj regjistrimin automatik mlflow.keras.autolog(). Aktualisht MLflow Tracking mbështet regjistrimin automatik për TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Nëse nuk e keni gjetur kornizën ose bibliotekën tuaj, atëherë gjithmonë mund të regjistroheni në mënyrë të qartë. Po fillojmë stërvitjen. Regjistroni etiketat dhe parametrat e hyrjes në serverin në distancë.
Disa rreshta dhe ju, si gjithë të tjerët, keni akses në informacione për të gjitha lëshimet. E bukur?
3. Ne hartojmë projektin
Tani le ta bëjmë të lehtë nisjen e projektit. Për ta bërë këtë, shtoni skedarin MLproject dhe conda.yaml në rrënjën e projektit.
Projekti ML
Mjedisi - në rastin tim, conda_env tregon se Anaconda përdoret për të ekzekutuar dhe përshkrimi i varësisë është në skedarin conda.yaml;
Pikat e hyrjes - tregon se cilat skedarë dhe me cilët parametra mund të ekzekutojmë (të gjithë parametrat regjistrohen automatikisht kur filloni trajnimin)
Ju mund të përdorni docker si mjedisin tuaj të ekzekutimit, për më shumë detaje ju lutemi referojuni dokumentacionin.
4. Le të fillojmë stërvitjen
Ne klonojmë projektin dhe shkojmë në drejtorinë e projektit:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Për të ekzekutuar, duhet të instaloni bibliotekat
pip install mlflow
pip install pysftp
Sepse në shembullin që përdor conda_env, Anaconda duhet të instalohet në kompjuterin tuaj (por ju mund ta shmangni këtë duke instaluar vetë të gjitha paketat e nevojshme dhe duke luajtur me parametrat e nisjes).
Të gjithë hapat përgatitorë kanë përfunduar dhe ne mund të fillojmë të fillojmë trajnimin. Nga rrënja e projektit:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
Pas futjes së komandës, do të krijohet automatikisht një mjedis conda dhe do të fillojë trajnimi.
Në shembullin e mësipërm, kalova numrin e epokave për trajnim, kategoritë në të cilat duam të segmentojmë (mund të shihni listën e plotë këtu) dhe adresën e serverit tonë në distancë.
Një listë e plotë e parametrave të mundshëm mund të gjendet në skedarin MLproject.
Këtu shohim një listë të të gjitha eksperimenteve (lart majtas), si dhe informacione mbi ekzekutimet (në mes). Ne mund të shohim informacione më të detajuara (parametra, metrikë, objekte dhe disa informacione shtesë) për çdo lëshim.
Për çdo metrikë mund të vëzhgojmë historinë e ndryshimeve
Ato. Për momentin, ne mund t'i analizojmë rezultatet në një modalitet "manual", dhe gjithashtu mund të konfiguroni vërtetimin automatik duke përdorur API MLflow.
6. Regjistroni modelin
Pasi të kemi analizuar modelin tonë dhe kemi vendosur që ai është gati për betejë, ne vazhdojmë ta regjistrojmë atë, për këtë zgjedhim nisjen që na nevojitet (siç tregohet në paragrafin e mëparshëm) dhe zbresim.
Pasi i japim një emër modelit tonë, ai ka një version. Nëse ruani një model tjetër me të njëjtin emër, versioni do të përmirësohet automatikisht.
Për secilin model, ne mund të shtojmë një përshkrim dhe të zgjedhim një nga tre gjendjet (Staging, Production, Arkived); më pas, duke përdorur API, ne mund të aksesojmë këto gjendje, të cilat, së bashku me versionimin, ofrojnë fleksibilitet shtesë.
Gjithashtu kemi akses te lehte ne te gjitha modelet
dhe versionet e tyre
Ashtu si në paragrafin e mëparshëm, të gjitha operacionet mund të bëhen duke përdorur API.
7. Vendosni modelin
Në këtë fazë tashmë kemi një model (keras) të trajnuar. Një shembull se si mund ta përdorni:
Këtu self.registry është përsëri një mbështjellës i vogël mbi mlflow.tracking.MlflowClient, për lehtësi. Çështja është që unë hyj në një server të largët dhe kërkoj një model atje me emrin e specifikuar dhe versionin e fundit të prodhimit. Më pas, e shkarkoj objektin lokalisht në dosjen ./model dhe ndërtoj modelin nga kjo direktori mlflow.keras.load_model(local_path). Tani mund të përdorim modelin tonë. Zhvilluesit e CV (ML) mund të përmirësojnë lehtësisht modelin dhe të publikojnë versione të reja.
Në përfundim
Kam paraqitur një sistem që lejon:
ruajnë në mënyrë qendrore informacione rreth modeleve të ML, progresit dhe rezultateve të trajnimit;
vendosja e shpejtë e një mjedisi zhvillimi;
monitoron dhe analizon ecurinë e punës në modele;
është i përshtatshëm për të versionuar dhe menaxhuar gjendjen e modeleve;
Është e lehtë të vendosësh modelet që rezultojnë.
Ky shembull është një lodër dhe shërben si një pikënisje për ndërtimin e sistemit tuaj, i cili mund të përfshijë automatizimin e vlerësimit të rezultateve dhe regjistrimin e modeleve (pikat 5 dhe 6, respektivisht) ose do të shtoni versionimin e grupeve të të dhënave, apo ndoshta diçka tjetër? Pika që po përpiqesha të them është se ju nevojiten MLOps në tërësi, MLflow është vetëm një mjet për një qëllim.
Shkruaj çfarë problemesh ke hasur që nuk i kam shfaqur?
Çfarë do t'i shtonit sistemit për ta bërë atë të plotësojë nevojat tuaja?
Çfarë mjetesh dhe qasjesh përdorni për të zgjidhur të gjitha ose një pjesë të problemeve?
Kompania jonë organizon periodikisht ngjarje të ndryshme për specialistët e IT-së, për shembull: më 8 korrik në orën 19:00 me kohën e Moskës do të ketë një takim CV në një format online, nëse jeni të interesuar, mund të merrni pjesë, regjistrim këtu .