MLOps - Llibre de cuina, capítol 1

MLOps - Llibre de cuina, capítol 1

Hola a tots! Sóc desenvolupador de currículums a CROC. Portem 3 anys implementant projectes en l'àmbit del CV. Durant aquest temps vam fer moltes coses, per exemple: vam vigilar els conductors perquè mentre conduïssin no beguessin, no fumessin, no parlessin per telèfon, miréssin la carretera i no els somnis ni els núvols. ; Vam gravar aficionats circulant per carrils dedicats i ocupant diverses places d'aparcament; assegurava que els treballadors portaven casc, guants, etc.; identificar un empleat que vol entrar a la instal·lació; Hem comptat tot el que hem pogut.

Per què estic fent tot això?

En el procés d'implementació de projectes, ens trobem amb problemes, molts cops, alguns dels problemes que coneixeu o els coneixereu en el futur.

Simulem la situació

Imaginem que vam aconseguir una feina a una empresa jove “N”, les activitats de la qual estan relacionades amb l'ML. Treballem en un projecte de ML (DL, CV), després, per algun motiu, canviem a una altra feina, en general fem una pausa i tornem a la neurona pròpia o d'una altra persona.

  1. Arriba el moment de la veritat, cal recordar d'alguna manera on us vau aturar, quins hiperparàmetres vau provar i, el més important, quins resultats van portar. Hi pot haver moltes opcions per a qui va emmagatzemar informació en tots els llançaments: al capçal, configs, bloc de notes, en un entorn de treball al núvol. Vaig veure una opció quan els hiperparàmetres es van emmagatzemar com a línies comentades al codi, en general, un vol de luxe. Ara imagineu que no vau tornar al vostre projecte, sinó al projecte d'una persona que va deixar l'empresa i vau heretar un codi i un model anomenat model_1.pb. Per completar la imatge i transmetre tot el dolor, imaginem que també ets un especialista novell.
  2. Endavant. Per executar el codi, nosaltres i tots els que hi treballarem hem de crear un entorn. Sovint passa que per algun motiu no ens ho van deixar com a herència. Això també es pot convertir en una tasca no trivial. No voleu perdre el temps en aquest pas, oi?
  3. Entrenem un model (per exemple, un detector de cotxes). Arribem al punt que esdevé molt bo: és hora de guardar el resultat. Diguem-ho car_detection_v1.pb. A continuació, en entrenem un altre: car_detection_v2.pb. Temps després, els nostres companys o nosaltres mateixos ensenyem cada cop més, utilitzant diferents arquitectures. Com a resultat, es formen un munt d'artefactes, la informació sobre la qual cal recollir amb cura (però ho farem més endavant, perquè ara per ara tenim més qüestions prioritàries).
  4. D'acord, ja s'ha acabat tot! Tenim un model! Podem començar a entrenar el següent model, desenvolupar una arquitectura per resoldre un nou problema, o podem anar a prendre una mica de te? I qui es desplegarà?

Identificació de problemes

Treballar en un projecte o producte és feina de moltes persones. I amb el temps, la gent marxa i ve, hi ha més projectes, i els projectes en si es tornen més complexos. D'una manera o altra, situacions del cicle descrit anteriorment (i no només) en determinades combinacions es produiran d'iteració en iteració. Tot això es tradueix en temps perdut, confusió, nervis, possiblement insatisfacció del client i, en definitiva, diners perduts. Encara que tots acostumem a seguir el mateix vell rastell, crec que ningú vol reviure aquests moments una i altra vegada.

MLOps - Llibre de cuina, capítol 1

Per tant, hem passat per un cicle de desenvolupament i veiem que hi ha problemes que cal resoldre. Per fer-ho necessites:

  • emmagatzemar convenientment els resultats del treball;
  • simplificar el procés d'implicar nous empleats;
  • simplificar el procés de desplegament d'un entorn de desenvolupament;
  • configurar el procés de versions del model;
  • tenir una manera còmoda de validar models;
  • trobar una eina model de gestió de l'estat;
  • trobar una manera de lliurar models a producció.

Pel que sembla, cal idear un flux de treball que us permeti gestionar de manera fàcil i còmoda aquest cicle de vida? Aquesta pràctica s'anomena MLOps

MLOps, o DevOps per a l'aprenentatge automàtic, permet als equips informàtics i de ciència de dades col·laborar i augmentar el ritme de desenvolupament i desplegament de models mitjançant la supervisió, la validació i el govern dels models d'aprenentatge automàtic.

Pots llegirQuè pensen els nois de Google de tot això? De l'article queda clar que MLOps és una cosa força voluminosa.

MLOps - Llibre de cuina, capítol 1

