
Sveiki visiem! Es esmu CV izstrÄdÄtÄjs uzÅÄmumÄ KROK. Jau trÄ«s gadus mÄs Ä«stenojam projektus CV jomÄ. Å ajÄ laikÄ mÄs esam paveikuÅ”i daudz, piemÄram: uzraudzÄ«jÄm autovadÄ«tÄjus, lai ceļojuma laikÄ viÅi nedzertu, nesmÄÄ·Ätu, nerunÄtu pa telefonu, skatÄ«tos uz ceļu, nevis sapÅos vai mÄkoÅos; reÄ£istrÄjÄm tos, kuri mÄ«l braukt pa atseviŔķÄm joslÄm un ieÅemt vairÄkas stÄvvietas; kontrolÄjÄm, lai darbinieki valkÄtu Ä·iveres, cimdus utt.; identificÄjÄm darbinieku, kurÅ” vÄlas iekļūt objektÄ; saskaitÄ«jÄm visu, ko vien varÄja.
KÄpÄc es par to runÄju?
Projektu realizÄcijas procesÄ mÄs esam saskÄruÅ”ies ar grÅ«tÄ«bÄm, daudzÄm grÅ«tÄ«bÄm, ar daļu no problÄmÄm jÅ«s varat bÅ«t pazÄ«stami vai arÄ« iepazÄ«sieties nÄkotnÄ.
ModelÄsim situÄciju
IedomÄsimies, ka mÄs esam sÄkuÅ”i strÄdÄt jaunÄ uzÅÄmumÄ āNā, kura darbÄ«ba saistÄ«ta ar ML. MÄs strÄdÄjam pie ML (DL, CV) projekta, pÄc tam kÄdu iemeslu dÄļ mÄs pÄrslÄdzam uzmanÄ«bu uz citu darbu, kopumÄ veicam pÄrtraukumu un atgriežamies pie savas vai citas neironu sistÄmas.
- NÄk brÄ«dis patiesÄ«bai, ir jÄatceras, pie kÄ tu esi apstÄjies, kÄdus hiperparametrus esi izmÄÄ£inÄjis un, pats galvenais, kÄdi rezultÄti tie ir devuÅ”i. Var bÅ«t daudz variantu, kÄ cilvÄki ir glabÄjuÅ”i informÄciju par visiem palaiÅ”anas darbiem: galvÄ, konfigurÄcijÄs, piezÄ«mju grÄmatiÅÄ, darba vidÄ mÄkoÅos. Man ir bijusi iespÄja redzÄt variantu, kad hiperparametri tika glabÄti kÄ komentÄtas rindas kodÄ, vispÄr - radoÅ”uma lidojums. Un tagad iedomÄjieties, ka jÅ«s atgriezÄties nevis pie sava projekta, bet pie cilvÄka projekta, kurÅ” pameta uzÅÄmumu, un jums mantojuma veidÄ palika kods un modelis ar nosaukumu model_1.pb. Lai pilnÄ«bÄ izprastu situÄciju un nodotu visas cieÅ”anas, iedomÄsimies, ka esat arÄ« sÄkuma lÄ«meÅa speciÄlists.
- TurpinÄsim. Lai palaistu kodu, mums un visiem, kas ar to strÄdÄs, ir nepiecieÅ”ams izveidot vidi. Bieži vien izrÄdÄs, ka Ŕī vide mums arÄ« par kÄdiem iemesliem nav atstÄta. Tas arÄ« var bÅ«t ne vienkÄrÅ”s uzdevums. Å im solim negribas tÄrÄt laiku, vai ne?
- MÄs apmÄcÄm modeli (piemÄram, automaŔīnu detektoru). NonÄkam lÄ«dz brÄ«dim, kad tas ir diezgan labs ā ir Ä«stais laiks saglabÄt rezultÄtu. Nosauksim to par car_detection_v1.pb. PÄc tam apmÄcÄm vÄl vienu ā car_detection_v2.pb. PÄc kÄdÄ laika mÅ«su kolÄÄ£i vai mÄs paÅ”i apmÄcam vÄl un vÄl, izmantojot dažÄdas arhitektÅ«ras. Galu galÄ veidojas kaudze artefaktu, kuru informÄciju jÄkrÄj (bet to darÄ«sim vÄlÄk, jo mums ir prioritÄrÄki darbi).
- Nu, lÅ«k, viss ir gatavs! Mums ir modelis! MÄs varam sÄkt nÄkamÄ modeļa apmÄcÄ«bu, izstrÄdÄt arhitektÅ«ru jaunai uzdevuma risinÄÅ”anai vai varbÅ«t doties dzert tÄju? Bet kurÅ” veiks izvietoÅ”anu?
IdentificÄjam problÄmas
Darbs pie projekta vai produkta ir daudzu cilvÄku darbs. Laika gaitÄ cilvÄki nÄk un iet, projektu paliek arvien vairÄk, paÅ”i projekti kļūst sarežģītÄki. TÄ vai citÄdi situÄcijas no iepriekÅ” minÄtÄ cikla (un ne tikai) dažÄdÄs kombinÄcijÄs atkÄrtosies katrÄ iterÄcijÄ. Viss tas noved pie laika zuduma, neskaidrÄ«bÄm, nervu spriedzes, iespÄjams ā klienta neapmierinÄtÄ«bas un, galu galÄ ā pie zaudÄtiem ienÄkumiem. Lai arÄ« mÄs parasti staigÄjam pa vecÄm grÄbļiem, tomÄr neviens nevÄlas atkal un atkal pÄrdzÄ«vot Å”os brīžus.

