
Tere kÔigile! Olen CV-arendaja KROKis. Oleme juba 3 aastat töötanud CV valdkonnas projektide elluviimisega. Selle aja jooksul oleme teinud erinevaid asju, nÀiteks: jÀlginud juhte, et nad sÔidu ajal ei joovaks, ei suitsetaks, ei rÀÀgiks telefoniga, vaid vaataksid teed, mitte ei unustaks vÔi vaataksid pilvi; fikseerinud inimesi, kes sÔidavad eraldi sÔiduradadel ja vÔtavad mitu parkimiskohta; jÀlginud, et töötajad kantaksid kiivreid, kindaid jne; tuvastanud töötajaid, kes soovivad objektile siseneda; arvestanud kÔike, mida ainult saab.
Milleks ma seda rÀÀgin?
Projektide elluviimise kÀigus oleme kogunud teadmisi, palju teadmisi, ja mÔne probleemiga olete vÔib-olla tuttav vÔi tutvute nendega tulevikus.
Simuleerime olukorda
Kujutame ette, et tööle saime nooresse ettevĂ”ttesse âNâ, mille tegevus on seotud ML-iga. Töötab meil ML (DL, CV) projektis, siis mingil pĂ”hjusel vahetame tööd, teeme pausi ja naaseme oma vĂ”i kellegi teise nĂ€rvivĂ”rku.
- Tuleb tĂ”e hetk, peame kuidagi meenutama, millele me jĂ€ime, milliseid hĂŒperparameetreid proovisime ja, mis kĂ”ige tĂ€htsam, millistele tulemusele need viisid. Teavet vĂ”ib olla mitmeid variante, kuidas inimesed on kogu informatsiooni kĂ€ivitamise kohta sĂ€ilitanud: peas, konfiguratsioonifailides, mĂ€rkmikus vĂ”i pilve töökeskkonnas. Olen nĂ€inud varianti, kus hĂŒperparameetrid olid salvestatud kommenteeritud ridadena koodis, mis jĂ€ttis ruumi loovusele. Ning nĂŒĂŒd kujutage ette, et olete tagasi mitte oma projekti juurde, vaid inimese projekti juurde, kes on ettevĂ”tte juba lahkunud ja teile on jÀÀnud kood ja mudel nimega model_1.pb. TĂ€iendava konteksti ja kogu valu edastamiseks kujutame ette, et olete ka algaja spetsialist.
- JĂ€tkame. Koodi kĂ€ivitamiseks peame ja kĂ”ik, kes sellega töötavad, peavad looma keskkonna. Tihti juhtub, et ka seda ei ole meile mingitel pĂ”hjustel pĂ€randatud. See vĂ”ib samuti osutuda keeruliseks ĂŒlesandeks. Selle sammu peale ei taha aega raisata, eks ole?
- Koolitame mudelit (nĂ€iteks auto tuvastajat). JĂ”uame hetkeni, mil see hakkab pĂ€ris hĂ€sti toimima â on aeg tulemus salvestada. Nimetame selle car_detection_v1.pb. Siis koolitame veel ĂŒhe â car_detection_v2.pb. MĂ”ne aja pĂ€rast koolitame meie kolleegid vĂ”i isegi meie veel ja veel, kasutades erinevaid arhitektuure. LĂ”puks tekib hunnik artefakte, mille kohta tuleb teavet hoolikalt koguda (aga teeme seda hiljem, meil on ju hetkel tĂ€htsamad asjad).
- Nii et kĂ”ik on valmis! Meil on mudel! Saame alustada jĂ€rgmise mudeli koolitamist, arendada arhitektuuri uue ĂŒlesande lahendamiseks vĂ”i lĂ€hme teed jooma? Aga kes hakkab seda kasutusele vĂ”tma?
Tuletame probleemid esile
Projekti vĂ”i toote kallal töötamine on paljude inimeste töö. Aja jooksul inimesed tulevad ja lĂ€hevad, projekte tekib jĂ€rjest rohkem ning need muutuvad jĂ€rjest keerulisemaks. Nii vĂ”i teisiti vĂ”rdselt vĂ”ib olla olukordi, nagu eelpool kirjeldatud tsĂŒklis (ja mitte ainult), mis esinevad erinevates kombinatsioonides iga iteratsiooni jooksul. See kĂ”ik toob kaasa ajakulu, segaduse, nĂ€rvikatkestusi, tĂ”enĂ€oliselt â tellija rahulolematust ja lĂ”puks â saamata jÀÀnud raha. Kuigi me tavaliselt astume samadesse mĂ€rkidesse, usun, et keegi ei taha pidevalt neid hetki uuesti lĂ€bi elada.