Més endavant en el meu article descriuré només una part del procés. Per a la implementació, utilitzaré l'eina MLflow, perquè... Aquest és un projecte de codi obert, es requereix una petita quantitat de codi per connectar-se i hi ha integració amb marcs ml populars. Podeu cercar a Internet altres eines, com ara Kubeflow, SageMaker, Trains, etc., i potser trobar-ne una que s'adapti millor a les vostres necessitats.

"Crear" MLOps utilitzant l'exemple d'ús de l'eina MLFlow

MLFlow és una plataforma de codi obert per a la gestió del cicle de vida dels models ml (https://mlflow.org/).

MLflow inclou quatre components:

  • Seguiment de MLflow - cobreix els problemes de l'enregistrament dels resultats i els paràmetres que van conduir a aquest resultat;
  • Projecte MLflow: us permet empaquetar codi i reproduir-lo a qualsevol plataforma;
  • MLflow Models: responsable de desplegar models a producció;
  • Registre MLflow: us permet emmagatzemar models i gestionar el seu estat en un repositori centralitzat.

MLflow opera en dues entitats:

  • El llançament és un cicle complet de formació, paràmetres i mètriques pel qual ens volem registrar;
  • Un experiment és un "tema" que s'executa conjuntament.

Tots els passos de l'exemple s'implementen al sistema operatiu Ubuntu 18.04.

1. Desplegueu el servidor

Per tal que puguem gestionar fàcilment el nostre projecte i rebre tota la informació necessària, desplegarem un servidor. El servidor de seguiment MLflow té dos components principals:

  • magatzem de fons: responsable d'emmagatzemar informació sobre models registrats (admet 4 DBMS: mysql, mssql, sqlite i postgresql);
  • botiga d'artefactes: responsable d'emmagatzemar els artefactes (admet 7 opcions d'emmagatzematge: Amazon S3, Azure Blob Storage, Google Cloud Storage, servidor FTP, servidor SFTP, NFS, HDFS).

A mesura que el botiga d'artefactes Per simplificar, prenem un servidor sftp.

  • crear un grup
    $ sudo groupadd sftpg
  • afegir un usuari i establir-li una contrasenya
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • ajustant un parell de paràmetres d'accés
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • afegiu unes quantes línies a /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • reinicieu el servei
    $ sudo systemctl restart sshd

A mesura que el botiga de fons Prenem 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 iniciar el servidor, heu d'instal·lar els paquets Python següents (recomano crear un entorn virtual separat):

pip install mlflow
pip install pysftp

Comencem el nostre servidor

$ 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. Afegeix un seguiment

Per tal que els resultats de la nostra formació no es perdin, les futures generacions de desenvolupadors entenguin què estava passant, i perquè els companys més grans i tu pugueu analitzar amb calma el procés d'aprenentatge, hem d'afegir un seguiment. El seguiment significa desar paràmetres, mètriques, artefactes i qualsevol informació addicional sobre l'inici de l'entrenament, en el nostre cas, al servidor.

Per exemple, vaig crear un petit projecte a github a Keras per segmentar tot el que hi ha conjunt de dades COCO. Per afegir un seguiment, vaig crear un fitxer mlflow_training.py.

Aquestes són les línies on passen les coses més interessants:

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)

Aquí self.remote_server és un petit embolcall dels mètodes mlflow.tracking. MlflowClient (el vaig fer per comoditat), amb l'ajuda del qual creo un experiment i l'executo al servidor. A continuació, indiqui on s'han de combinar els resultats del llançament (mlflow.set_tracking_uri(self.tracking_uri)). Habilita el registre automàtic mlflow.keras.autolog(). Actualment, MLflow Tracking admet el registre automàtic per a TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Si no heu trobat el vostre marc o biblioteca, sempre podeu iniciar sessió de manera explícita. Comencem a entrenar. Registreu les etiquetes i els paràmetres d'entrada al servidor remot.

Un parell de línies i tu, com tothom, tens accés a la informació de tots els llançaments. Guai?

3. Elaborem el projecte

Ara facilitem el llançament del projecte. Per fer-ho, afegiu el fitxer MLproject i conda.yaml a l'arrel del projecte.
MLproject

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}"

El projecte MLflow té diverses propietats:

  • Nom: el nom del vostre projecte;
  • Entorn: en el meu cas, conda_env indica que Anaconda s'utilitza per executar-se i la descripció de la dependència es troba al fitxer conda.yaml;
  • Punts d'entrada: indica quins fitxers i amb quins paràmetres podem executar (tots els paràmetres es registren automàticament en començar l'entrenament)

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.0

Podeu utilitzar Docker com a entorn d'execució; per obtenir més informació, consulteu documentació.

4. Comencem a entrenar

Clonem el projecte i anem al directori del projecte:

git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/

Per executar-lo cal instal·lar biblioteques

pip install mlflow
pip install pysftp

