MLOps - Kookboek, hoofstuk 1

MLOps - Kookboek, hoofstuk 1

Hi almal! Ek is 'n CV-ontwikkelaar by CROC. Ons implementeer al vir 3 jaar projekte op die gebied van CV. Gedurende hierdie tyd het ons baie dinge gedoen, byvoorbeeld: ons het bestuurders gemonitor sodat hulle nie gedrink het nie, nie gerook het nie, nie oor die telefoon gepraat het nie, na die pad gekyk het en nie na drome of na die wolke nie. ; Ons het mense aangeteken wat in toegewyde bane ry en verskeie parkeerplekke opneem; verseker dat werkers helms, handskoene, ens. 'n werknemer geïdentifiseer wat die fasiliteit wil betree; Ons het alles getel wat ons kon.

Waarvoor doen ek dit alles?

In die proses om projekte te implementeer, tref ons stampe, baie stampe, sommige van die probleme waarmee jy óf vertroud is óf waarmee jy in die toekoms kennis gaan maak.

Kom ons simuleer die situasie

Kom ons stel ons voor dat ons werk gekry het by 'n jong maatskappy "N", wie se aktiwiteite verband hou met ML. Ons werk aan 'n ML (DL, CV) projek, dan skakel ons om die een of ander rede na 'n ander werk oor, neem gewoonlik 'n breek en keer terug na ons eie of iemand anders se neuron.

  1. Die oomblik van waarheid kom, jy moet op een of ander manier onthou waar jy opgehou het, watter hiperparameters jy probeer het en, bowenal, watter resultate hulle gelei het. Daar kan baie opsies wees vir wie inligting op alle bekendstellings gestoor het: in die kop, konfigurasies, notaboek, in 'n werksomgewing in die wolk. Ek het toevallig 'n opsie gesien wanneer hiperparameters gestoor is as kommentaarlyne in die kode, oor die algemeen 'n spoggerige vlug. Stel jou nou voor dat jy nie teruggekeer het na jou projek nie, maar na die projek van 'n persoon wat die maatskappy verlaat het en jy het 'n kode en 'n model genaamd model_1.pb geërf. Om die prentjie te voltooi en al die pyn oor te dra, kom ons verbeel ons dat jy ook 'n beginnerspesialis is.
  2. Gaan voort. Om die kode uit te voer, moet ons en almal wat daarmee sal werk 'n omgewing skep. Dit gebeur dikwels dat hulle hom om een ​​of ander rede nie as ons erfdeel nagelaat het nie. Dit kan ook 'n nie-triviale taak word. Jy wil nie tyd mors op hierdie stap nie, doen jy?
  3. Ons lei 'n model op (byvoorbeeld 'n motorverklikker). Ons kom by die punt waar dit baie goed word - dit is tyd om die resultaat te stoor. Kom ons noem dit car_detection_v1.pb. Dan lei ons nog een op - car_detection_v2.pb. 'n Ruk later leer ons kollegas of ons self meer en meer deur verskillende argitekture te gebruik. As gevolg hiervan word 'n klomp artefakte gevorm, waaroor inligting met moeite ingesamel moet word (maar ons sal dit later doen, want vir eers het ons meer prioriteitsake).
  4. OK, dit is nou verby! Ons het 'n model! Kan ons begin om die volgende model op te lei, 'n argitektuur te ontwikkel om 'n nuwe probleem op te los, of kan ons gaan tee drink? En wie sal ontplooi?

Identifisering van probleme

Om aan 'n projek of produk te werk is die werk van baie mense. En mettertyd vertrek en kom mense, daar is meer projekte, en die projekte self raak meer kompleks. Op een of ander manier sal situasies uit die siklus hierbo beskryf (en nie net nie) in sekere kombinasies van iterasie tot iterasie voorkom. Dit alles lei tot vermorsing van tyd, verwarring, senuwees, moontlik klante-ontevredenheid, en uiteindelik verlore geld. Alhoewel ons almal gewoonlik dieselfde ou hark volg, glo ek dat niemand hierdie oomblikke oor en oor wil herleef nie.

