
Përshëndetje të gjithë! Unë jam zhvillues CV në KROK. Për tre vjet ne kemi realizuar projekte në fushën e CV. Gjatë kësaj kohe, kemi bërë shumë gjëra, për shembull: kemi monitoruar shoferët për të siguruar që gjatë vozitjes ata të mos pinë, të mos tymosin, të mos flasin me telefon, të shikojnë rrugën dhe jo ëndrrat apo re; kemi regjistruar ata që pëlqejnë të vozisin në pista të rezervuara dhe të zënë disa vende në parkim; kemi mbikëqyrur që punonjësit të mbajnë helmeta, doreza e kështu me radhë; kemi identifikuar punonjësin që dëshiron të hyjë në objekt; kemi numëruar gjithçka që është e mundur.
ĂfarĂ« po them unĂ« me tĂ« gjitha kĂ«to?
Në procesin e realizimit të projekteve kemi pasur shumë sfida, shumë sfida, disa nga problemet mund t'i njihni, ose do t'i njihni në të ardhmen.
Le të modelojmë një situatë
Le të imagjinojmë se kemi punësuar në një kompani të re "N", e cila merret me ML. Po punojmë në një projekt ML (DL, CV), pastaj për disa arsye kalojmë në një punë tjetër, në thelb bëjmë një pushim, dhe kthehemi përsëri në rrjetin tonë ose të dikujt tjetër.
- Arrin momenti i së vërtetës, duhet ndonjëherë të kujtojmë se ku ndaluam, cilat hiperpamje provuam dhe, më e rëndësishmja, në cilat rezultate përfunduan ato. Mund të ketë shumë variante, se si ruajti informacionin mbi të gjithë ekzekutimet: në kokë, në konfigurime, në një shënim, në hapësirën punuese në cloud. Më ka ndodhur të shoh një variant ku hiperpamjet ruheshin si rreshta të komentuar në kod, në thelb një fluturim imagjinata. Tani imagjinoni se keni kthyer jo në projektin tuaj, por në projektin e dikujt që e la kompaninë dhe trashëgoi kodin dhe modelin me emrin model_1.pb. Për të kompletuar pamjen dhe për të përcjellë gjithë dhimbjen, le të themi se ju jeni gjithashtu një specialist fillestar.
- Të shkojmë më tej. Për të nisur kodin, ne dhe të gjithë ata që do të punojnë me të duhet të krijojmë një mjedis. Shpesh ndodh që edhe mjedisi nuk na është lënë për ndonjë arsye. Kjo gjithashtu mund të bëhet një detyrë jo triviale. Nuk dëshirojmë të shpenzojmë kohë në këtë hap, apo jo?
- Ne kemi trajnuar modelin (p.sh., detektorin e makinave). ArrijmĂ« nĂ« momentin kur ai Ă«shtĂ« bĂ«rĂ« mjaft i mirĂ« â koha po e ruajmĂ« rezultatin. Ta quajmĂ« car_detection_v1.pb. MĂ« pas trajnojmĂ« njĂ« tjetĂ«r â car_detection_v2.pb. Pas njĂ« kohe, kolegĂ«t tanĂ« ose ne vetĂ« trajnojmĂ« gjithashtu dhe mĂ« shumĂ«, duke pĂ«rdorur arkitektura tĂ« ndryshme. NĂ« fund formohet njĂ« grumbull artefaktĂ«sh, informacionin pĂ«r tĂ« cilĂ«t duhet ta mbledhim me kujdes (por, do ta bĂ«jmĂ« kĂ«tĂ« mĂ« vonĂ«, pasi kemi punĂ« mĂ« prioritare).
- E, ja dhe gjithçka! Ne kemi modelin! Mund të fillojmë trajnimet e modelit tjetër, të zhvillojmë arkitekturën për të zgjidhur një detyrë të re, apo mund të shkojmë për një çaj? Kush do ta bëjë deploy-in?
Identifikimi i problemeve
Puna mbi njĂ« projekt ose produkt Ă«shtĂ« aktivitete e shumĂ« njerĂ«zve. Me kalimin e kohĂ«s, njerĂ«zit largohen dhe vijnĂ«, projektet bĂ«hen mĂ« tĂ« shumta, vetĂ« projektet bĂ«hen mĂ« tĂ« komplikuara. KĂ«shtu ose ndryshe, situatat nga cikli i pĂ«rshkruar mĂ« sipĂ«r (dhe jo vetĂ«m) do tĂ« shfaqen nĂ« kombinime tĂ« ndryshme nga iteracioni nĂ« iteracion. E gjithĂ« kjo rezulton nĂ« humbje kohe, konfuzione, stres, ndoshta â pakĂ«naqĂ«si nga klienti, dhe nĂ« fund â humbje financiare. NdĂ«rsa tĂ« gjithĂ« ne zakonisht e kalojmĂ« tek tĂ« njĂ«jtat problematika, mendoj se askush nuk dĂ«shiron ta pĂ«rjetojĂ« pĂ«rsĂ«ri kĂ«tĂ« çdo herĂ«.