NĂŒĂŒd, kui oleme lĂ€binud ĂŒhe arendus-tsĂŒkli, nĂ€eme, et on probleeme, mida tuleb lahendada. Selleks on vaja:
- mugavalt salvestada töö tulemusi;
- teha uute töötajate kaasamisprotsess lihtsamaks;
- lihtsustada arenduskeskkonna kÀivitamise protsessi;
- seada mudelite versioonihaldusprotsess;
- omada mugavat meetodit mudelite valideerimiseks;
- leida mudelite oleku haldamise tööriist;
- leidma, kuidas mudelid tootmisse viia.
Tundub, et on vajalik vĂ€lja mĂ”elda töövoog, mis vĂ”imaldaks kergelt ja mugavalt hallata seda elutsĂŒklit? Sellel praktikatel on nimi MLOps.
MLOps, ehk DevOps masinĂ”ppe jaoks, vĂ”imaldab andmete töötlemise ja analĂŒĂŒsi spetsialistide ning IT-ekspertide meeskondadel koostööd teha ning kiirendada mudelite arendamist ja juurutamist, kasutades jĂ€lgimist, kontrolli ja haldussĂŒsteemi masinĂ”ppe mudelite jaoks.
Saate , mida sellest arvavad Google'i kutid. Artiklist on selge, et MLOps on ĂŒsna mahukas teema.

