
Përshëndetje të gjithëve! Jam zhvillues i CV në KROK. Që prej 3 vjetësh, ne realizojmë projekte në fushën e CV. Gjatë kësaj kohe kemi bërë shumë gjëra, për shembull: kemi monitoruar shoferët që gjatë drejtimit të mos pinë, të mos duhanosin, të mos flasin në telefon, të shikojnë rrugën dhe jo ëndrrat apo re; kemi regjistruar ata që duan të garojnë nëpër rrugët e rezervuara dhe të zënë disa vende në parkim; kemi ndjekur që punonjësit të mbajnë helmeta, dorashka etj.; kemi identifikuar punonjësit që duhen të hyjnë në objekt; kemi numëruar gjithçka që është e mundur.
Pse e them gjithë këtë?
Në procesin e realizimit të projekteve, ne kemi bërë shumë gabime, shumë gabime, disa nga problemet që ju i njihni tashmë, ose do t'i njihni në të ardhmen.
Le të simulojmë një situatë
Imagjinoni se jemi punësuar në një kompani të re "N", aktiviteti i së cilës është i lidhur me ML. Po punojmë mbi një projekt ML (DL, CV), pastaj për arsye të ndryshme kalojmë në një tjetër punë, në përgjithësi bëjmë një ndërprerje, dhe kthehemi në neuronin tonë ose të tjetrit.
- Ka ardhur momenti i së vërtetës, ne duhet të kujtojmë ndonjëherë se ku kemi qëndruar, cilat hiperparametra kemi provuar dhe, më e rëndësishmja, në çfarë rezultatesh kanë çuar ato. Për informacionin e të gjitha lansimeve, mund të ketë shumë mënyra se si e kanë ruajtur njerëzit informacionin: në mendje, në konfigurime, në një shënues, ose në mjedisin e punës në re. Kam parë një variant ku hiperparametrat ruheshin si rreshta të komentuar në kod, një fantazi e plotë. Tani imagjinoni që nuk po ktheheni në projektin tuaj, por në projektin e dikujt që ka lënë kompaninë dhe ju ka mbetur kodi dhe modelin e quajtur model_1.pb. Për të pasur një imagjë më të plotë dhe për të përjetuar gjithë dhimbjen, le të imagjinojmë se jeni gjithashtu një specialist i ri.
- Të shkojmë më tej. Për të ekzekutuar kodin, ne dhe të gjithë ata që do të punojnë me të duhet të krijojmë një ambient. Shpesh ndodh që edhe atë na e kanë lënë si trashëgimi për ndonjë arsye. Kjo gjithashtu mund të bëhet një detyrë e vështirë. Nuk dëshiron të humbasësh kohë në këtë hap, apo jo?
- Të stërvitim modelin (p.sh., detektori i automjeteve). Arrijmë në momentin kur ai bëhet mjaft i mirë - është koha të ruajmë rezultatin. Ta quajmë car_detection_v1.pb. Më pas stërvitim një tjetër - car_detection_v2.pb. Pas një kohe, kolegët tanë ose ne vetë stërvitim edhe më shumë, duke përdorur arkitektura të ndryshme. Në fund formohet një grumbull artefakteresh, informacioni për të cilat duhet mbledhur me kujdes (por, do ta bëjmë këtë më vonë, pasi kemi punë më prioritare).
- Tani është gjithçka! Kemi modelin tonë! Mund të fillojmë stërvitjen e modelit tjetër, të zhvillojmë arkitekturën për të zgjidhur një detyrë të re, apo mund të shkojmë të pimë çaj? Por kush do ta bëjë deploy-in?
Identifikojmë problemet
Puna mbi njĂ« projekt ose produkt Ă«shtĂ« njĂ« punĂ« e shumĂ« njerĂ«zve. Me kalimin e kohĂ«s, njerĂ«zit largohen dhe vijnĂ«, projekte bĂ«hen mĂ« tĂ« shumta, dhe 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. TĂ« gjitha kĂ«to ndodhin dhe pĂ«rfundojnĂ« nĂ« humbje kohe, ngatĂ«rresa, nervozizĂ«m, ndoshta â pakĂ«naqĂ«si tĂ« klientit, dhe nĂ« fund â humbje parash. Edhe pse tĂ« gjithĂ« ne zakonisht ndjekim tĂ« njĂ«jtat gabime, besoj se askush nuk dĂ«shiron tâi pĂ«rsĂ«risĂ« kĂ«to momente vazhdimisht.