Perquè a l'exemple que faig servir conda_env, Anaconda s'ha d'instal·lar al vostre ordinador (però podeu evitar-ho instal·lant tots els paquets necessaris vosaltres mateixos i jugant amb els paràmetres de llançament).

S'han completat tots els passos preparatoris i podem començar a posar en marxa la formació. Des de l'arrel del projecte:

$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .

Després d'introduir l'ordre, es crearà automàticament un entorn conda i s'iniciarà l'entrenament.
A l'exemple anterior, he passat el nombre d'èpoques per a la formació, les categories en les quals volem segmentar (podeu veure la llista completa aquí) i l'adreça del nostre servidor remot.
Es pot trobar una llista completa de possibles paràmetres al fitxer MLproject.

5. Avaluar els resultats de l'aprenentatge

Un cop finalitzada la formació, podem anar al navegador a l'adreça del nostre servidor http://server_host:server_port

MLOps - Llibre de cuina, capítol 1

Aquí veiem una llista de tots els experiments (a dalt a l'esquerra), així com informació sobre les execucions (al mig). Podem veure informació més detallada (paràmetres, mètriques, artefactes i alguna informació addicional) per a cada llançament.

MLOps - Llibre de cuina, capítol 1

Per a cada mètrica podem observar l'historial dels canvis

MLOps - Llibre de cuina, capítol 1

Aquells. De moment, podem analitzar els resultats en un mode "manual", i també podeu configurar la validació automàtica mitjançant l'API MLflow.

6. Registre el model

Després d'haver analitzat el nostre model i decidit que està preparat per a la batalla, procedim a registrar-lo, per a això seleccionem el llançament que necessitem (com es mostra al paràgraf anterior) i baixem.

MLOps - Llibre de cuina, capítol 1

Després de donar un nom al nostre model, té una versió. Si deseu un altre model amb el mateix nom, la versió s'actualitzarà automàticament.

MLOps - Llibre de cuina, capítol 1

Per a cada model, podem afegir una descripció i seleccionar un dels tres estats (Escenificació, Producció, Arxivat, posteriorment, mitjançant l'API, podem accedir a aquests estats, que, juntament amb el versionat, proporciona flexibilitat addicional).

MLOps - Llibre de cuina, capítol 1

També tenim fàcil accés a tots els models

MLOps - Llibre de cuina, capítol 1

i les seves versions

MLOps - Llibre de cuina, capítol 1

Com en el paràgraf anterior, totes les operacions es poden fer mitjançant l'API.

7. Desplegueu el model

En aquesta fase, ja tenim un model entrenat (keras). Un exemple de com podeu utilitzar-lo:

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

Aquí self.registry torna a ser un petit embolcall sobre mlflow.tracking.MlflowClient, per comoditat. La qüestió és que accedeixo a un servidor remot i hi busco un model amb el nom especificat i la darrera versió de producció. A continuació, descarrego l'artefacte localment a la carpeta ./model i construeixo el model des d'aquest directori mlflow.keras.load_model(local_path). Ara podem utilitzar el nostre model. Els desenvolupadors de CV (ML) poden millorar fàcilment el model i publicar noves versions.

en conclusió

Vaig presentar un sistema que permet:

  • emmagatzemar de manera centralitzada la informació sobre models d'ML, progrés i resultats de la formació;
  • desplegar ràpidament un entorn de desenvolupament;
  • supervisar i analitzar el progrés del treball en models;
  • és convenient versionar i gestionar l'estat dels models;
  • És fàcil desplegar els models resultants.

Aquest exemple és una joguina i serveix com a punt de partida per construir el vostre propi sistema, que pot incloure l'automatització de l'avaluació de resultats i el registre de models (punts 5 i 6, respectivament) o afegireu versions de conjunts de dades, o potser alguna altra cosa? El punt que estava intentant dir és que necessiteu MLOps en conjunt, MLflow és només un mitjà per aconseguir un fi.

Escriu quins problemes has trobat que no he mostrat?
Què afegiríeu al sistema per satisfer les vostres necessitats?
Quines eines i enfocaments utilitzeu per resoldre la totalitat o part dels problemes?

PD, us deixo un parell d'enllaços:
projecte github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
El meu correu electrònic de la feina, per a preguntes - ikryakin@croc.ru

La nostra empresa acull periòdicament diversos esdeveniments per a especialistes informàtics, per exemple: el 8 de juliol a les 19:00 hora de Moscou hi haurà una trobada de CV en format en línia, si hi esteu interessats, podeu participar, inscripció aquí .

Font: www.habr.com

Compreu allotjament fiable per a llocs amb protecció DDoS, servidors VPS VDS 🔥 Compra allotjament web fiable amb protecció DDoS, servidors VPS VDS | ProHoster