TÄtad, mÄs esam izgÄjuÅ”i cauri vienam izstrÄdes ciklam un redzam, ka ir problÄmas, kuras jÄrisina. Lai to izdarÄ«tu, ir nepiecieÅ”ams:
- Ärti glabÄt darba rezultÄtus;
- padarīt darbinieku iesaisti vieglu;
- vienkÄrÅ”ot izstrÄdes vides izvietoÅ”anas procesu;
- iestatÄ«t modeļu versiju pÄrvaldÄ«bas procesu;
- iegÅ«t Ärtu veidu modeļu validÄÅ”anai;
- atrast instrumentu modeļu stÄvokļa pÄrvaldÄ«bai;
- atrast veidu, kÄ piegÄdÄt modeļus ražoÅ”anÄ.
AcÄ«mredzot ir jÄizdomÄ darba plÅ«sma, kas ļautu viegli un Ärti pÄrvaldÄ«t Å”o dzÄ«ves ciklu? Å ai praksei ir nosaukums MLOps.
MLOps, vai DevOps maŔīnmÄcÄ«bai, ļauj datu apstrÄdes un analÄ«zes speciÄlistu un IT speciÄlistu komandÄm sadarboties, kÄ arÄ« paÄtrinÄt modeļu izstrÄdes un izvietoÅ”anas tempu, izmantojot uzraudzÄ«bas, pÄrbaudes un vadÄ«bas sistÄmu maŔīnmÄcÄ«bas modeļiem.
JÅ«s varat , ko par to domÄ puiÅ”i no Google. No raksta skaidrs, ka MLOps ir diezgan plaÅ”a tÄma.