MLOps - Kookboek, hoofstuk 1

So, ons het deur een ontwikkelingsiklus gegaan en ons sien dat daar probleme is wat opgelos moet word. Om dit te doen benodig jy:

  • bêre werksresultate gerieflik;
  • maak die proses om nuwe werknemers te betrek eenvoudig;
  • die proses van ontplooiing van 'n ontwikkelingsomgewing te vereenvoudig;
  • konfigureer die modelweergaweproses;
  • 'n gerieflike manier hê om modelle te valideer;
  • vind 'n modelstaatbestuursinstrument;
  • vind 'n manier om modelle aan produksie te lewer.

Dit is blykbaar nodig om met 'n werkvloei vorendag te kom wat jou in staat sal stel om hierdie lewensiklus maklik en gerieflik te bestuur? Hierdie praktyk word MLOps genoem

MLOps, of DevOps vir masjienleer, laat datawetenskap- en IT-spanne toe om saam te werk en die tempo van modelontwikkeling en -ontplooiing te verhoog deur monitering, validering en bestuur vir masjienleermodelle.

Jy kan om te vereerWat dink die Google-ouens oor dit alles? Uit die artikel is dit duidelik dat MLOps nogal 'n lywige ding is.

MLOps - Kookboek, hoofstuk 1

Verder in my artikel sal ek slegs 'n deel van die proses beskryf. Vir implementering sal ek die MLflow-instrument gebruik, want... Dit is 'n oopbronprojek, 'n klein hoeveelheid kode word benodig om aan te sluit en daar is integrasie met gewilde ml-raamwerke. Jy kan op die internet soek vir ander hulpmiddels, soos Kubeflow, SageMaker, Treine, ens., en dalk een vind wat beter by jou behoeftes pas.

“Bou” MLO's deur die voorbeeld van die MLFlow-instrument te gebruik

MLFlow is 'n oopbronplatform vir lewensiklusbestuur van ml-modelle (https://mlflow.org/).

MLflow sluit vier komponente in:

  • MLflow Tracking - dek die kwessies van die opname van resultate en parameters wat tot hierdie resultaat gelei het;
  • MLflow Project - laat jou toe om kode te verpak en dit op enige platform te reproduseer;
  • MLflow-modelle - verantwoordelik vir die implementering van modelle na produksie;
  • MLflow Registry - laat jou toe om modelle te stoor en hul toestand in 'n gesentraliseerde bewaarplek te bestuur.

MLflow werk op twee entiteite:

  • bekendstelling is 'n volledige siklus van opleiding, parameters en maatstawwe waarvolgens ons wil registreer;
  • 'n Eksperiment is 'n "onderwerp" wat saamloop.

Alle stappe van die voorbeeld word op die Ubuntu 18.04-bedryfstelsel geïmplementeer.

1. Ontplooi die bediener

