MLOps — Köide, peatükk 1

MLOps — Köide, peatükk 1

Tere kõigile! Olen CV-arendaja ettevõttes KROK. Oleme juba kolm aastat ellu viinud projekte CV valdkonnas. Selle aja jooksul oleme teinud kõike, näiteks: jälginud juhte, et nad sõidu ajal ei joovaks, ei suitsetaks ega räägiks telefoniga, vaid vaataksid teed, mitte und või pilvi; fikseerinud armastajaid, kes sõidavad eraldi radadel ja võtavad mitmeid parkimiskohti; jälginud, et töötajad kannaksid kiivreid, kindaid jms; tuvastanud töötaja, kes soovib objektile pääseda; ja arvestanud kõike, mida suudame.

Miks ma kõik seda räägin?

Projektide elluviimise käigus oleme saanud palju õppetunde, palju õppetunde, osa probleemidest on teile tuttavad või tutvute nendega tulevikus.

Simuleerime olukorda

Kujutage ette, et olete tööle asunud noorde ettevõttesse "N", mille tegevus on seotud ML-iga. Me töötame ML (DL, CV) projekti kallal, aga mingil põhjusel lülitume üle teisele tööle, teeme pausi ja siis naaseme oma või kellegi teise närviveresse.

  1. Saabub tõe hetk, peame kuidagi meelde tuletama, millele oleme lõpetanud, milliseid hüperparameetreid oleme proovinud ja, mis kõige tähtsam, milliste tulemusteni need viisid. Võib olla palju erinevaid variante, kuidas info kõigi käivituste kohta salvestati: peas, konfiguratsioonifailides, sülearvutis, pilves töötavas keskkonnas. Olen näinud varianti, kus hüperparameetrid olid salvestatud kommentaaridena koodis, üldiselt fantaasia lend. Ja nüüd kujutage ette, et naasite mitte oma projekti juurde, vaid inimese projekti juurde, kes firmast lahkus ja päranduseks jäi teile kood ja mudel nimega model_1.pb. Täiesti pildi jaoks ja kogu valu edastamiseks kujutage ette, et olete ka algaja spetsialist.
  2. Jätkame. Koodi käivitamiseks peame meie ja kõik, kes sellega töötavad, looma keskkonna. Tihti juhtub, et seda ei jäeta meile päranduseks, samuti mingitel põhjustel. See võib samuti osutuda mitte triviaalseks ülesandeks. Sellele sammule ei tahaks aega raisata, eks?
  3. Koolitame mudelit (näiteks autode tuvastajat). Jõuame punkti, kus see saab üsna heaks — on aeg tulemus salvestada. Nimetame seda car_detection_v1.pb. Siis koolitame veel ühe — car_detection_v2.pb. Mõne aja pärast õpetavad meie kolleegid või meie ise veel ja veel, kasutades erinevaid arhitektuure. Lõpuks tekib suur hulk artefakte, mille kohta vajame hoolikat teabe kogumist (aga teeme seda hiljem, meil on hetkel prioriteetsed asjad).
  4. Noh, see ongi kõik! Meil on mudel! Saame alustada järgmise mudeli koolitamist, arhitektuuri väljatöötamist uue ülesande lahendamiseks või kas peame minema teed jooma? Aga kes tegeleb deployimisega?

Probleemide tuvastamine

Projekti või toote kallal töötamine on paljude inimeste töö. Aja jooksul lähevad inimesed minema ja tulevad uued, projekte tuleb järjest rohkem, ja need muutuvad järjest keerulisemaks. Ükskõik kuidas, ülaltoodud tsüklist (ja mitte ainult) tulenevad olukorrad esinevad erinevates kombinatsioonides kord-korralt. Kõik see viib ajakulu, segadusse, närvidele, võimalik, et kliendi rahulolematusele ja lõpuks — kaotatud raha. Kuigi me tavaliselt kõnnime vanade vahede peal, arvan, et keegi ei taha korduvalt neid hetki läbi elada.