TÄlÄk savÄ rakstÄ aprakstīŔu tikai daļu no procesa. RealizÄcijai es izmantoÅ”u rÄ«ku MLflow, jo tas ir open-source projekts, tÄpÄc, lai to pieslÄgtu, nepiecieÅ”ams neliels kods un ir integrÄcija ar populÄriem ML ietvariem. JÅ«s varat meklÄt citus rÄ«kus internetÄ, piemÄram, Kubeflow, SageMaker, Trains utt., un, iespÄjams, atrast to, kas vislabÄk atbilst jÅ«su vajadzÄ«bÄm.
"Veidojam" MLOps piemÄra izmantoÅ”anÄ rÄ«ka MLFlow.
MLFlow ā tas ir atvÄrtÄ koda platforma maŔīnmÄcīŔanÄs modeļu dzÄ«ves cikla pÄrvaldÄ«bai ().
MLflow ietver Äetrus komponentus:
- MLflow Tracking ā risina jautÄjumus par rezultÄtu un parametru fiksÄÅ”anu, kas noveda pie Å”iem rezultÄtiem;
- MLflow Project ā ļauj iepakot kodu un atkÄrtoti to izmantot jebkurÄ platformÄ;
- MLflow Models ā atbild par modeļu izvietoÅ”anu ražoÅ”anÄ;
- MLflow Registry ā ļauj glabÄt modeļus un pÄrvaldÄ«t to stÄvokli centralizÄtÄ krÄtuvÄ.
MLflow strÄdÄ ar divÄm entÄ«tÄm:
- skrÄjiens ā tas ir pilns mÄcÄ«bu cikls, parametri un metrikas, kuras mÄs vÄlamies reÄ£istrÄt;
- eksperiments ā tÄ ir ātematikaā, kas apvieno skrÄjienus.
Visi piemÄra soļi ir Ä«stenoti operÄtÄjsistÄmÄ Ubuntu 18.04.
1. Uzliekam serveri.
Lai mÄs varÄtu viegli pÄrvaldÄ«t mÅ«su projektu un saÅemt visu nepiecieÅ”amo informÄciju, uzliksim serveri. MLflow tracking serverim ir divi galvenie komponenti:
- backend store ā atbild par reÄ£istrÄto modeļu informÄcijas glabÄÅ”anu (atbalsta 4 DBMS: mysql, mssql, sqlite un postgresql);
- artifact store ā atbild par ar teiktajiem artefaktiem (atbalsta 7 glabÄÅ”anas varianti: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP serveris, SFTP serveris, NFS, HDFS).
KÄ artifact store vienkÄrŔības labad Åemsim sftp serveri.
- izveidojam grupu
$ sudo groupadd sftpg - pievienojam lietotÄju un uzstÄdÄm viÅam paroli
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp - pielÄgojam pÄris piekļuves iestatÄ«jumus
$ sudo mkdir -p /data/mlflowsftp/upload $ sudo chown -R root.sftpg /data/mlflowsftp $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload - pievienojam dažas rindas failÄ /etc/ssh/sshd_config
Match Group sftpg ChrootDirectory /data/%u ForceCommand internal-sftp - pÄrstartÄjam pakalpojumu
$ sudo systemctl restart sshd
KÄ backend store Åemam 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
# Izveido jaunu lietotÄju: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Ievadiet lomu nosaukumu, ko pievienot: mlflow_user
Ievadiet paroli jaunajai lomai: mlflow
Ievadiet to vÄlreiz: mlflow
Vai jaunajai lomai jÄbÅ«t superlietotÄjam? (y/n) n
Vai jaunajai lomai jÄļauj izveidot datu bÄzes? (y/n) n
Vai jaunajai lomai jÄļauj izveidot nÄkamÄs jaunÄs lomas? (y/n) n
# Izveidojam datu bÄzi mlflow_bd, kas pieder mlflow_user
$ createdb -O mlflow_user mlflow_dbLai uzsÄktu serveri, nepiecieÅ”ams instalÄt Å”Ädus Python paketus (iesaku izveidot atseviŔķu virtuÄlo vidi):
pip install mlflow
pip install pysftpUzsÄkam mÅ«su 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. Pievienojam sekoŔanu
Lai nodroÅ”inÄtu, ka mÅ«su apmÄcÄ«bu rezultÄti netiek zaudÄti, nÄkamajÄm izstrÄdÄtÄju paaudzÄm saprastu, kas vispÄr notika, un vecÄkie kolÄÄ£i un jÅ«s varÄtu mierÄ«gi analizÄt mÄcÄ«bu procesu, mums ir nepiecieÅ”ams pievienot sekoÅ”anu. SekoÅ”ana nozÄ«mÄ parametru, metrikas, artefaktu un jebkÄdas papildu informÄcijas par mÄcÄ«bu uzsÄkÅ”anu saglabÄÅ”anu, mÅ«su gadÄ«jumÄ, serverÄ«.
PiemÄram, es izveidoju nelielu uz Keras visam, kas ir pieejams . Lai pievienotu sekoÅ”anu, es izveidoju failu mlflow_training.py.
Å eit ir rindiÅas, kurÄs notiek viss interesantais:
def run(self, epochs, lr, experiment_name):
# iegÅ«stam eksperimenta id, izveidojam eksperimentu tÄ neesamÄ«bas gadÄ«jumÄ
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# izveidojam "run" un iegÅ«stam tÄ id
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# norÄdÄm, ka vÄlamies rezultÄtus saglabÄt attÄlinÄtajÄ 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)Å eit self.remote_server ir neliela saite uz mlflow.tracking metodes MlflowClient (es to izveidoju ÄrtÄ«bai), ar kurÄm es izveidoju eksperimentu un palaiÅ”anu serverÄ«. TÄlÄk es norÄdu, kur jÄiesniedz palaiÅ”anas rezultÄti (mlflow.set_tracking_uri(self.tracking_uri)). Pievienoju automÄtisko mlflow.keras.autologÄÅ”anu. Å obrÄ«d MLflow Tracking atbalsta automÄtisko logu veidoÅ”anu Å”Ädiem rÄ«kiem: TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ja jÅ«s neatradÄt savu ietvaru vai bibliotÄku, jÅ«s vienmÄr varat logu reÄ£istrÄt manuÄli. SÄksim apmÄcÄ«bu. ReÄ£istrÄjam tagus un ieejas parametrus attÄlinÄtajÄ serverÄ«.
Dažas rindas, un jums, tÄpat kÄ visiem interesentiem, ir piekļuve visai informÄcijai par visiem palaiÅ”anas procesiem. Ai, forÅ”i?
3. Projekta izveide
Tagad padarÄ«sim tÄ, lai projekta palaiÅ”ana bÅ«tu vienkÄrÅ”a. Å im nolÅ«kam pievienosim MLproject un conda.yaml failus projekts saknÄ.
MLproject
name: flow_segmentation
conda_env: conda.yaml
entry_points:
main:
parameters:
categories: {help: 'kategoriju saraksts no coco datu kopas'}
epochs: {type: int, help: 'apmÄcÄ«bas epoch skaits'}
lr: {type: float, default: 0.001, help: 'mÄcÄ«bu Ätrums'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'piemÄrs: resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'servera adrese'}
experiment_name: {type: str, default: 'My_experiment', help: 'attÄlinÄtÄ un vietÄjÄ eksperimenta nosaukums'}
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 projekts ir ar vairÄkÄm Ä«paŔībÄm:
- Name ā jÅ«su projekta nosaukums;
- Environment ā manÄ gadÄ«jumÄ conda_env norÄda, ka palaiÅ”anai tiek izmantota Anaconda, un atkarÄ«bas apraksts atrodas conda.yaml failÄ;
- Entry Points ā norÄdÄ«ts, kÄdus failus un ar kÄdiem parametriem mÄs varam palaist (visi parametri apmÄcÄ«bas laikÄ automÄtiski tiek logÄti)
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Ä izpildes vidi jÅ«s varat izmantot docker, par sÄ«kÄku informÄciju skatieties .
4. UzsÄkam apmÄcÄ«bu
KlonÄjam projektu un pÄrejam uz projekta direktoriju:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/Lai palaiÅ”anas process darbotos, jums ir jÄsagatavo bibliotÄkas
pip install mlflow
pip install pysftpTÄ kÄ piemÄrÄ es izmantoju conda_env, jÅ«su datorÄ ir jÄbÅ«t uzstÄdÄ«tai Anaconda (taÄu to var apiet, pats uzstÄdot visus nepiecieÅ”amos pakotnes un nedaudz pielÄgojot palaiÅ”anas parametrus).
Visas sagatavoÅ”anÄs darbÄ«bas ir pabeigtas, un mÄs varam sÄkt apmÄcÄ«bu. No projekta saknes:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .PÄc komandas ievadīŔanas automÄtiski tiks izveidots conda vide un uzsÄksies apmÄcÄ«ba.
IepriekÅ”ÄjÄ piemÄrÄ es norÄdÄ«ju apmÄcÄ«bu epoch skaitu, kategorijas, uz kurÄm mÄs vÄlamies segmentÄt (pilnu sarakstu var skatÄ«t ) un mÅ«su attÄlinÄtÄ servera adresi.
Pilnu iespÄjamo parametru sarakstu var apskatÄ«t MLproject failÄ.
5. NovÄrtÄjam apmÄcÄ«bas rezultÄtus
PÄc apmÄcÄ«bas beigÄm mÄs varam pÄriet pÄrlÅ«kÄ uz mÅ«su servera adresi

Å eit mÄs redzam visu eksperimentu sarakstu (pa kreisi augÅ”ÄjÄ stÅ«rÄ«), kÄ arÄ« informÄciju par palaiÅ”anÄm (vidÅ«). MÄs varam skatÄ«t detalizÄtÄku informÄciju (parametri, metriÄ·i, artefakti un kÄda papildu informÄcija) par katru palaiÅ”anu.

Par katru metriÄ·i mÄs varam novÄrot mainÄ«go vÄsturi.

TÄtad Å”obrÄ«d mÄs varam analizÄt rezultÄtus "roku" režīmÄ, arÄ« jÅ«s varat konfigurÄt automÄtisko validÄciju, izmantojot MLflow API.
6. ReÄ£istrÄjam modeli
PÄc tam, kad mÄs esam analizÄjuÅ”i mÅ«su modeli un nolÄmuÅ”i, ka tas ir gatavs, mÄs reÄ£istrÄjam to, izvÄloties nepiecieÅ”amo palaiÅ”anu (kÄ parÄdÄ«ts iepriekÅ”ÄjÄ punktÄ) un dodamies lejup.

PÄc tam, kad mÄs esam devuÅ”i savai modelim nosaukumu, tas iegÅ«st versiju. SaglabÄjot citu modeli ar to paÅ”u nosaukumu, versija automÄtiski paaugstinÄs.

Katram modelim mÄs varam pievienot aprakstu un izvÄlÄties vienu no trim stÄvokļiem (Staging, Production, Archived), turpmÄk mÄs varam piekļūt Å”iem stÄvokļiem, izmantojot API, kas kopÄ ar versiju pÄrvaldÄ«bu nodroÅ”ina papildu elastÄ«bu.

Mums arÄ« ir Ärta piekļuve visiem modeļiem

un to versijÄm.

KÄ iepriekÅ”ÄjÄ punktÄ, visas darbÄ«bas var veikt, izmantojot API.
7. IevieŔam modeli
Å ajÄ posmÄ mums jau ir apmÄcÄ«ts (keras) modelis. PiemÄrs, kÄ to var izmantot:
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 resultÅ eit self.registry ir atkÄrtota vienkÄrÅ”a saskarne ar mlflow.tracking.MlflowClient, lai bÅ«tu ÄrtÄk. SvarÄ«gi ir tas, ka es piekļuÅ”u attÄlinÄtajam serverim un meklÄÅ”u tur modeli ar norÄdÄ«to nosaukumu, proti, pÄdÄjo produkcijas versiju. PÄc tam lejupielÄdÄju artefaktu vietÄjÄ mapÄ .\/model un uztveru modeli no Ŕīs direktorijas mlflow.keras.load_model(local_path). Tagad varam izmantot mÅ«su modeli. CV (ML) izstrÄdÄtÄji var mierÄ«gi strÄdÄt pie modeļa uzlaboÅ”anas un publicÄt jaunas versijas.
NoslÄgumÄ
Es piedÄvÄju sistÄmu, kas ļauj:
- centralizÄti uzglabÄt informÄciju par ML modeļiem, to apmÄcÄ«bas gaitu un rezultÄtiem;
- Ätri izvÄrst izstrÄdes vidi;
- sekot lÄ«dzi un analizÄt darbu pie modeļiem;
- Ärti veidot versiju un pÄrvaldÄ«t modeļu stÄvokli;
- vieglÄk izvietot iegÅ«tos modeļus.
Å is piemÄrs ir izglÄ«tojoÅ”s un kalpo kÄ sÄkumpunkts jÅ«su paÅ”u sistÄmas izveidei, kas, iespÄjams, ietver automÄtisku rezultÄtu novÄrtÄÅ”anu un modeļu reÄ£istrÄciju (5. un 6. punkts attiecÄ«gi), vai jÅ«s pievienosiet datu kopu versiju veidoÅ”anu, vai varbÅ«t vÄl ko citu? Es gribÄju sniegt priekÅ”statu, ka jums ir nepiecieÅ”ams MLOps kopumÄ, MLflow ir vienkÄrÅ”i lÄ«dzeklis mÄrÄ·u sasniegÅ”anai.
Uzrakstiet, kÄdas problÄmas jÅ«s saskÄrÄties, es tÄs neparÄdÄ«ju?
Ko jÅ«s pievienotu sistÄmai, lai tÄ apmierinÄtu jÅ«su vajadzÄ«bas?
Kurus rÄ«kus un pieejas jÅ«s izmantojat, lai risinÄtu visas vai daļu problÄmu?
P.S. AtstÄÅ”u dažas saites:
github projekts ā
MLflow ā
Mana darba e-pasta adrese, ja ir jautÄjumi ā ikryakin@croc.ru
MÅ«su uzÅÄmumÄ periodiski tiek rÄ«koti dažÄdi pasÄkumi IT speciÄlistiem, piemÄram: 8. jÅ«lijÄ plkst. 19:00 pÄc MGS notiks tieÅ”saistes tikÅ”anÄs par CV, ja interesÄ, varat piedalÄ«ties, reÄ£istrÄcija .
Avots: habr.com
