
Salut à tutti ! Sò un sviluppatore di CV in CROC. Avemu implementatu prughjetti in u campu di CV dapoi 3 anni. Duranti stu tempu, avemu fattu assai cose, per esempiu: avemu monitoratu i cunduttori in modu chì mentre guidanu ùn beie micca, ùn fumavanu, ùn parlavanu micca per telefunu, fighjemu a strada, è micca i sogni o i nuvuli. ; Avemu arregistratu e persone chì guidanu in carrughji dedicati è occupanu parechji parcheghji; assicuratu chì i travagliadori portanu caschi, guanti, etc.; identificatu un impiigatu chì vole entre in u stabilimentu; Avemu cuntatu tuttu ciò chì pudemu.
Chì facciu tuttu questu?
In u prucessu di implementazione di prughjetti, avemu culpitu i bumps, assai bumps, alcuni di i prublemi chì sò o familiarizati o diventeranu cunnisciutu in u futuru.
Simulemu a situazione
Imaginemu chì avemu un travagliu in una ghjovana cumpagnia "N", chì e so attività sò ligati à ML. Travagliemu nantu à un prughjettu ML (DL, CV), dopu per qualchì mutivu cambiemu à un altru travagliu, generalmente pigliate una pausa, è vultemu à a nostra neurona o di qualcunu altru.
- U mumentu di a verità vene, avete bisognu di ricurdà di qualchì manera induve avete firmatu, chì iperparametri pruvate è, più impurtante, chì risultati anu purtatu. Ci ponu esse parechje scelte per quale hà guardatu l'infurmazioni nantu à tutti i lanciari: in u capu, cunfigurazione, bloccu note, in un ambiente di travagliu in u nuvulu. Aghju accadutu à vede una opzione quandu l'iperparametri sò stati guardati cum'è linee cummentate in u codice, in generale, un volu di fantasia. Avà imaginate chì ùn avete micca vultatu à u vostru prughjettu, ma à u prughjettu di una persona chì abbandunò a cumpagnia è avete ereditatu un codice è un mudellu chjamatu model_1.pb. Per compie a stampa è trasmette tuttu u dulore, imaginemu chì site ancu un specialistu principiante.
- Avanti. Per eseguisce u codice, noi è tutti quelli chì anu da travaglià cun ellu bisognu di creà un ambiente. Succede à spessu chì per una certa ragione ùn l'abbandunonu micca a nostra eredità. Questu pò ancu diventà un compitu micca trivial. Ùn vulete micca perde u tempu nantu à questu passu, nò?
- Formemu un mudellu (per esempiu, un detector di vittura). Arrivemu à u puntu chì diventa assai bonu - hè u tempu di salvà u risultatu. Chjamemu car_detection_v1.pb. Allora entrenemu un altru - car_detection_v2.pb. Qualchi tempu dopu, i nostri culleghi o noi stessi insegniamo sempre di più, utilizendu architetture diverse. In u risultatu, una mansa di artefatti sò furmati, infurmazioni nantu à quale deve esse cullucatu currettamente (ma faremu questu dopu, perchè per avà avemu più affari di priorità).
- OK hè tuttu finitu Avà! Avemu un mudellu! Pudemu principià à furmà u prossimu mudellu, sviluppendu una architettura per risolve un novu prublema, o pudemu andà à piglià un tè? È quale si sparghjerà ?
Identificà i prublemi
U travagliu nantu à un prughjettu o pruduttu hè u travagliu di parechje persone. È cù u tempu, a ghjente parte è vene, ci sò più prughjetti, è i prughjetti stessi diventanu più cumplessi. In una manera o l'altru, situazioni da u ciculu sopra descrittu (è micca solu) in certi cumminazzioni accadiranu da iterazione à iterazione. Tuttu chistu risultatu in u tempu perdu, cunfusione, nervi, possibbilmente insatisfazione di u cliente, è infine, soldi persu. Ancu s'è tutti di solitu seguimu u listessu vechju rake, crede chì nimu ùn vole rivivà sti mumenti una volta è una volta.