Om ons projek maklik te bestuur en al die nodige inligting te ontvang, sal ons 'n bediener ontplooi. MLflow-opspoorbediener het twee hoofkomponente:

  • backend-winkel - verantwoordelik vir die stoor van inligting oor geregistreerde modelle (ondersteun 4 DBMS'e: mysql, mssql, sqlite en postgresql);
  • artefakwinkel - verantwoordelik vir die stoor van artefakte (ondersteun 7 bergingsopsies: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP-bediener, SFTP Server, NFS, HDFS).

As die artefak winkel Vir eenvoud, kom ons neem 'n sftp-bediener.

  • skep 'n groep
    $ sudo groupadd sftpg
  • voeg 'n gebruiker by en stel 'n wagwoord vir hom in
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • pas 'n paar toegangsinstellings aan
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • voeg 'n paar reëls by /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • herbegin die diens
    $ sudo systemctl restart sshd

As die backend winkel Kom ons neem 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

Om die bediener te begin, moet jy die volgende python-pakkette installeer (ek beveel aan om 'n aparte virtuele omgewing te skep):

pip install mlflow
pip install pysftp

Kom ons begin ons bediener

$ 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. Voeg dop by

Om die resultate van ons opleiding nie verlore te gaan nie, toekomstige generasies ontwikkelaars om te verstaan ​​wat gebeur het, en vir ouer kamerade en jy om die leerproses rustig te kan ontleed, moet ons dop byvoeg. Nasporing beteken om parameters, statistieke, artefakte en enige bykomende inligting oor die begin van opleiding, in ons geval, op die bediener te stoor.

Ek het byvoorbeeld 'n klein projek op github op Keras vir die segmentering van alles wat in is COCO datastel. Om dop by te voeg, het ek 'n lêer mlflow_training.py geskep.

Hier is die reëls waar die interessantste dinge gebeur:

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)

Hier is self.remote_server 'n klein omhulsel oor die mlflow.tracking-metodes. MlflowClient (ek het dit gerieflikheidshalwe gemaak), met behulp waarvan ek 'n eksperiment skep en dit op die bediener laat loop. Vervolgens dui ek aan waar die bekendstellingsresultate saamgevoeg moet word (mlflow.set_tracking_uri(self.tracking_uri)). Ek aktiveer outomatiese aanteken mlflow.keras.autolog(). Tans ondersteun MLflow Tracking outomatiese aanteken vir TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. As jy nie jou raamwerk of biblioteek gevind het nie, kan jy altyd eksplisiet aanmeld. Ons begin met opleiding. Registreer etikette en invoerparameters op die afgeleë bediener.

'n Paar reëls en jy, soos almal anders, het toegang tot inligting oor alle bekendstellings. Koel?

3. Ons stel die projek op

Kom ons maak dit nou maklik om die projek te begin. Om dit te doen, voeg die MLproject- en conda.yaml-lêer by die projekwortel.
MLprojek

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 het verskeie eienskappe:

  • Naam - die naam van jou projek;
  • Omgewing - in my geval dui conda_env aan dat Anaconda gebruik word om te hardloop en die afhanklikheidsbeskrywing is in die conda.yaml-lêer;
  • Toegangspunte - dui aan watter lêers en met watter parameters ons kan hardloop (alle parameters word outomaties aangeteken wanneer opleiding begin)

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

Jy kan docker as jou runtime-omgewing gebruik, vir meer besonderhede verwys asseblief na dokumentasie.

4. Kom ons begin oefen

Ons kloon die projek en gaan na die projekgids:

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

Om te hardloop moet jy biblioteke installeer

pip install mlflow
pip install pysftp

Omdat in die voorbeeld wat ek gebruik conda_env, moet Anaconda op jou rekenaar geïnstalleer word (maar jy kan dit omseil deur al die nodige pakkette self te installeer en met die bekendstellingsparameters te speel).

Alle voorbereidende stappe is voltooi en ons kan begin om die opleiding te begin. Van die projekwortel:

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

Nadat die opdrag ingevoer is, sal 'n conda-omgewing outomaties geskep word en die opleiding sal begin.
In die voorbeeld hierbo het ek die aantal tydperke vir opleiding geslaag, die kategorieë waarin ons wil segmenteer (jy kan die volledige lys sien hier) en die adres van ons afgeleë bediener.
'n Volledige lys van moontlike parameters kan gevind word in die MLproject-lêer.

5. Evalueer leerresultate

Nadat ons die opleiding voltooi het, kan ons in die blaaier na die adres van ons bediener gaan http://server_host:server_port

MLOps - Kookboek, hoofstuk 1

Hier sien ons 'n lys van alle eksperimente (links bo), asook inligting oor lopies (middel). Ons kan meer gedetailleerde inligting (parameters, metrieke, artefakte en 'n paar bykomende inligting) vir elke bekendstelling bekyk.

