Bok svima! Ja sam CV developer u CROC-u. Projekte iz područja životopisa provodimo već 3 godine. Za to vrijeme puno toga smo napravili, na primjer: pratili smo vozače da u vožnji ne piju, ne puše, ne razgovaraju na telefon, gledaju u cestu, a ne u snove ili oblake. ; Zabilježili smo ljude koji voze za to predviđenim trakama i zauzimaju nekoliko parkirnih mjesta; osigurali da radnici nose kacige, rukavice itd.; identificirao djelatnika koji želi ući u objekt; Brojali smo sve što smo mogli.
Zašto sve ovo radim?
U procesu realizacije projekata nailazili smo na neravnine, puno neravnina, neki od problema s kojima ste ili upoznati ili ćete se u budućnosti upoznati.
Simulirajmo situaciju
Zamislimo da smo dobili posao u mladoj tvrtki "N", čije su aktivnosti vezane uz ML. Radimo na ML (DL, CV) projektu, onda se iz nekog razloga prebacimo na drugi posao, uglavnom napravimo pauzu i vratimo se svom ili tuđem neuronu.
Dolazi trenutak istine, morate se nekako sjetiti gdje ste stali, koje ste hiperparametre isprobali i, što je najvažnije, do kakvih su rezultata doveli. Može postojati mnogo opcija za to tko je pohranio informacije o svim pokretanjima: u glavi, konfiguracijama, bilježnici, u radnom okruženju u oblaku. Slučajno sam vidio opciju kada su hiperparametri pohranjeni kao komentirani redovi u kodu, općenito, maštovitost. Sada zamislite da ste se vratili ne svom projektu, već projektu osobe koja je napustila tvrtku i naslijedili ste šifru i model model_1.pb. Da bismo dovršili sliku i prenijeli svu bol, zamislimo da ste i vi specijalist početnik.
Samo naprijed. Za pokretanje koda, mi i svi koji će s njim raditi moramo stvoriti okruženje. Često se događa da nam ga iz nekog razloga nisu ostavili u nasljedstvo. Ovo također može postati netrivijalan zadatak. Ne želite gubiti vrijeme na ovaj korak, zar ne?
Osposobljavamo model (na primjer, detektor automobila). Dolazimo do točke kada postaje vrlo dobro - vrijeme je da sačuvamo rezultat. Nazovimo ga car_detection_v1.pb. Zatim treniramo još jedan - car_detection_v2.pb. Nešto kasnije, naše kolege ili mi sami podučavamo sve više i više, koristeći različite arhitekture. Kao rezultat toga, formira se hrpa artefakata, informacije o kojima se moraju mukotrpno prikupljati (ali to ćemo učiniti kasnije, jer za sada imamo prioritetnije stvari).
OK, sada je sve gotovo! Imamo model! Možemo li početi trenirati sljedeći model, razvijati arhitekturu za rješavanje novog problema ili možemo otići na čaj? A tko će rasporediti?
Identificiranje problema
Rad na projektu ili proizvodu posao je mnogih ljudi. I s vremenom ljudi odlaze i dolaze, projekata je sve više, a sami projekti postaju kompleksniji. Na ovaj ili onaj način, situacije iz gore opisanog ciklusa (i ne samo) u određenim kombinacijama događat će se iz iteracije u iteraciju. Sve to rezultira izgubljenim vremenom, zbunjenošću, živcima, moguće nezadovoljstvom kupaca i na kraju izgubljenim novcem. Iako se svi uglavnom krećemo istim starim načinom, vjerujem da nitko ne želi proživljavati te trenutke iznova i iznova.
Dakle, prošli smo jedan razvojni ciklus i vidimo da postoje problemi koje treba riješiti. Da biste to učinili potrebno vam je:
prikladno pohraniti rezultate rada;
učiniti proces uključivanja novih zaposlenika jednostavnim;
pojednostaviti proces postavljanja razvojnog okruženja;
konfigurirati proces izrade verzija modela;
imaju prikladan način za provjeru valjanosti modela;
pronaći model alata za upravljanje stanjem;
pronaći način isporuke modela u proizvodnju.
Očigledno je potrebno osmisliti tijek rada koji bi vam omogućio jednostavno i praktično upravljanje ovim životnim ciklusom? Ova praksa se zove MLOps
MLOps ili DevOps za strojno učenje omogućuje timovima za podatkovnu znanost i IT da surađuju i ubrzaju razvoj i implementaciju modela kroz praćenje, provjeru valjanosti i upravljanje modelima strojnog učenja.
Možeš čitatiŠto Googleovi dečki misle o svemu ovome? Iz članka je jasno da je MLOps prilično pozamašna stvar.
Dalje u svom članku opisat ću samo dio procesa. Za implementaciju ću koristiti MLflow alat jer... Ovo je projekt otvorenog koda, potrebna je mala količina koda za povezivanje i postoji integracija s popularnim ml okvirima. Na internetu možete pretraživati druge alate, kao što su Kubeflow, SageMaker, Trains itd., i možda pronaći onaj koji više odgovara vašim potrebama.
“Izgradnja” MLO-ova na primjeru korištenja alata MLFlow
MLFlow je platforma otvorenog koda za upravljanje životnim ciklusom ml modela (https://mlflow.org/).
MLflow uključuje četiri komponente:
MLflow Tracking - pokriva problematiku bilježenja rezultata i parametara koji su doveli do tog rezultata;
MLflow Project - omogućuje vam pakiranje koda i njegovu reprodukciju na bilo kojoj platformi;
MLflow Models - odgovoran za implementaciju modela u proizvodnju;
MLflow Registar - omogućuje pohranjivanje modela i upravljanje njihovim stanjem u centraliziranom repozitoriju.
MLflow djeluje na dva entiteta:
lansiranje je puni ciklus obuke, parametara i metrika po kojima se želimo registrirati;
Eksperiment je "tema" koja teče zajedno.
Svi koraci primjera implementirani su na Ubuntu 18.04 operativnom sustavu.
1. Postavite poslužitelj
Kako bismo lakše upravljali našim projektom i primali sve potrebne informacije, postavit ćemo server. MLflow poslužitelj za praćenje ima dvije glavne komponente:
backend store - odgovoran za pohranu informacija o registriranim modelima (podržava 4 DBMS-a: mysql, mssql, sqlite i postgresql);
Match Group sftpg
ChrootDirectory /data/%u
ForceCommand internal-sftp
ponovno pokrenite uslugu
$ sudo systemctl restart sshd
Kao pozadinska trgovina Uzmimo 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
Za pokretanje poslužitelja morate instalirati sljedeće python pakete (preporučam stvaranje zasebnog virtualnog okruženja):
Kako se rezultati našeg treninga ne bi izgubili, buduće generacije programera razumjele što se događa, a kako biste stariji suborci i vi mogli mirno analizirati proces učenja, moramo dodati praćenje. Praćenje podrazumijeva spremanje parametara, metrika, artefakata i svih dodatnih informacija o početku treninga, u našem slučaju, na server.
Na primjer, stvorio sam mali projekt na githubu na Kerasu za segmentiranje svega što je unutra Skup podataka COCO. Da bih dodao praćenje, napravio sam datoteku mlflow_training.py.
Evo redaka u kojima se događaju najzanimljivije stvari:
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)
Ovdje je self.remote_server mali omotač nad metodama mlflow.tracking. MlflowClient (napravio sam ga radi praktičnosti), uz pomoć kojeg kreiram eksperiment i pokrećem ga na poslužitelju. Zatim ću naznačiti gdje se rezultati pokretanja trebaju spojiti (mlflow.set_tracking_uri(self.tracking_uri)). Omogućavam automatsko bilježenje mlflow.keras.autolog(). Trenutno MLflow Tracking podržava automatsko bilježenje za TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ako niste pronašli svoj okvir ili biblioteku, uvijek se možete eksplicitno prijaviti. Počinjemo s treninzima. Registrirajte oznake i ulazne parametre na udaljenom poslužitelju.
Nekoliko redaka i vi, kao i svi ostali, imate pristup informacijama o svim lansiranjima. Cool?
3. Izrađujemo projekt
Sada olakšajmo pokretanje projekta. Da biste to učinili, dodajte MLproject i conda.yaml datoteku u korijen projekta.
MLproject
Možete koristiti docker kao svoje runtime okruženje, za više detalja pogledajte dokumentacija.
4. Krenimo s treninzima
Kloniramo projekt i idemo u direktorij projekta:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Za pokretanje morate instalirati biblioteke
pip install mlflow
pip install pysftp
Jer u primjeru koji koristim conda_env, Anaconda mora biti instalirana na vašem računalu (ali to možete zaobići tako da sami instalirate sve potrebne pakete i igrate se s parametrima pokretanja).
Svi pripremni koraci su završeni i možemo započeti s obukom. Iz korijena projekta:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
Nakon unosa naredbe automatski će se kreirati conda okruženje i započet će obuka.
U gornjem primjeru sam proslijedio broj epoha za obuku, kategorije u koje želimo segmentirati (možete vidjeti cijeli popis здесь) i adresu našeg udaljenog poslužitelja.
Kompletan popis mogućih parametara može se pronaći u datoteci MLproject.
Ovdje vidimo popis svih eksperimenata (gore lijevo), kao i informacije o izvođenjima (u sredini). Možemo vidjeti detaljnije informacije (parametre, metrike, artefakte i neke dodatne informacije) za svako pokretanje.
Za svaku metriku možemo promatrati povijest promjena
Oni. Trenutno možemo analizirati rezultate u “ručnom” načinu rada, a također možete postaviti automatsku provjeru pomoću MLflow API-ja.
6. Registrirajte model
Nakon što smo analizirali naš model i odlučili da je spreman za bitku, nastavljamo s registracijom, za to odabiremo lansiranje koje nam je potrebno (kao što je prikazano u prethodnom odlomku) i idemo dolje.
Nakon što našem modelu damo ime, on ima verziju. Ako spremite drugi model s istim imenom, verzija će se automatski nadograditi.
Za svaki model možemo dodati opis i odabrati jedno od tri stanja (Staging, Production, Archived), a zatim pomoću API-ja možemo pristupiti tim stanjima, što uz verzioniranje daje dodatnu fleksibilnost.
Također imamo jednostavan pristup svim modelima
i njihove verzije
Kao iu prethodnom odlomku, sve se operacije mogu obaviti pomoću API-ja.
7. Postavite model
U ovoj fazi već imamo istrenirani (keras) model. Primjer kako ga možete koristiti:
Ovdje je self.registry ponovno mali omot preko mlflow.tracking.MlflowClient, radi praktičnosti. Poanta je da pristupim udaljenom serveru i tamo potražim model s navedenim imenom i zadnjom produkcijskom verzijom. Zatim preuzimam artefakt lokalno u mapu ./model i gradim model iz ovog direktorija mlflow.keras.load_model(local_path). Sada možemo koristiti naš model. CV (ML) programeri mogu lako poboljšati model i objaviti nove verzije.
U zaključku
Predstavio sam sustav koji omogućuje:
centralno pohraniti informacije o ML modelima, napretku i rezultatima obuke;
brzo implementirati razvojno okruženje;
pratiti i analizirati tijek rada na modelima;
prikladno je kreirati verzije i upravljati stanjem modela;
Lako je implementirati rezultirajuće modele.
Ovaj primjer je igračka i služi kao početna točka za izgradnju vlastitog sustava, koji može uključivati automatizaciju evaluacije rezultata i registraciju modela (točke 5 i 6, respektivno) ili ćete dodati verziju skupova podataka, ili možda nešto treće? Poanta koju sam pokušavao istaknuti je da trebate MLOps kao cjelinu, MLflow je samo sredstvo za postizanje cilja.
Napišite na koje ste probleme naišli, a nisam ih prikazao?
Što biste dodali sustavu da bi zadovoljio vaše potrebe?
Koje alate i pristupe koristite za rješavanje svih ili dijela problema?
Naša tvrtka povremeno ugošćuje razne događaje za IT stručnjake, na primjer: 8. srpnja u 19:00 po moskovskom vremenu održat će se CV susret u online formatu, ako ste zainteresirani, možete sudjelovati, registracija здесь .