Pra, ne kaluam një cikël zhvillimi dhe shohim që ka probleme që duhen zgjidhur. Për këtë nevojitet:
- të ruajmë rezultatet e punës lehtësisht;
- të bëjmë të thjeshtë procesin e angazhimit të punonjësve të rinj;
- të thjeshtohet procesi i vendosjes së mjedisit të zhvillimit;
- të konfigurohet procesi i versionimit të modeleve;
- të kemi një mënyrë të lehtë për validimin e modeleve;
- të gjejmë një instrument për menaxhimin e gjendjes së modeleve;
- të gjejmë një mënyrë për të dërguar modelet në production.
Duket se është e nevojshme të nevojitet një workflow që të lejojë menaxhimin lehtësisht dhe rehatshëm të këtij cikli jetësor? Kësaj praktike i është dhënë emri MLOps.
MLOps, ose DevOps pĂ«r mĂ«simin e makinerive, lejon qĂ« ekipet e specialistĂ«ve nĂ« pĂ«rpunimin dhe analizĂ«n e tĂ« dhĂ«nave dhe profesionistĂ«ve IT tĂ« wspĂłĆprzxojĂ«, si dhe tĂ« rrisin ritmin e zhvillimit dhe shpĂ«rndarjes sĂ« modeleve pĂ«rmes monitorimit, verifikimit dhe sistemit tĂ« menaxhimit pĂ«r modelet e mĂ«simit tĂ« makinerive.
Mund të , çfarë mendojnë djemtë nga Google. Nga artikulli, është e qartë se MLOps është një gjë mjaft e gjerë.