Pra, kemi kaluar një cikël zhvillimi dhe shohim se ka probleme që duhet të zgjidhen. Për këtë nevojitet:
- të ruajmë rezultatet e punës në mënyrë të qartë;
- të lehtësojmë procesin e angazhimit të punonjësve të rinj;
- të thjeshtësojmë procesin e shpërndarjes së ambientit të zhvillimit;
- të konfiguroni procesin e versionimit të modeleve;
- të kemi një mënyrë të përshtatshme për validimin e modeleve;
- të gjejmë një mjet 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ë krijojmë një workflow që do të lehtësojë menaxhimin e këtij cikli jete? Kjo praktikë ka një emër: MLOps.
MLOps, ose DevOps për mësimin e makinerive, lejon ekipet e specialistëve në përpunimin dhe analizimin e të dhënave dhe specialistëve IT të bashkëpunojnë, si dhe rrit ritmin e zhvillimit dhe shpërndarjes së modeleve përmes monitorimit, verifikimit dhe një sistemi menaxhimi për modelet e mësimit të makinës.
Mund të , çfarë mendojnë djemtë nga Google rreth kësaj. Nga artikulli kuptohet se MLOps është një çështje mjaft e gjerë.

Më tej, në artikullin tim do të përshkruaj vetëm një pjesë të procesit. Për realizimin e tij do të përdor mjetin MLflow, pasi është një projekt open-source, që kërkon një sasi të vogël kodi për t'u lidhur dhe ka integrim me framework-et e njohura ml. Mund të kërkoni në internet për mjete të tjera, si Kubeflow, SageMaker, Trains etj., dhe ndoshta të gjeni atë që përputhet më mirë me nevojat tuaja.
"Ndërtojmë" MLOps me shembullin e përdorimit të mjetit MLFlow.
MLFlow është një platformë me burim të hapur për menaxhimin e ciklit të jetës së modeleve ml ().
MLflow përfshin katër komponentë:
- MLflow Tracking â adreson pyetjet lidhur me regjistrimin e rezultateve dhe parametrave qĂ« çuan nĂ« atĂ« rezultat;
- MLflow Project â lejon paketimin e kodit dhe riprodhimin e tij nĂ« çdo platformĂ«;
- MLflow Models â pĂ«rgjigjet pĂ«r deploy-n 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:
- nĂ« lansim â Ă«shtĂ« cikli i plotĂ« i trajnimit, parametrave dhe metrikave qĂ« duam tĂ« regjistrojmĂ«;
- eksperimenti â Ă«shtĂ« âtemĂ«â ku bashkohen lansimet.
Të gjitha hapat e shembullit janë realizuar në sistemin operativ Ubuntu 18.04.
1. Pushtojmë serverin
Për ta menaxhuar lehtësisht projektin tonë dhe për të marrë të gjitha informacionet e nevojshme, do ta pushtojmë serverin. Serveri i gjurmimit MLflow ka dy komponentë kryesorë:
- backend store â pĂ«rgjigjet pĂ«r ruajtjen e informacionit mbi modelet e regjistruara (mbĂ«shtet 4 DB: mysql, mssql, sqlite, dhe postgresql);
- artifact store â pĂ«rgjigjet pĂ«r ruajtjen e artefakteve (mbĂ«shtet 7 opsione ruajtjeje: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP Server, NFS, HDFS).
Si artifact store për thjeshtësi, të marrim një server sftp.
- krijojmë grupin
$ sudo groupadd sftpg - shtojmë përdoruesin dhe caktojmë fjalëkalimin e tij
$ 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 - rilaktojmë shërbimin
$ sudo systemctl restart sshd
Si magazina e backend 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
# Krijo bazën e të dhënave mlflow_bd në pronësi të mlflow_user
$ createdb -O mlflow_user mlflow_dbPër të nisur serverin, duhet të instaloni paketat e ardhshme python (këshilloj të krijoni një mjedis 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. Shtojmë ndjekjen
Për të siguruar që rezultatet e trajnimeve tona të mos humbasin, që gjeneratat e ardhshme të zhvilluesve të kuptojnë se çfarë ka ndodhur, dhe që kolegët më të moshuar dhe ju të mund të analizoni qetësisht procesin e mësimit, është e nevojshme të shtojmë ndjekjen. Ndjekja nënkupton ruajtjen e parametrave, metrikave, artefakteve dhe çdo informacioni tjetër shtesë rreth fillimit të trajnimit, në rastin tonë, në server.
Si shembull, krijova një në Keras për segmentimin e gjithçkaje që ekziston 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):
# merrni id-në e eksperimentit, krijoni një eksperiment në rastin e mospranimit
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# krijoni një "run" dhe merrni id-në e tij
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# tregoni që duam të ruajmë rezultatet në një server të largët
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)Këtu self.remote_server është një mbështetje e vogël mbi metodat mlflow.tracking. MlflowClient (e kam bërë për lehtësi), me të cilat krijoj eksperimente dhe drejtime në server. Më pas tregoj ku duhet të derdhen rezultatet e drejtimeve (mlflow.set_tracking_uri(self.tracking_uri)). Aktivizoj regjistrimin automatik mlflow.keras.autolog(). Aktualisht, MLflow Tracking mbështet regjistrimin automatik për TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Nëse nuk e gjeni framë të tuaj ose bibliotekë, mund të regjistroni gjithmonë në mënyrë të qartë. Fillojmë mësimin. Regjistruojmë etiketat dhe parametrat e hyrjes në serverin e largët.
Për disa rreshta dhe ju, siç janë të gjithë të interesuarit, keni akses në informacionin mbi të gjitha drejtimeve. E mrekullueshme?
3. Duke formuar projektin
Tani do ta bëjmë që të nisni projektin të jetë shumë e lehtë. Për këtë do të shtojmë një skedar MLproject dhe conda.yaml në rrënjën e projektit.
MLproject
emri: 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ë trajnim'}
lr: {type: float, default: 0.001, help: 'norma e të mësuarit'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'shembujt resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'adresa e serverit'}
experiment_name: {type: str, default: 'Eksperimenti_Im', help: 'emri i eksperimentit të largët dhe lokal'}
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:
- Emri â emri i projektit tuaj;
- Menoja â nĂ« rastin tim conda_env tregon se pĂ«r ekzekutimin pĂ«rdoret Anaconda dhe pĂ«rshkrimi i varĂ«sive ndodhet nĂ« skedarin conda.yaml;
- Pikat e hyrjes â tregojnĂ« se cilat skedarĂ« dhe me cilat parametra mund tĂ« ekzekutojmĂ« (tĂ« gjitha parametrat gjatĂ« ekzekutimit tĂ« trajnimitt janĂ« automatikisht tĂ« regjistruar)
conda.yaml
emri: segmentimi_i_rrjedhave
kanalet:
- defaults
- anaconda
dependencat:
- 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
- segmentimi-models==1.0.1
- Keras==2.3.1
- imgaug==0.4.0
- tqdm==4.46.0
- tensorflow-gpu==1.14.0Si një mjedis ekzekutimi, ju mund të përdorni docker, për informacione më të detajuara, referojuni te .
4. Nisni trajnimin
Klononi projektin dhe kaloni në direktoriumin e projektit:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/Për të nisur, duhet të instaloni bibliotekat
pip install mlflow
pip install pysftpSepse në këtë shembull unë përdor conda_env, duhet të keni instaluar Anaconda në kompjuterin tuaj (por edhe kjo mund të evitohet duke instaluar të gjitha paketat e nevojshme vetë dhe duke luajtur me parametrat e nisjes).
Të gjitha hapat përgatitore janë përfunduar dhe ne mund të fillojmë trajnimet. Nga rrënja e projektit:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .Pas futjes së komandës, do të krijohet automatikisht një ambient conda dhe do të nisin trajnimet.
Në shembullin e mësipërm kam kaluar numrin e epokave për trajnimin, kategoritë në të cilat dëshirojmë të segmentojmë (lista e plotë mund të shikohet ) dhe adresën e serverit tonë të largët.
Lista e plotëve të mundshme mund të shihet në skedarin MLproject.
5. Vlerësojmë rezultatet e trajnimet
Pas përfundimit të trajnimit, ne mund të kalojmë në shfletuesin për në adresën e serverit tonë

Këtu shohim listën e të gjitha eksperimenteve (në majtas lart), si dhe informacionin mbi ekzekutimet (në mes). Mund të shohim informacion më të detajuar (parametra, metrika, artefakte dhe disa informacione shtesë) për çdo ekzekutim.

Për çdo metrikë, mund të ndjekim historinë e ndryshimeve.

Domethënë, në këtë moment mund të analizojmë rezultatet në një mënyrë "manuale", gjithashtu mund të konfiguroni edhe validimin automatik duke përdorur API-në MLflow.
6. Regjistrimi i modelit
Pasi kemi analizuar modelin tonë dhe kemi vendosur se është gati për përdorim, fillojmë regjistrimin e tij, për këtë zgjedhim ekzekutimin që na nevojitet (siç u shfaq në pikën e mëparshme) dhe zbresim poshtë.

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

Për çdo model mund të shtojmë një përshkrim dhe të zgjedhim një nga tre gjendje (Staging, Production, Archived), pas të cilave, me anë të API, mund të qasemi në këto gjendje, gjë që, së bashku me versionimin, ofron fleksibilitet shtesë.

Ne gjithashtu kemi qasje të lehtë në të gjitha modelet

dhe versionet e tyre

Siç u përmend në pikën e kaluar, të gjitha operacionet mund të kryhen me anë të API.
7. Deploy modelin
Në këtë fazë, ne tashmë kemi një model të trajnuar (keras). Një shembull se si mund ta përdorim atë:
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ë sërish një mbështetje e vogël mbi mlflow.tracking.MlflowClient, për lehtësi. Qëllimi është që unë të lidhem me një server të largët dhe të kërkoj atje një model me emrin e specifikuar, përkatësisht, versionin më të ri në prodhim. Më pas shkarkoj artefaktin lokalish në dosjen ./model dhe ndërtosh modelin nga kjo drejtori mlflow.keras.load_model(local_path). Tani mund të përdorim modelin tonë. Zhvilluesit e CV (ML) mund të vazhdojnë të përmirësojnë modelin dhe të publikojnë versione të reja.
Në përfundim
Kam paraqitur një sistem që lejon:
- ruajtjen e centralizuar të informacionit për modelet ML, përparimin dhe rezultatet e trajnimit;
- shkurtimisht të krijohet mjedisi i zhvillimit;
- të ndjekin dhe analizojnë përparimin e punës mbi modelet;
- të menaxhojnë versionimin dhe gjendjen e modeleve lehtësisht;
- të bëjnë lehtësisht deploy të modeleve të marra.
Ky kyç është një shembull emocional dhe shërben si një fillim për ndërtimin e sistemit 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 mund të shtoni versionimin e dataset-eve, ose ndoshta diçka tjetër? Doja të theksoja se ju nevojitet MLOps në tërësi, MLflow është vetëm një mjet për arritjen e qëllimit.
Cilat probleme, me të cilat jeni përballur, nuk i kam përfshirë?
ĂfarĂ« do tĂ« shtonit nĂ« sistem pĂ«r tĂ« pĂ«rmbushur nevojat tuaja?
Cilat mjete dhe qasje përdorni për të zgjidhur të gjitha ose një pjesë të problemeve?
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 aktivitete të ndryshme për specialistët e IT, për shembull: më 8 korrik në orën 19:00 sipas MSK do të zhvillohet një meetup mbi CV në format online, nëse jeni të interesuar, mund të merrni pjesë, regjistrimi. .
Burimi: habr.com
