Hi almal! Ek is 'n CV-ontwikkelaar by CROC. Ons implementeer al vir 3 jaar projekte op die gebied van CV. Gedurende hierdie tyd het ons baie dinge gedoen, byvoorbeeld: ons het bestuurders gemonitor sodat hulle nie gedrink het nie, nie gerook het nie, nie oor die telefoon gepraat het nie, na die pad gekyk het en nie na drome of na die wolke nie. ; Ons het mense aangeteken wat in toegewyde bane ry en verskeie parkeerplekke opneem; verseker dat werkers helms, handskoene, ens. 'n werknemer geïdentifiseer wat die fasiliteit wil betree; Ons het alles getel wat ons kon.
Waarvoor doen ek dit alles?
In die proses om projekte te implementeer, tref ons stampe, baie stampe, sommige van die probleme waarmee jy óf vertroud is óf waarmee jy in die toekoms kennis gaan maak.
Kom ons simuleer die situasie
Kom ons stel ons voor dat ons werk gekry het by 'n jong maatskappy "N", wie se aktiwiteite verband hou met ML. Ons werk aan 'n ML (DL, CV) projek, dan skakel ons om die een of ander rede na 'n ander werk oor, neem gewoonlik 'n breek en keer terug na ons eie of iemand anders se neuron.
Die oomblik van waarheid kom, jy moet op een of ander manier onthou waar jy opgehou het, watter hiperparameters jy probeer het en, bowenal, watter resultate hulle gelei het. Daar kan baie opsies wees vir wie inligting op alle bekendstellings gestoor het: in die kop, konfigurasies, notaboek, in 'n werksomgewing in die wolk. Ek het toevallig 'n opsie gesien wanneer hiperparameters gestoor is as kommentaarlyne in die kode, oor die algemeen 'n spoggerige vlug. Stel jou nou voor dat jy nie teruggekeer het na jou projek nie, maar na die projek van 'n persoon wat die maatskappy verlaat het en jy het 'n kode en 'n model genaamd model_1.pb geërf. Om die prentjie te voltooi en al die pyn oor te dra, kom ons verbeel ons dat jy ook 'n beginnerspesialis is.
Gaan voort. Om die kode uit te voer, moet ons en almal wat daarmee sal werk 'n omgewing skep. Dit gebeur dikwels dat hulle hom om een of ander rede nie as ons erfdeel nagelaat het nie. Dit kan ook 'n nie-triviale taak word. Jy wil nie tyd mors op hierdie stap nie, doen jy?
Ons lei 'n model op (byvoorbeeld 'n motorverklikker). Ons kom by die punt waar dit baie goed word - dit is tyd om die resultaat te stoor. Kom ons noem dit car_detection_v1.pb. Dan lei ons nog een op - car_detection_v2.pb. 'n Ruk later leer ons kollegas of ons self meer en meer deur verskillende argitekture te gebruik. As gevolg hiervan word 'n klomp artefakte gevorm, waaroor inligting met moeite ingesamel moet word (maar ons sal dit later doen, want vir eers het ons meer prioriteitsake).
OK, dit is nou verby! Ons het 'n model! Kan ons begin om die volgende model op te lei, 'n argitektuur te ontwikkel om 'n nuwe probleem op te los, of kan ons gaan tee drink? En wie sal ontplooi?
Identifisering van probleme
Om aan 'n projek of produk te werk is die werk van baie mense. En mettertyd vertrek en kom mense, daar is meer projekte, en die projekte self raak meer kompleks. Op een of ander manier sal situasies uit die siklus hierbo beskryf (en nie net nie) in sekere kombinasies van iterasie tot iterasie voorkom. Dit alles lei tot vermorsing van tyd, verwarring, senuwees, moontlik klante-ontevredenheid, en uiteindelik verlore geld. Alhoewel ons almal gewoonlik dieselfde ou hark volg, glo ek dat niemand hierdie oomblikke oor en oor wil herleef nie.
So, ons het deur een ontwikkelingsiklus gegaan en ons sien dat daar probleme is wat opgelos moet word. Om dit te doen benodig jy:
bêre werksresultate gerieflik;
maak die proses om nuwe werknemers te betrek eenvoudig;
die proses van ontplooiing van 'n ontwikkelingsomgewing te vereenvoudig;
konfigureer die modelweergaweproses;
'n gerieflike manier hê om modelle te valideer;
vind 'n modelstaatbestuursinstrument;
vind 'n manier om modelle aan produksie te lewer.
Dit is blykbaar nodig om met 'n werkvloei vorendag te kom wat jou in staat sal stel om hierdie lewensiklus maklik en gerieflik te bestuur? Hierdie praktyk word MLOps genoem
MLOps, of DevOps vir masjienleer, laat datawetenskap- en IT-spanne toe om saam te werk en die tempo van modelontwikkeling en -ontplooiing te verhoog deur monitering, validering en bestuur vir masjienleermodelle.
Jy kan om te vereerWat dink die Google-ouens oor dit alles? Uit die artikel is dit duidelik dat MLOps nogal 'n lywige ding is.
Verder in my artikel sal ek slegs 'n deel van die proses beskryf. Vir implementering sal ek die MLflow-instrument gebruik, want... Dit is 'n oopbronprojek, 'n klein hoeveelheid kode word benodig om aan te sluit en daar is integrasie met gewilde ml-raamwerke. Jy kan op die internet soek vir ander hulpmiddels, soos Kubeflow, SageMaker, Treine, ens., en dalk een vind wat beter by jou behoeftes pas.
“Bou” MLO's deur die voorbeeld van die MLFlow-instrument te gebruik
MLFlow is 'n oopbronplatform vir lewensiklusbestuur van ml-modelle (https://mlflow.org/).
MLflow sluit vier komponente in:
MLflow Tracking - dek die kwessies van die opname van resultate en parameters wat tot hierdie resultaat gelei het;
MLflow Project - laat jou toe om kode te verpak en dit op enige platform te reproduseer;
MLflow-modelle - verantwoordelik vir die implementering van modelle na produksie;
MLflow Registry - laat jou toe om modelle te stoor en hul toestand in 'n gesentraliseerde bewaarplek te bestuur.
MLflow werk op twee entiteite:
bekendstelling is 'n volledige siklus van opleiding, parameters en maatstawwe waarvolgens ons wil registreer;
'n Eksperiment is 'n "onderwerp" wat saamloop.
Alle stappe van die voorbeeld word op die Ubuntu 18.04-bedryfstelsel geïmplementeer.
1. Ontplooi die bediener
Om ons projek maklik te bestuur en al die nodige inligting te ontvang, sal ons 'n bediener ontplooi. MLflow-opspoorbediener het twee hoofkomponente:
backend-winkel - verantwoordelik vir die stoor van inligting oor geregistreerde modelle (ondersteun 4 DBMS'e: mysql, mssql, sqlite en postgresql);
artefakwinkel - verantwoordelik vir die stoor van artefakte (ondersteun 7 bergingsopsies: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP-bediener, SFTP Server, NFS, HDFS).
As die artefak winkel Vir eenvoud, kom ons neem 'n sftp-bediener.
skep 'n groep
$ sudo groupadd sftpg
voeg 'n gebruiker by en stel 'n wagwoord vir hom in
Match Group sftpg
ChrootDirectory /data/%u
ForceCommand internal-sftp
herbegin die diens
$ sudo systemctl restart sshd
As die backend winkel Kom ons neem 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
Om die bediener te begin, moet jy die volgende python-pakkette installeer (ek beveel aan om 'n aparte virtuele omgewing te skep):
Om die resultate van ons opleiding nie verlore te gaan nie, toekomstige generasies ontwikkelaars om te verstaan wat gebeur het, en vir ouer kamerade en jy om die leerproses rustig te kan ontleed, moet ons dop byvoeg. Nasporing beteken om parameters, statistieke, artefakte en enige bykomende inligting oor die begin van opleiding, in ons geval, op die bediener te stoor.
Ek het byvoorbeeld 'n klein projek op github op Keras vir die segmentering van alles wat in is COCO datastel. Om dop by te voeg, het ek 'n lêer mlflow_training.py geskep.
Hier is die reëls waar die interessantste dinge gebeur:
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)
Hier is self.remote_server 'n klein omhulsel oor die mlflow.tracking-metodes. MlflowClient (ek het dit gerieflikheidshalwe gemaak), met behulp waarvan ek 'n eksperiment skep en dit op die bediener laat loop. Vervolgens dui ek aan waar die bekendstellingsresultate saamgevoeg moet word (mlflow.set_tracking_uri(self.tracking_uri)). Ek aktiveer outomatiese aanteken mlflow.keras.autolog(). Tans ondersteun MLflow Tracking outomatiese aanteken vir TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. As jy nie jou raamwerk of biblioteek gevind het nie, kan jy altyd eksplisiet aanmeld. Ons begin met opleiding. Registreer etikette en invoerparameters op die afgeleë bediener.
'n Paar reëls en jy, soos almal anders, het toegang tot inligting oor alle bekendstellings. Koel?
3. Ons stel die projek op
Kom ons maak dit nou maklik om die projek te begin. Om dit te doen, voeg die MLproject- en conda.yaml-lêer by die projekwortel.
MLprojek
Jy kan docker as jou runtime-omgewing gebruik, vir meer besonderhede verwys asseblief na dokumentasie.
4. Kom ons begin oefen
Ons kloon die projek en gaan na die projekgids:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Om te hardloop moet jy biblioteke installeer
pip install mlflow
pip install pysftp
Omdat in die voorbeeld wat ek gebruik conda_env, moet Anaconda op jou rekenaar geïnstalleer word (maar jy kan dit omseil deur al die nodige pakkette self te installeer en met die bekendstellingsparameters te speel).
Alle voorbereidende stappe is voltooi en ons kan begin om die opleiding te begin. Van die projekwortel:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
Nadat die opdrag ingevoer is, sal 'n conda-omgewing outomaties geskep word en die opleiding sal begin.
In die voorbeeld hierbo het ek die aantal tydperke vir opleiding geslaag, die kategorieë waarin ons wil segmenteer (jy kan die volledige lys sien hier) en die adres van ons afgeleë bediener.
'n Volledige lys van moontlike parameters kan gevind word in die MLproject-lêer.
5. Evalueer leerresultate
Nadat ons die opleiding voltooi het, kan ons in die blaaier na die adres van ons bediener gaan http://server_host:server_port
Hier sien ons 'n lys van alle eksperimente (links bo), asook inligting oor lopies (middel). Ons kan meer gedetailleerde inligting (parameters, metrieke, artefakte en 'n paar bykomende inligting) vir elke bekendstelling bekyk.
Vir elke maatstaf kan ons die geskiedenis van veranderinge waarneem
Dié. Op die oomblik kan ons die resultate in 'n "handmatige" modus ontleed, en jy kan ook outomatiese validering opstel met behulp van die MLflow API.
6. Registreer die model
Nadat ons ons model ontleed het en besluit het dat dit gereed is vir geveg, gaan ons voort om dit te registreer, hiervoor kies ons die bekendstelling wat ons benodig (soos in die vorige paragraaf getoon) en gaan af.
Nadat ons ons model 'n naam gegee het, het dit 'n weergawe. As jy 'n ander model met dieselfde naam stoor, sal die weergawe outomaties opgegradeer word.
Vir elke model kan ons 'n beskrywing byvoeg en een van drie toestande kies (Staging, Production, Archived); vervolgens, met behulp van die API, kan ons toegang tot hierdie toestande kry, wat saam met weergawes addisionele buigsaamheid bied.
Ons het ook maklike toegang tot alle modelle
en hul weergawes
Soos in die vorige paragraaf, kan alle bewerkings met die API gedoen word.
7. Ontplooi die model
Op hierdie stadium het ons reeds 'n opgeleide (keras) model. 'n Voorbeeld van hoe jy dit kan gebruik:
Hier is self.registry weer 'n klein omhulsel oor mlflow.tracking.MlflowClient, gerieflikheidshalwe. Die punt is dat ek toegang tot 'n afgeleë bediener kry en 'n model daar soek met die gespesifiseerde naam, en die nuutste produksie weergawe. Vervolgens laai ek die artefak plaaslik af na die ./model-lêergids en bou die model uit hierdie gids mlflow.keras.load_model(local_path). Nou kan ons ons model gebruik. CV (ML) ontwikkelaars kan maklik die model verbeter en nuwe weergawes publiseer.
Ten slotte
Ek het 'n stelsel aangebied wat toelaat:
inligting oor ML-modelle, opleidingsvordering en resultate sentraal stoor;
ontplooi vinnig 'n ontwikkelingsomgewing;
moniteer en ontleed die vordering van werk aan modelle;
dit is gerieflik om die toestand van modelle te weergawe en te bestuur;
Dit is maklik om die resulterende modelle te ontplooi.
Hierdie voorbeeld is 'n speelding en dien as 'n beginpunt vir die bou van jou eie stelsel, wat outomatisering van evaluering van resultate en registrasie van modelle (onderskeidelik punte 5 en 6) kan insluit, of jy sal weergawe van datastelle byvoeg, of dalk iets anders? Die punt wat ek probeer maak is dat jy MLOps as 'n geheel nodig het, MLflow is net 'n middel tot 'n doel.
Skryf watter probleme jy teëgekom het wat ek nie gewys het nie?
Wat sal jy by die stelsel voeg om aan jou behoeftes te voldoen?
Watter gereedskap en benaderings gebruik jy om al of 'n deel van die probleme op te los?
Ons maatskappy bied gereeld verskeie geleenthede vir IT-spesialiste aan, byvoorbeeld: op 8 Julie om 19:00 Moskou-tyd sal daar 'n CV-byeenkoms in 'n aanlyn-formaat wees, as jy belangstel, kan jy deelneem, registrasie hier .