Më poshtë në artikullin tim do të përshkruaj vetëm një pjesë të procesit. Për realizimin do të përdor mjetin MLflow, pasi është një projekt me kod të hapur, që kërkon një sasi të vogël kodi për tu lidhur dhe ka integrim me framework-e të njohura ML. Mund të kërkoni në hapësirën e internetit mjete të tjera, si Kubeflow, SageMaker, Trains etj., dhe ndoshta të zgjidhni atë që i përshtatet më mirë nevojave tuaja.
"Ndërtojmë" MLOps duke ilustruar përdorimin e mjetit MLFlow
MLFlow është një platformë me kod të hapur për menaxhimin e ciklit të jetës së modeleve ML ().
MLflow përfshin katër komponentë:
- MLflow Tracking â trajton çështjet e regjistrimit tĂ« rezultateve dhe parametrave qĂ« çuan nĂ« kĂ«to rezultate;
- MLflow Project â lejon paketimin e kodit dhe riprodhimin e tij nĂ« çdo platformĂ«;
- MLflow Models â Ă«shtĂ« pĂ«rgjegjĂ«s pĂ«r deploy-in e modeleve nĂ« prodhim;
- MLflow Registry â lejon ruajtjen e modeleve dhe menaxhimin e gjendjes sĂ« tyre nĂ« njĂ« depo tĂ« centralizuar.
MLflow operon me dy entitete:
- njĂ« ekzekutim â Ă«shtĂ« cikli i plotĂ« i trajnimit, parametrat dhe metrikat qĂ« duam tĂ« regjistrojmĂ«;
- eksperimenti â Ă«shtĂ« âtematâ qĂ« mbledh ekzekutime.
Të gjitha hapat e shembullit janë realizuar në sistemin operativ Ubuntu 18.04.
1. Ndërtojmë serverin
Për t'u menaxhuar lehtë projektin tonë dhe për të marrë gjithë informacionin e nevojshëm, do të ndërtojmë serverin. Serveri i ndjekjes MLflow ka dy komponente kryesore:
- backend store â pĂ«rgjegjĂ«s pĂ«r ruajtjen e informacionit rreth modeleve tĂ« regjistruara (mbĂ«shtet 4 DB: mysql, mssql, sqlite, dhe postgresql);
- artifact store â pĂ«rgjegjĂ«s pĂ«r ruajtjen e artefakteve (mbĂ«shtet 7 mĂ«nyra ruajtjeje: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP Server, NFS, HDFS).
Në cilësinë e artifact store për thjeshtësi, do të marrim një server sftp.
- krijojmë një grup
$ sudo groupadd sftpg - shtojmë një përdorues dhe vendosim fjalëkalim për të
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp - korrigjojmë disa cilësime të aksesit
$ sudo mkdir -p /data/mlflowsftp/upload $ sudo chown -R root.sftpg /data/mlflowsftp $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload - shtojmë disa rreshta në /etc/ssh/sshd_config
Match Group sftpg ChrootDirectory /data/%u ForceCommand internal-sftp - riaktivizojmë shërbimin
$ sudo systemctl restart sshd
Në cilësinë e backend store do 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
# Krijo përdorues të ri: 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
# Krijoni databazën mlflow_bd të ndërlidhur me mlflow_user
$ createdb -O mlflow_user mlflow_dbPër të nisur serverin, është e nevojshme të instaloni paketat python të mëposhtme (këshillohet të krijoni një ambient virtual të veçantë):
pip install mlflow
pip install pysftpNisim serverin tonë
$ 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. Shto ndjekjen
Që rezultatet e trajnimeve tona të mos humbasin, dhe për t'u siguruar që brezat e ardhshëm të zhvilluesve të kuptojnë se çfarë po ndodhte, si dhe që kolegët tuaj dhe ju të mund të analizoni qetësisht procesin e mësimit, është e nevojshme të shtoni ndjekjen. Ndjekja nënkupton ruajtjen e parametrave, metrikave, artefakteve dhe çdo informacioni shtesë rreth zhvillimit të mësimit, në rastin tonë, në server.
Për shembull, kam krijuar një në Keras për segmentimin e gjithçkaje në . Për të shtuar ndjekjen, krijova skedarin mlflow_training.py.
Ja rreshtat, ku ndodhin gjërat më interesante:
def run(self, epochs, lr, experiment_name):
# marrim ID e eksperimentit, krijojmë një eksperiment në mungesë të tij
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# krijojmë një "run" dhe marrim ID e saj
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# tregoni se duam të ruajmë rezultatet në një server të largët
mlflow.set_tracking_uri(self.tracking_uri)
mlflow.set_experiment(experiment_name)
me mlflow.start_run(run_id=remote_run_id, nested=False):
mlflow.keras.autolog()
self.train_pipeline.train(lr=lr, epochs=epochs)
përpiqem:
self.log_tags_and_params(remote_run_id)
përjashto mlflow.exceptions.RestException si e:
print(e)Këtu self.remote_server është një paketë e vogël mbi metodat mlflow.tracking. MlflowClient (e kam bërë për lehtësi), me anë të të cilave krijoj një eksperiment dhe një nisje në server. Më pas, specifikoj se ku duhet të derdhen rezultatet e nisjes (mlflow.set_tracking_uri(self.tracking_uri)). Aktivizoj regjistrimin automatik mlflow.keras.autolog(). Në këtë moment, MLflow Tracking mbështet regjistrimin automatik për TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Nëse nuk e keni gjetur framework-un ose bibliotekën tuaj, mund të regjistroni shprehimisht. Nisim stërvitjen. Regjistrojmë etiketat dhe parametrat hyrës në serverin e largët.
Një përmbledhje e vogël dhe ju, ashtu si të gjithë të tjerët që dëshirojnë, keni akses në informacione rreth të gjithë nisjeve. E bukur, apo jo?
3. Formatojmë projektin
Tani do ta bëjmë që nisja e projektit të jetë më e lehtë se kurrë. Për këtë, do të shtojmë në rrënjën e projektit skedarin MLproject dhe conda.yaml.
MLproject
name: flow_segmentation
conda_env: conda.yaml
entry_points:
main:
parameters:
categories: {help: 'lista e kategorive nga dataset-i coco'}
epochs: {type: int, help: 'numri i epokave në stërvitje'}
lr: {type: float, default: 0.001, help: 'shkalla e mësimit'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'p.sh. resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'adresa e serverit'}
experiment_name: {type: str, default: 'My_experiment', help: 'emri i eksperimentit lokal dhe të largët'}
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}"Projekti MLflow ka disa pronësi:
- Name â emri i projektit tuaj;
- Environment â nĂ« rastin tim conda_env tregon se pĂ«r ekzekutimin pĂ«rdoret Anaconda dhe pĂ«rshkrimi i varĂ«sive ndodhet nĂ« skedarin conda.yaml;
- Entry Points â tregon se cilat skedarĂ« dhe me cilat parametra mund tĂ« nisim (tĂ« gjithĂ« parametrat gjatĂ« fillimit tĂ« stĂ«rvitjes regjistrohen automatikisht)
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.0Si mjedis ekzekutimi, mund të përdorni docker; për më shumë informacion, ju lutemi referojuni në .
4. Nisim stërvitjen
Klononi projektin dhe kaloni në direktorinë e projektit:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/Për të nisur, ju lutemi instaloni bibliotekat
pip install mlflow
pip install pysftpDuke në shembullin unë po përdor conda_env, në kompjuterin tuaj duhet të jetë instaluar Anaconda (por kjo gjithashtu mund të anashkalohet duke instaluar të gjitha paketat e nevojshme vetë dhe duke eksperimentuar me parametrat e nisjes).
Të gjitha hapat përgatitorë përfunduan dhe mund të fillojmë me trajnimin. Nga root-i i projektit:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .Pas futjes së komandës, automatikisht do të krijohet një ambient conda dhe do të fillojë trajnimi.
Në shembullin e mësipërm kam kaluar numrin e epokave për trajnimin, kategoritë në të cilat dëshirojmë të segmentejmë (listën e plotë mund ta shihni ) dhe adresën e serverit tonë të largët.
Listën e plotë të parametrave të mundshëm mund ta shihni në skedarin MLproject.
5. Vlerësojmë rezultatet e trajnimit
Pasi të mbarojë trajnimi, mund të shkojmë në shfletues në adresën e serverit tonë