Edasi oma artiklis kirjeldan vaid osa protsessist. Rakendamiseks kasutan tööriista MLflow, kuna see on avatud lÀhtekoodiga projekt, mis vajab liitmiseks vaid vÀikest koodijuppi ning sellel on integraatsioon populaarsete ML-raamistikega. Te vÔite internetist otsida ka teisi tööriistu, nÀiteks Kubeflow, SageMaker, Trains jms, ja vÔib-olla leiate selle, mis sobib teie vajadustele paremini.
"Ehitatud" MLOps tööriista MLFlow kasutamise nÀitel
MLFlow on avatud lĂ€htekoodiga platvorm ML mudelite elu tsĂŒkli haldamiseks ().
MLflow sisaldab nelja komponenti:
- MLflow Tracking â lahendab tulemuste ja nende saavutamiseks kasutatud parameetrite registreerimise kĂŒsimusi;
- MLflow Project â vĂ”imaldab koodi pakkida ja seda igasugusel platvormil uuesti kĂ€ivitada;
- MLflow Models â vastutab mudelite tootmisse viimise eest;
- MLflow Registry â vĂ”imaldab salvestada mudeleid ja hallata nende olekuid tsentraliseeritud hoidlas.
MLflow tegeleb kahe ĂŒksusega:
- kĂ€ivitamine â see on kogu koolitusprotsess, parameetrid ja nĂ€itajad, mida soovime registreerida;
- eksperiment â see on "teema", mille alla on koondatud kĂ€ivitused.
Kogu nĂ€ite sammust on rakendatud operatiivsel sĂŒsteemil Ubuntu 18.04.
1. KĂ€tkeme server
Selleks, et saaksime oma projekti hÔlpsalt hallata ja kogu vajaliku teabe kÀtte saada, kÀivitame serveri. MLflow jÀlgimisserveril on kaks peamist komponenti:
- backend store â vastutab registreeritud mudelite teabe talletamise eest (toetab 4 andmebaasi: mysql, mssql, sqlite ja postgresql);
- artifact store â vastutab artefaktide salvestamise eest (toetab 7 salvestusvĂ”imalust: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP-server, SFTP-server, NFS, HDFS).
Kuna artifact store lihtsuse huvides vÔtame sftp serveri.
- loome grupi
$ sudo groupadd sftpg - lisame kasutaja ja seadistame talle parooli
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp - korrapÀraselt muudame paar juurdepÀÀsu seadistust
$ sudo mkdir -p /data/mlflowsftp/upload $ sudo chown -R root.sftpg /data/mlflowsftp $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload - lisame mÔned read /etc/ssh/sshd_config
Match Group sftpg ChrootDirectory /data/%u ForceCommand internal-sftp - taaskÀivitame teenuse
$ sudo systemctl restart sshd
Kuna backend pood vÔtame 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
# Loo uus kasutaja: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Sisestage lisatava rolli nimi: mlflow_user
Sisestage uue rolli parool: mlflow
Sisestage see uuesti: mlflow
Kas uuel rollil on superkasutaja Ôigused? (y/n) n
Kas uuel rollil on lubatud andmebaase luua? (y/n) n
Kas uuel rollil on lubatud luua uusi rolle? (y/n) n
# Looge andmebaas mlflow_bd, mille omanik on mlflow_user
$ createdb -O mlflow_user mlflow_dbServeri kÀivitamiseks on vaja installida jÀrgmised python paketid (soovitan luua eraldi virtuaalne keskkond):
pip install mlflow
pip install pysftpKĂ€ivitame meie serveri
$ mlflow server
--backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db
--default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload
--host server_host
--port server_port2. Lisame jÀlgimise
Kuna meie treeningute tulemused ei kaoks, et tulevased arendajate pĂ”lvkonnad mĂ”istaksid, mis tegelikult toimus, ja vanemad kolleegid ning teie saaksite rahus analĂŒĂŒsida Ă”ppeprotsessi, on meil vaja lisada jĂ€lgimine. JĂ€lgimise all mĂ”istetakse parameetrite, mÔÔdikute, artefaktide ja iga muu lisainformatsiooni salvestamist Ă”ppe kĂ€ivitamise kohta, meie puhul serveris.
NÀiteks olen ma loonud vÀikese Kerasel, et segmenteerida kÔike, mis on . JÀlgimise lisamiseks olen ma loonud faili mlflow_training.py.
Siin on read, kus toimub kÔige huvitavam:
def run(self, epochs, lr, experiment_name):
# saame eksperimendi id, luues eksperimendi, kui seda pole
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# loome "run" ja saame tema id
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# nÀitame, et tahame tulemusi salvestada kaugserverisse
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 vĂ€ike mĂ€his metodite ĂŒle mlflow.tracking. MlflowClient (tegin mugavuse huvides), mille abil loon katse ja kĂ€ivitamise serveris. Edasi mÀÀran, kuhu tulemused peaksid suunama (mlflow.set_tracking_uri(self.tracking_uri)). Ăhendame automaatse logimise mlflow.keras.autolog(). Praegu toetab MLflow Tracking automaatset logimist TensorFlow, Keras, Gluon XGBoost, LightGBM ja Spark raamistike jaoks. Kui te ei leidnud oma raamistike vĂ”i teekide seast, siis vĂ”ite alati logida kaudsetena. KĂ€ivitame koolituse. Registreerime sildid ja sisendparameetrid eemalserveris.
MÔne rea ja te olete, nagu kÔik teisedki, saanud ligipÀÀsu kogu kÀivituste teabele. Lahe, eks?
3. Kujunda projekt
NĂŒĂŒd muudame nii, et projekti kĂ€ivitamine oleks vĂ”imalikult lihtne. Selleks lisame projekti juurese MLproject faili ja conda.yaml.
MLproject
name: flow_segmentation
conda_env: conda.yaml
entry_points:
main:
parameters:
categories: {help: 'coco andmebaasi kategooriate nimekiri'}
epochs: {type: int, help: 'koolituse epohhide arv'}
lr: {type: float, default: 0.001, help: 'ÔppimismÀÀr'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'nÀiteks resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'serveri aadress'}
experiment_name: {type: str, default: 'My_experiment', help: 'kaug- ja kohalik katse nimi'}
command: "python mlflow_training.py
--epochs={epochs}
--categories={categories}
--lr={lr}
--tracking_uri={tracking_uri}
--model_name={model_name}
--backbone_name={backbone_name}
--batch_size={batch_size}
--experiment_name={experiment_name}"MLflow Projectil on mitu omadust:
- Name â teie projekti nimi;
- Environment â minu puhul osutab conda_env sellele, et kĂ€ivitamiseks kasutatakse Anacondat ja sĂ”ltuvuste kirjeldus asub failis conda.yaml;
- Entry Points â nĂ€itab, millis(e) fail(i) ja milliste parameetritega saame kĂ€ivitada (kĂ”ik koolituse kĂ€ivitamise parameetrid logitakse automaatselt)
conda.yaml
name: flow_segmentation
channels:
- defaults
- anaconda
dependencies:
- python==3.7
- pip:
- mlflow==1.8.0
- pysftp==0.2.9
- Cython==0.29.19
- numpy==1.18.4
- pycocotools==2.0.0
- requests==2.23.0
- matplotlib==3.2.1
- segmentation-models==1.0.1
- Keras==2.3.1
- imgaug==0.4.0
- tqdm==4.46.0
- tensorflow-gpu==1.14.0KÀivituskeskkonnana vÔite kasutada dockerit, lisateabe saamiseks pöörduge .
4. Alustame koolitamist
Kloonime projekti ja liigutame projektikausta:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/Ăhenduse loomiseks peate installima raamatukogud
pip install mlflow
pip install pysftpKuna ma kasutan nÀites conda_env, peab teie arvutis olema installitud Anaconda (kuid seda saab mööda hiilida, installides kÔik vajalikud paketid kÀsitsi ja mÀngides kÀivitamisparameetritega).
KÔik ettevalmistavad sammud on lÔppenud ja saame alustada koolitamise kÀivitamist. Projekti juurest:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .KÀskude sisestamise jÀrel luuakse automaatselt conda keskkond ja koolitus algab.
Ălaltoodud nĂ€ites edastasin koolituse epohhide arvu, kategooriad, milleks tahame segmenteerida (tĂ€ieliku nimekirja saab vaadata ) ja meie kaugserveri aadress.
Kogu vÔimalike parameetrite loendi leiate failist MLproject.
5. Hindame koolituse tulemusi
Koolituse lÔppedes saame brauseris minna meie serveri aadressile

Siin nĂ€eme kĂ”igi katsetuste nimekirja (vasakul ĂŒlal), samuti teavet kĂ€ivituste kohta (keskel). Saame vaadata pĂ”hjalikumat teavet (parameetrid, mÔÔdikud, artefaktid ja mĂ”ningane lisainfo) iga kĂ€ivituse kohta.

Iga mÔÔdiku kohta saame jÀlgida muutuste ajalugu

See tĂ€hendab, et praegu saame tulemusi analĂŒĂŒsida 'kĂ€sitsi' reĆŸiimis, samuti saate seadistada automaatset valideerimist MLflow API abil.
6. Registreerime mudeli
PĂ€rast seda, kui oleme oma mudelit analĂŒĂŒsinud ja otsustanud, et see on lahinguks valmis, alustame selle registreerimist, valides vajaliku kĂ€ivituse (nagu on nĂ€idatud eelmises punktis) ja liigume alla.

PĂ€rast oma mudeli nime mÀÀramist on sellel nĂŒĂŒd versioon. Kui salvestada teine mudel sama nimega, tĂ”useb versioon automaatselt.

Iga mudeli jaoks saame lisada kirjelduse ja valida ĂŒhe kolmest olekust (Staging, Production, Archived). Hiljem saame nende olekudega API kaudu töötada, mis koos versioonihaldusega pakub lisafleksibiilsust.

Meil on mugav juurdepÀÀs kÔigile mudelitele

ja nende versioonidele

Nagu eelnevas punktis, saab kÔik toimingud teostada API abil.
7. Deployed model
Selles etapis on meil juba treenitud (keras) mudel. NĂ€ide, kuidas seda kasutada:
class SegmentationModel:
def __init__(self, tracking_uri, model_name):
self.registry = RemoteRegistry(tracking_uri=tracking_uri)
self.model_name = model_name
self.model = self.build_model(model_name)
def get_latest_model(self, model_name):
registered_models = self.registry.get_registered_model(model_name)
last_model = self.registry.get_last_model(registered_models)
local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
return local_path
def build_model(self, model_name):
local_path = self.get_latest_model(model_name)
return mlflow.keras.load_model(local_path)
def predict(self, image):
image = self.preprocess(image)
result = self.model.predict(image)
return self.postprocess(result)
def preprocess(self, image):
image = cv2.resize(image, (256, 256))
image = image / 255.
image = np.expand_dims(image, 0)
return image
def postprocess(self, result):
return resultSiin on self.registry taas vĂ€ike ĂŒmberpakkimine ĂŒle mlflow.tracking.MlflowClient, et see oleks mugavam. Idee on selles, et ma pöördun kaugserveri poole ja otsin sealt mudelit, mille nimi on antud, nimelt viimast tootmisversiooni. SeejĂ€rel laadin artefaktu kohalikult kausta ./model ja kogun mudeli sellest kaustast mlflow.keras.load_model(local_path). NĂŒĂŒd saame kasutada meie mudelit. CV (ML) arendajad saavad rahulikult tegeleda mudeli tĂ€iustamisega ja avaldada uusi versioone.
KokkuvÔtteks
Olen vĂ€lja töötanud sĂŒsteemi, mis vĂ”imaldab:
- tsentraliseeritult hoida teavet ML mudelite, koolituse edenemise ja tulemuste kohta;
- kiirelt arendada arenduskeskkonda;
- jĂ€lgida ja analĂŒĂŒsida mudelite töö edenemist;
- mugavalt teha versioonihaldust ja hallata mudelite seisundeid;
- lihtsalt juurutada saadud mudeleid.
See nĂ€ide on mĂ€nguline ja teenib lĂ€htepunktina teie enda sĂŒsteemi ĂŒlesehitamiseks, mis vĂ”ib hĂ”lmata automaatset tulemuste hindamist ja mudelite registreerimist (vt 5 ja 6) vĂ”i te lisate andmestike versioonimise vĂ”i veel midagi muud? Ma pĂŒĂŒdsin edastada mĂ”tte, et teil on vaja MLOpsi tervikuna, MLflow on vaid vahend eesmĂ€rgi saavutamiseks.
Milliseid probleeme, millega te silmitsi seisate, ma ei kÀsitlenud?
Mida lisaksite sĂŒsteemi, et see kataks teie vajadused?
Milliseid tööriistu ja lÀhenemisviise kasutate, et lahendada kÔik vÔi osa probleemidest?
P.S. JĂ€tan paar ë§íŹ:
Github projekt â
MLflow â
Minu töö e-post, kĂŒsimuste jaoks â ikryakin@croc.ru
Meie firmas toimub perioodiliselt erinevaid ĂŒritusi IT-specialistidele, nĂ€iteks: 8. juulil kell 19:00 MSK toimub online CV-ĂŒritus, kui huvi on, vĂ”ite osaleda, registreerimine .
Allikas: habr.com