MLOps - Kookboek, hoofstuk 1

Vir elke maatstaf kan ons die geskiedenis van veranderinge waarneem

MLOps - Kookboek, hoofstuk 1

Dié. Op die oomblik kan ons die resultate in 'n "handmatige" modus ontleed, en jy kan ook outomatiese validering opstel met behulp van die MLflow API.

6. Registreer die model

Nadat ons ons model ontleed het en besluit het dat dit gereed is vir geveg, gaan ons voort om dit te registreer, hiervoor kies ons die bekendstelling wat ons benodig (soos in die vorige paragraaf getoon) en gaan af.

MLOps - Kookboek, hoofstuk 1

Nadat ons ons model 'n naam gegee het, het dit 'n weergawe. As jy 'n ander model met dieselfde naam stoor, sal die weergawe outomaties opgegradeer word.

MLOps - Kookboek, hoofstuk 1

Vir elke model kan ons 'n beskrywing byvoeg en een van drie toestande kies (Staging, Production, Archived); vervolgens, met behulp van die API, kan ons toegang tot hierdie toestande kry, wat saam met weergawes addisionele buigsaamheid bied.

MLOps - Kookboek, hoofstuk 1

Ons het ook maklike toegang tot alle modelle

MLOps - Kookboek, hoofstuk 1

en hul weergawes

MLOps - Kookboek, hoofstuk 1

Soos in die vorige paragraaf, kan alle bewerkings met die API gedoen word.

7. Ontplooi die model

Op hierdie stadium het ons reeds 'n opgeleide (keras) model. 'n Voorbeeld van hoe jy dit kan gebruik:

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

Hier is self.registry weer 'n klein omhulsel oor mlflow.tracking.MlflowClient, gerieflikheidshalwe. Die punt is dat ek toegang tot 'n afgeleë bediener kry en 'n model daar soek met die gespesifiseerde naam, en die nuutste produksie weergawe. Vervolgens laai ek die artefak plaaslik af na die ./model-lêergids en bou die model uit hierdie gids mlflow.keras.load_model(local_path). Nou kan ons ons model gebruik. CV (ML) ontwikkelaars kan maklik die model verbeter en nuwe weergawes publiseer.

Ten slotte

Ek het 'n stelsel aangebied wat toelaat:

  • inligting oor ML-modelle, opleidingsvordering en resultate sentraal stoor;
  • ontplooi vinnig 'n ontwikkelingsomgewing;
  • moniteer en ontleed die vordering van werk aan modelle;
  • dit is gerieflik om die toestand van modelle te weergawe en te bestuur;
  • Dit is maklik om die resulterende modelle te ontplooi.

Hierdie voorbeeld is 'n speelding en dien as 'n beginpunt vir die bou van jou eie stelsel, wat outomatisering van evaluering van resultate en registrasie van modelle (onderskeidelik punte 5 en 6) kan insluit, of jy sal weergawe van datastelle byvoeg, of dalk iets anders? Die punt wat ek probeer maak is dat jy MLOps as 'n geheel nodig het, MLflow is net 'n middel tot 'n doel.

Skryf watter probleme jy teëgekom het wat ek nie gewys het nie?
Wat sal jy by die stelsel voeg om aan jou behoeftes te voldoen?
Watter gereedskap en benaderings gebruik jy om al of 'n deel van die probleme op te los?

PS ek sal 'n paar skakels los:
github projek - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
My werk e-pos vir vrae - [e-pos beskerm]

Ons maatskappy bied gereeld verskeie geleenthede vir IT-spesialiste aan, byvoorbeeld: op 8 Julie om 19:00 Moskou-tyd sal daar 'n CV-byeenkoms in 'n aanlyn-formaat wees, as jy belangstel, kan jy deelneem, registrasie hier .

Bron: will.com

Voeg 'n opmerking