MLOps — Köide, peatükk 1

Nii oleme läbinud ühe arendus.tsükli ja näeme, et on probleeme, mida tuleb lahendada. Selleks on vaja:

  • mugavalt salvestada töö tulemused;
  • teha uute töötajate kaasamise protsess lihtsaks;
  • lihtsustada arenduskeskkonna juurutamise protsessi;
  • seada modellide versioonihaldus korda;
  • omada mugavat mudelite valideerimise viisi;
  • leida tööriist mudelite seisundi haldamiseks;
  • leida viis mudelite edastamiseks tootmisse.

Ilmselt on vaja välja mõelda töövoog, mis võimaldaks seda elutsüklit lihtsalt ja mugavalt hallata? Sellise praktikaga on nimi MLOps.

MLOps, või DevOps masinõppe jaoks, võimaldab andmetöötlus- ja analüüsiekspertide ning IT-spetsialistide meeskondadel koostööd teha ja suurendada mudelite arendamise ja juurutamise kiirusen läbi jälgimise, kontrollimise ja mudelite haldamise süsteemi.

Saate lugeda, mida sellest kõigest arvavad Google'i poisid. Artiklist selgub, et MLOps on üsna ulatuslik teema.

MLOps — Köide, peatükk 1

Edasi oma artiklis kirjeldan vaid osa protsessist. Rakendamiseks kasutan MLflow tööriista, kuna see on avatud lähtekoodiga projekt, mille ühendamiseks on vajalik väike kogus koodi ja see integreerub populaarsete ML-rammetega. Saate internetist otsida ka teisi tööriistu, näiteks Kubeflow, SageMaker, Trains jne, ning võib-olla leida selle, mis teie vajadustega paremini sobib.

"Ehitatakse" MLOps MLFlow tööriista näitel

MLFlow on avatud lähtekoodiga platvorm ML mudelite elutsükli haldamiseks (https://mlflow.org/).

MLflow sisaldab nelja komponenti:

  • MLflow Tracking - katab tulemuste ja parameterite fikseerimise küsimused, mis viivad selleni;
  • MLflow Project - võimaldab pakendada koodi ja seda mis tahes platvormil taasluua;
  • MLflow Models - vastutab mudelite produktiseerimise eest;
  • MLflow Registry - võimaldab hoida mudeleid ja hallata nende olekut tsentraliseeritud hoidlas.

MLflow opereerib kahe entiteediga:

  • käivitus - see on täislitsentsimise tsükkel, parameetrid ja mõõdikud, mida soovime registreerida;
  • eksperiment - see on "teema", mille alla on koondatud käivitused.

Kõik näite sammud on teostatud operatsioonisüsteemil Ubuntu 18.04.

1. Käivitame serveri

Kuna soovime oma projekti hõlpsasti hallata ja saada kogu vajalikku teavet, käivitame serveri. MLflow jälgimisserveril on kaks peamist komponenti:

  • backend store - vastutab registreeritud mudelite teabe hoidmise eest (toetab 4 andmebaasi: mysql, mssql, sqlite ja postgresql);
  • artifact store - vastutab artefaktide hoidmise eest (toetab 7 salvestamise varianti: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP server, NFS, HDFS).

Kuna artifact store lihtsuse huvides võtame SFTP server.

  • loome grupi
    $ sudo groupadd sftpg
  • lisame kasutaja ja seame talle parooli
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • korraldame paar juurdepääsu seadet
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • lisame paar rida /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • taaskäivitame teenuse
    $ sudo systemctl restart sshd

Kuna backend store võtame 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
# Loo uue kasutaja: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Sisestage lisatava rolli nimi: mlflow_user
Sisestage uue rolli parool: mlflow
Sisestage see uuesti: mlflow
Kas uus roll on superkasutaja? (y/n) n
Kas uuele rollile lubatakse andmebaaside loomine? (y/n) n
Kas uuele rollile lubatakse luua uusi rolle? (y/n) n
# Looge andmebaas mlflow_bd, mille omanik on mlflow_user
$ createdb -O mlflow_user mlflow_db

Serveri käivitamiseks on vajalik paigaldada järgmised Python paketid (soovitan luua eraldi virtuaalne keskkond):

pip install mlflow
pip install pysftp

Käivitage meie server

$ 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. Lisame jälgimise

Kuna meie treeningute tulemused ei tohi kaduda, et tulevased arendajad mõistaksid, mis toimub, ning vanemad kolleegid ja teie saaksite analüüsida õppimisprotsessi, on meil vajalik lisada jälgimine. Jälgimise all mõistetakse parameetrite, mõõdikute, artefaktide ja muu täiendava teabe kogumist õppimise käivitamise kohta, meie puhul serveris.

Näiteks olen loonud väikese projekti githubis Kerasel, mis tegeleb segmenteerimisega kõigest, mis on COCO andmesetsist. Jälgimise lisamiseks olen loonud faili mlflow_training.py.

Siin on read, kus toimub kõige huvitavam:

def run(self, epochs, lr, experiment_name):
        # saame eksperimendi id, luues eksperimendi, kui seda pole
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # loome "run" ja saame selle id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # märgime, et soovime salvestada tulemusi kaugserverisse
        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)