Allora, avemu passatu per un ciclu di sviluppu è vedemu chì ci sò prublemi chì devenu esse risolti. Per fà questu avete bisognu:
- almacenà convenientemente i risultati di u travagliu;
- simplificà u prucessu d'implicazione di novi impiegati;
- simplificà u prucessu di implementà un ambiente di sviluppu;
- cunfigurà u prucessu di versione di mudellu;
- avè una manera còmuda di cunvalidà mudelli;
- truvà un strumentu di gestione di u statu mudellu;
- truvà un modu per furnisce mudelli à a produzzione.
Apparentemente, hè necessariu di vene cun un flussu di travagliu chì vi permettenu di gestisce facilmente è cunvene stu ciclu di vita? Sta pratica hè chjamata MLOps
MLOps, o DevOps per l'apprendimentu automaticu, permette à e squadre di scienza di dati è TI di cullaburà è aumentà u ritmu di sviluppu è implementazione di mudelli per mezu di u monitoraghju, a validazione è a guvernanza per i mudelli di apprendimentu automaticu.
Poi Chì pensanu i ragazzi di Google di tuttu questu? Da l'articulu hè chjaru chì MLOps hè una cosa abbastanza voluminosa.

In più in u mo articulu, descriveraghju solu una parte di u prucessu. Per l'implementazione, aduprà l'utillita MLflow, perchè ... Questu hè un prughjettu open-source, una piccula quantità di codice hè necessariu per cunnette è ci hè integrazione cù frameworks ml populari. Pudete cercà in Internet per altri arnesi, cum'è Kubeflow, SageMaker, Trains, etc., è forse truvà quellu chì si adatta megliu à i vostri bisogni.
"Custruisce" MLOps utilizendu l'esempiu di utilizà l'uttellu MLFlow
MLFlow hè una piattaforma open source per a gestione di u ciclu di vita di mudelli ml ().
MLflow include quattru cumpunenti:
- MLflow Tracking - copre i prublemi di arregistramentu risultati è paràmetri chì anu purtatu à stu risultatu;
- Prughjettu MLflow - permette di imballà u codice è ripruduce nantu à qualsiasi piattaforma;
- Modelli MLflow - rispunsevuli di implementà mudelli à a produzzione;
- MLflow Registry - permette di almacenà mudelli è gestisce u so statu in un repository centralizatu.
MLflow opera nantu à duie entità:
- u lanciu hè un ciculu sanu di furmazione, paràmetri è metriche da quale vulemu registrà;
- Un esperimentu hè un "tema" chì corre inseme.
Tutti i passi di l'esempiu sò implementati nantu à u sistema operativu Ubuntu 18.04.
1. Impulsà u servitore
Per noi di gestisce facilmente u nostru prughjettu è riceve tutte l'infurmazioni necessarii, implementeremu un servitore. U servitore di seguimentu MLflow hà dui cumpunenti principali:
- backend store - rispunsevuli di almacenà l'infurmazioni nantu à i mudelli registrati (supporta 4 DBMS: mysql, mssql, sqlite è postgresql);
- Artifact store - rispunsevuli di almacenà artefatti (supporta 7 opzioni di almacenamento: Amazon S3, Azure Blob Storage, Google Cloud Storage, server FTP, SFTP Server, NFS, HDFS).
Cum'è a magazzinu di artifacti Per simplicità, pigliamu un servitore sftp.
- crià un gruppu
$ sudo groupadd sftpg - aghjunghje un utilizatore è stabilisce una password per ellu
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp - aghjustendu un paru di paràmetri di accessu
$ sudo mkdir -p /data/mlflowsftp/upload $ sudo chown -R root.sftpg /data/mlflowsftp $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload - aghjunghje uni pochi di linii à /etc/ssh/sshd_config
Match Group sftpg ChrootDirectory /data/%u ForceCommand internal-sftp - ripigliate u serviziu
$ sudo systemctl restart sshd
Cum'è a backend store Pigliemu 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
Per inizià u servitore, avete bisognu di installà i seguenti pacchetti python (recumandemu di creà un ambiente virtuale separatu):
pip install mlflow
pip install pysftp
Cuminciamu u nostru servitore
$ 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_port
2. Add tracking
Per ùn esse persu i risultati di a nostra furmazione, i futuri generazioni di sviluppatori per capiscenu ciò chì passava, è per i camaradi più vechji è voi per pudè analizà tranquillamente u prucessu di apprendimentu, avemu bisognu di aghjunghje traccia. U seguimentu significa salvà paràmetri, metriche, artefatti è qualsiasi infurmazione supplementaria nantu à l'iniziu di furmazione, in u nostru casu, in u servitore.
Per esempiu, aghju creatu un picculu nantu à Keras per segmentà tuttu ciò chì hè in . Per aghjunghje traccia, aghju creatu un schedariu mlflow_training.py.
Eccu i linii induve succede e cose più interessanti:
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)
Quì self.remote_server hè un picculu wrapper nantu à i metudi mlflow.tracking. MlflowClient (l'aghju fattu per comodità), cù l'aiutu di quale aghju creatu un esperimentu è eseguite nantu à u servitore. In seguitu, indicu induve i risultati di u lanciamentu devenu esse uniti (mlflow.set_tracking_uri(self.tracking_uri)). Attivà u logu automaticu mlflow.keras.autolog(). Attualmente MLflow Tracking supporta a registrazione automatica per TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Se ùn avete micca truvatu u vostru quadru o biblioteca, pudete sempre log in esplicitu. Avemu principiatu a furmazione. Registrate tag è parametri di input in u servitore remotu.
Un paru di linii è voi, cum'è tutti l'altri, avete accessu à l'infurmazioni nantu à tutti i lanciamenti. Cool?
3. Facemu u prugettu
Avà facemu faciule per lancià u prugettu. Per fà questu, aghjunghje u schedariu MLproject è conda.yaml à a radica di u prugettu.
Prughjettu ML
name: flow_segmentation
conda_env: conda.yaml
entry_points:
main:
parameters:
categories: {help: 'list of categories from coco dataset'}
epochs: {type: int, help: 'number of epochs in training'}
lr: {type: float, default: 0.001, help: 'learning rate'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'the server address'}
experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
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 Project hà parechje proprietà:
- Name - u nome di u vostru prughjettu;
- Ambiente - in u mo casu, conda_env indica chì Anaconda hè utilizatu per eseguisce è a descrizzione di a dependenza hè in u schedariu conda.yaml;
- Punti di entrata - indica quali fugliali è cù quali parametri pudemu eseguisce (tutti i paràmetri sò registrati automaticamente quandu si principia a furmazione)
cunda.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.0
Pudete aduprà docker cum'è u vostru ambiente di runtime, per più dettagli, fate riferimentu à .
4. Cuminciamu a furmazione
Clonemu u prughjettu è andemu à u cartulare di u prughjettu:
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Per eseguisce avete bisognu di installà e librerie
pip install mlflow
pip install pysftp
Perchè in l'esempiu chì aghju utilizatu conda_env, Anaconda deve esse installatu nantu à u vostru urdinatore (ma pudete ghjunghje à questu installendu tutti i pacchetti necessarii è ghjucà cù i paràmetri di lanciamentu).
Tutti i passi preparatori sò cumpleti è pudemu cumincià à lancià a furmazione. Da a radica di u prugettu:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
Dopu à entre in u cumandamentu, un ambiente cunda sarà automaticamente creatu è a furmazione hà da principià.
In l'esempiu sopra, aghju passatu u numeru di epoche per a furmazione, e categurie in quale vulemu segmentà (pudete vede a lista completa ) è l'indirizzu di u nostru servitore remoto.
Una lista cumpleta di parametri pussibuli pò esse truvata in u schedariu MLproject.
5. Evaluate i risultati di l'apprendimentu
Dopu à compie a furmazione, pudemu andà in u navigatore à l'indirizzu di u nostru servitore

Quì vedemu una lista di tutti l'esperimenti (in cima à manca), è dinò l'infurmazioni nantu à e corse (mediu). Pudemu vede infurmazione più dettagliata (parametri, metriche, artefatti è qualchì infurmazione supplementaria) per ogni lanciu.

Per ogni metrica pudemu osservà a storia di i cambiamenti

Quelli. À u mumentu, pudemu analizà i risultati in un modu "manuale", è pudete ancu stabilisce a validazione automatica cù l'API MLflow.
6. Registrate u mudellu
Dopu avè analizatu u nostru mudellu è decisu chì hè prontu per a battaglia, procedemu à registrà, per questu selezziunà u lanciamentu chì avemu bisognu (cum'è mostra in u paràgrafu precedente) è falà.

Dopu avè datu u nostru mudellu un nome, hà una versione. Se salvate un altru mudellu cù u listessu nome, a versione serà automaticamente aghjurnata.

Per ogni mudellu, pudemu aghjunghje una descrizzione è selezziunà unu di i trè stati (Staging, Production, Archived in seguitu, usendu l'API, pudemu accede à questi stati, chì, cù a versione, furnisce una flessibilità supplementaria).

Avemu ancu un accessu faciule à tutti i mudelli

è e so versioni

Cum'è in u paràgrafu precedente, tutte l'operazioni ponu esse fatte cù l'API.
7. Deploy u mudellu
À questu stadiu, avemu digià un mudellu furmatu (keras). Un esempiu di cumu pudete aduprà:
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
Quì self.registry hè di novu un picculu wrapper sopra mlflow.tracking.MlflowClient, per comodità. U puntu hè chì accede à un servitore remotu è cercate un mudellu quì cù u nome specificatu, è l'ultima versione di produzzione. In seguitu, aghju scaricatu l'artifactu in u locu à u cartulare ./model è custruisce u mudellu da questu repertoriu mlflow.keras.load_model (local_path). Avà pudemu usà u nostru mudellu. I sviluppatori di CV (ML) ponu facilmente migliurà u mudellu è pubblicà novi versioni.
In cunclusioni
Aghju prisintatu un sistema chì permette:
- almacenà cintrali infurmazione nantu à mudelli ML, prugressu di furmazione è risultati;
- implementà rapidamente un ambiente di sviluppu;
- monitorà è analizà u prugressu di u travagliu nantu à mudelli;
- hè cunvenutu à versione è gestisce u statu di mudelli;
- Hè facilitu di implementà i mudelli resultanti.
Questu esempiu hè un ghjoculu è serve cum'è un puntu di partenza per a custruzzione di u vostru propiu sistema, chì pò include l'automatizazione di a valutazione di i risultati è a registrazione di mudelli (punti 5 è 6, rispettivamente) o aghjunghje a versione di datasets, o forse qualcosa d'altru ? U puntu ch'e aghju pruvatu à fà hè chì avete bisognu di MLOps in tuttu, MLflow hè solu un mezzu per finisce.
Scrivite chì prublemi avete scontru chì ùn aghju micca affissatu?
Chì aghjunghje à u sistema per fà risponde à i vostri bisogni?
Chì arnesi è approcci aduprate per risolve tutti o parte di i prublemi ?
PS lasceraghju un paru di ligami:
prughjettu github -
MLflow -
U mo email di travagliu, per dumande - ikryakin@croc.ru
A nostra sucietà ospita periodicamente diversi avvenimenti per i specialisti in IT, per esempiu: l'8 di lugliu à 19:00 ora di Mosca, ci sarà un CV meetingup in un formatu in linea, se site interessatu, pudete participà, iscrizzione. .
Source: www.habr.com