Këtu shohim listën e të gjitha eksperimentet (majtas në krye), si dhe informacionin mbi nisjet (në mes). Mund të shohim informacion më të detajuar (parametrat, metrikat, artefaktet dhe ndonjë informacion tjetër) për secilën nisje.

Për secilën metrikë mund të vëzhgojmë historinë e ndryshimit.

Pra, aktualisht mund të analizojmë rezultatet në mënyrë "manuale", gjithashtu mund të konfiguroni një validim automatik përmes API-së MLflow.
6. Regjistrojmë modelin
Pasi analizuam modelin tonë dhe vendosëm se është gati për përdorim, ne fillojmë regjistrimin e tij, për këtë zgjidhim nisjen e duhur (siç është treguar në pikën e mëparshme) dhe shkojmë poshtë.

Pasi i dhamë emrin modelit tonë, ai merr një version. Kur ruajmë një model tjetër me të njëjtin emër, versioni automatikisht do të rritet.

Për çdo model mund të shtojmë një përshkrim dhe të zgjedhim një nga tre gjendjet (Staging, Production, Archived), më pas përmes API-së mund të aksesojmë këto gjendje, e cila së bashku me versionimin jep fleksibilitet të shtuar.

Kemi gjithashtu një qasje të lehtë në të gjitha modelet

dhe versionet e tyre.

Si në pikën e mëparshme, të gjitha operacionet mund të realizohen përmes API-së.
7. Zhvillojmë modelin
Në këtë fazë kemi një model të trajnuar (keras). Shembulli, se si mund ta përdorim:
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 resultKëtu self.registry është përsëri një mbështetje e vogël mbi mlflow.tracking.MlflowClient, për lehtësi. Thelbi është se unë po i qasem një serveri të largët dhe po kërkoj modelin me emrin e dhënë, përkatësisht, versionin më të fundit të prodhimit. Më pas shkarkoj artefaktin lokal në dosjen .\/model dhe ndërtoj modelin nga kjo drejtori mlflow.keras.load_model(local_path). Tani mund ta përdorim modelin tonë. Të zhvilluesit CV (ML) mund të vazhdojnë të përmirësojnë modelin dhe të publikojnë versione të reja.
Në përfundim
Unë kam paraqitur një sistem që lejon:
- të ruajë informacionin e centralizuar për modelet ML, ecurinë dhe rezultatet e trajnimet;
- të zhvillojë shpejt ambientin e zhvillimit;
- të ndjekë dhe analizojë ecurinë e punës mbi modelet;
- të lidhet me versionimin dhe menaxhimin e gjendjes së modeleve;
- të publikojë lehtësisht modelet e marra.
Ky shembull është një model argëtuese dhe shërben si një pikë fillese për të ndërtuar sistemin tuaj, i cili, ndoshta, do të përfshijë automatizimin e vlerësimit të rezultateve dhe regjistrimin e modeleve (p.5 dhe p.6 përkatësisht) ose do të shtoni versionimin e datasetëve, ose ndoshta diçka tjetër? Po përpiqesha të përcillja mendimin se ju nevojitet MLOps në përgjithësi, MLflow është thjesht një mjet për të arritur qëllimin.
Na njoftoni për problemet që keni hasur, të cilat nuk i kam përshkruar?
ĂfarĂ« do tĂ« shtonit nĂ« sistem pĂ«r ta bĂ«rĂ« atĂ« tĂ« plotĂ«sojĂ« nevojat tuaja?
Cilat mjete dhe qasje përdorni për të zgjidhur të gjitha ose disa nga problemet?
P.S. Do të lë disa lidhje:
projekti github â
MLflow â
Adresa ime e punĂ«s pĂ«r pyetje â ikryakin@croc.ru
Në kompaninë tonë herë pas here organizohen ngjarje të ndryshme për specialistët IT, për shembull: më 8 korrik në orën 19:00 sipas MSK do të mbahet një mitap për CV në format online, nëse jeni të interesuar, mund të merrni pjesë, regjistrimi. .
Burimi: habr.com