Siin self.remote_server on väike mähis mlflow.tracking meetodite üle. MlflowClient (tegin mugavuse huvides), mille abil loon eksperimendi ja käivituse serveris. Seejärel näitan, kuhu tulemused peavad suunduma (mlflow.set_tracking_uri(self.tracking_uri)). Ühendame automaatse logimise mlflow.keras.autolog(). Hetkel toetab MLflow Tracking automaatset logimist TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark jaoks. Kui te ei leia oma raamistiku või teeki, saate alati logida otseselt. Käivitame õppimise. Registreerime sildid ja sisendparameetrid eemalserveris.

Mõne rea ja te olete, nagu kõik teised, saanud juurdepääsu kogu käivituste teabele. Lahe?

3. Kujundame projekti

Nüüd muudame projekti käivitamise võimalikult lihtsaks. Selleks lisame projekti juurkausta faili MLproject ja conda.yaml.
MLproject

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'coco andmestiku kategooriate loend'}
        epochs: {type: int, help: 'õppe epohhide arv'}

        lr: {type: float, default: 0.001, help: 'õppimise määr'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'nt resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'serveri aadress'}
        experiment_name: {type: str, default: 'My_experiment', help: 'kaug- ja kohalik eksperimendi nimi'}
    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’il on mitmeid omadusi:

  • Name — teie projekti nimi;
  • Environment — minu puhul conda_env viitab sellele, et käivitamiseks kasutatakse Anacondat ja sõltuvuste kirjeldus on failis conda.yaml;
  • Entry Points — näitab, milliseid faile ja milliste parameetritega saame käivitada (kõik parameetrid logitakse automaatselt õppe käivitamise ajal)

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

Käidutootmise keskkonnana saate kasutada dockerit, lisainformatsiooni leiate dokumentatsioon.

4. Käivitame õppimise

Kloonime projekti ja liigume projekti katalooge:

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

Käivitamiseks peate installima teegid

pip install mlflow
pip install pysftp

Kuna ma kasutan näites conda_env, peaks teie arvutis olema installitud Anaconda (aga sellest saab mööda hiilida, installides kõik vajalikud paketid käsitsi ja katsetades käivitamisparameetreid).

Kõik ettevalmistavad sammud on lõpule viidud ja saame alustada treenimise käivitamist. Projektijuurest:

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

Käsku sisestades luuakse automaatselt conda keskkond ja treening algab.
Eelnevas näites edastasin treeningu epohhide arvu ja kategooriad, mille järgi me tahame segmenteerida (täieliku nimekirja saab vaadata siin) ja meie kaugserveri aadressi.
Kogu võimalike parameetrite nimekirja saab vaadata failis MLproject.

5. Hindame treeningu tulemusi

Pärast treeningu lõppu saame brauseris minna meie serveri aadressile http://server_host:server_port

MLOps — Köide, peatükk 1

Siin näeme kõigi katsete loendit (vasakus ülanurgas), samuti käivituste infot (keskel). Saame vaadata iga käivituse kohta üksikasjalikku teavet (parameetrid, statistika, artefaktid ja mõningat täiendavat teavet).

MLOps — Köide, peatükk 1

Iga statistika kohta saame jälgida ajalugu

MLOps — Köide, peatükk 1

See tähendab, et praegu saame analüüsida tulemusi "käsi" režiimis, samuti saate seadistada ka automaatse valideerimise MLflow API abil.

6. Registreerime mudeli

Pärast seda, kui oleme analüüsinud oma mudelit ja otsustanud, et see on valmis, alustame selle registreerimist, valides vajalikku käivitust (nagu eelnevas punktis näidatud) ja liikudes allapoole.

MLOps — Köide, peatükk 1

Pärast mudeli nime andmist saab see versiooni. Kui salvestame teise mudeli sama nimega, suureneb versioon automaatselt.

MLOps — Köide, peatükk 1

Iga mudeli jaoks saame lisada kirjelduse ja valida ühe kolmest seisundist (Staging, Production, Archived), mille abil saame hiljem API kaudu nendesse seisunditesse viidata, mis koos versiooniga annab meelerahu.

MLOps — Köide, peatükk 1

Meil on ka mugav juurdepääs kõikidele mudelitele

MLOps — Köide, peatükk 1

ja nende versioonidele.

MLOps — Köide, peatükk 1

Nagu eelnevas punktis, saab kõik toimingud teha API abil.

7. Deploreerime mudeli

Selles etapis on meil juba treenitud (keras) mudel. Näide selle kasutamisest:

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

Siin self.registry on taas väike pealispind mlflow.tracking.MlflowClient'i ümber, mugavuse huvides. Oluline on see, et ma pöördun kaugserveri poole ja otsin sealt mudelit, mille nimi on antud, ja otsin kõige viimase tootmisversiooni. Edasi laadin artefakti kohalikku kausta './model' ja kogun mudeli sellest kataloogist mlflow.keras.load_model(local_path). Nüüd saame oma mudelit kasutada. CV (ML) arendajad saavad rahus mudelit täiustada ja uusi versioone välja anda.

Kokkuvõtteks

Ma esitlesin süsteemi, mis võimaldab:

  • keskse teabe hoidmine ML mudelite, koolituse käigu ja tulemuste kohta;
  • kiirelt arendada arenduskeskkonda;
  • jälgida ja analüüsida mudelite arendusprotsessi;
  • mugavalt versioonimist teha ja hallata mudelite seisundit;
  • lihtsalt deployerida saadud mudeleid.

Käesolev näide on mänguline ja on teie isikliku süsteemi rajamise alguspunkt, mis võib-olla sisaldab automatiseeritud tulemuste hindamist ja mudelite registreerimist (p.5 ja p.6 vastavalt) või lisate andmestike versioonimist või veel midagi muud? Proovisin edastada mõtte, et vajate MLOpsi laiemalt, MLflow on vaid vahend eesmärgi saavutamiseks.

Palun kirjutage, milliseid probleeme olete kogenud, mida ma ei kajastanud?
Mida te lisaksite süsteemi, et see kataks teie vajadusi?
Milliseid tööriistu ja lähenemisviise kasutate, et lahendada kõiki või osa probleemidest?

P.S. Jätan paar linki:
github projekt — https://github.com/simbakot/mlflow_example
MLflow — https://mlflow.org/
Minu töömeil küsimuste jaoks — ikryakin@croc.ru

Meie ettevõttes korraldatakse aeg-ajalt erinevaid üritusi IT-spetsialistidele, näiteks: 8. juulil kell 19:00 MSk toimub CV teemaline online-mitap. Kui olete huvitatud, siis võite osaleda, registreeruge. siin .

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster