MLOps - Kuharica, 1. poglavlje

MLOps - Kuharica, 1. poglavlje

Bok svima! Ja sam CV developer u CROC-u. Projekte iz područja životopisa provodimo već 3 godine. Za to vrijeme puno toga smo napravili, na primjer: pratili smo vozače da u vožnji ne piju, ne puše, ne razgovaraju na telefon, gledaju u cestu, a ne u snove ili oblake. ; Zabilježili smo ljude koji voze za to predviđenim trakama i zauzimaju nekoliko parkirnih mjesta; osigurali da radnici nose kacige, rukavice itd.; identificirao djelatnika koji želi ući u objekt; Brojali smo sve što smo mogli.

Zašto sve ovo radim?

U procesu realizacije projekata nailazili smo na neravnine, puno neravnina, neki od problema s kojima ste ili upoznati ili ćete se u budućnosti upoznati.

Simulirajmo situaciju

Zamislimo da smo dobili posao u mladoj tvrtki "N", čije su aktivnosti vezane uz ML. Radimo na ML (DL, CV) projektu, onda se iz nekog razloga prebacimo na drugi posao, uglavnom napravimo pauzu i vratimo se svom ili tuđem neuronu.

  1. Dolazi trenutak istine, morate se nekako sjetiti gdje ste stali, koje ste hiperparametre isprobali i, što je najvažnije, do kakvih su rezultata doveli. Može postojati mnogo opcija za to tko je pohranio informacije o svim pokretanjima: u glavi, konfiguracijama, bilježnici, u radnom okruženju u oblaku. Slučajno sam vidio opciju kada su hiperparametri pohranjeni kao komentirani redovi u kodu, općenito, maštovitost. Sada zamislite da ste se vratili ne svom projektu, već projektu osobe koja je napustila tvrtku i naslijedili ste šifru i model model_1.pb. Da bismo dovršili sliku i prenijeli svu bol, zamislimo da ste i vi specijalist početnik.
  2. Samo naprijed. Za pokretanje koda, mi i svi koji će s njim raditi moramo stvoriti okruženje. Često se događa da nam ga iz nekog razloga nisu ostavili u nasljedstvo. Ovo također može postati netrivijalan zadatak. Ne želite gubiti vrijeme na ovaj korak, zar ne?
  3. Osposobljavamo model (na primjer, detektor automobila). Dolazimo do točke kada postaje vrlo dobro - vrijeme je da sačuvamo rezultat. Nazovimo ga car_detection_v1.pb. Zatim treniramo još jedan - car_detection_v2.pb. Nešto kasnije, naše kolege ili mi sami podučavamo sve više i više, koristeći različite arhitekture. Kao rezultat toga, formira se hrpa artefakata, informacije o kojima se moraju mukotrpno prikupljati (ali to ćemo učiniti kasnije, jer za sada imamo prioritetnije stvari).
  4. OK, sada je sve gotovo! Imamo model! Možemo li početi trenirati sljedeći model, razvijati arhitekturu za rješavanje novog problema ili možemo otići na čaj? A tko će rasporediti?

Identificiranje problema

Rad na projektu ili proizvodu posao je mnogih ljudi. I s vremenom ljudi odlaze i dolaze, projekata je sve više, a sami projekti postaju kompleksniji. Na ovaj ili onaj način, situacije iz gore opisanog ciklusa (i ne samo) u određenim kombinacijama događat će se iz iteracije u iteraciju. Sve to rezultira izgubljenim vremenom, zbunjenošću, živcima, moguće nezadovoljstvom kupaca i na kraju izgubljenim novcem. Iako se svi uglavnom krećemo istim starim načinom, vjerujem da nitko ne želi proživljavati te trenutke iznova i iznova.

MLOps - Kuharica, 1. poglavlje

Dakle, prošli smo jedan razvojni ciklus i vidimo da postoje problemi koje treba riješiti. Da biste to učinili potrebno vam je:

  • prikladno pohraniti rezultate rada;
  • učiniti proces uključivanja novih zaposlenika jednostavnim;
  • pojednostaviti proces postavljanja razvojnog okruženja;
  • konfigurirati proces izrade verzija modela;
  • imaju prikladan način za provjeru valjanosti modela;
  • pronaći model alata za upravljanje stanjem;
  • pronaći način isporuke modela u proizvodnju.

Očigledno je potrebno osmisliti tijek rada koji bi vam omogućio jednostavno i praktično upravljanje ovim životnim ciklusom? Ova praksa se zove MLOps

MLOps ili DevOps za strojno učenje omogućuje timovima za podatkovnu znanost i IT da surađuju i ubrzaju razvoj i implementaciju modela kroz praćenje, provjeru valjanosti i upravljanje modelima strojnog učenja.

Možeš čitatiŠto Googleovi dečki misle o svemu ovome? Iz članka je jasno da je MLOps prilično pozamašna stvar.

MLOps - Kuharica, 1. poglavlje

Dalje u svom članku opisat ću samo dio procesa. Za implementaciju ću koristiti MLflow alat jer... Ovo je projekt otvorenog koda, potrebna je mala količina koda za povezivanje i postoji integracija s popularnim ml okvirima. Na internetu možete pretraživati ​​druge alate, kao što su Kubeflow, SageMaker, Trains itd., i možda pronaći onaj koji više odgovara vašim potrebama.

“Izgradnja” MLO-ova na primjeru korištenja alata MLFlow

MLFlow je platforma otvorenog koda za upravljanje životnim ciklusom ml modela (https://mlflow.org/).

MLflow uključuje četiri komponente:

  • MLflow Tracking - pokriva problematiku bilježenja rezultata i parametara koji su doveli do tog rezultata;
  • MLflow Project - omogućuje vam pakiranje koda i njegovu reprodukciju na bilo kojoj platformi;
  • MLflow Models - odgovoran za implementaciju modela u proizvodnju;
  • MLflow Registar - omogućuje pohranjivanje modela i upravljanje njihovim stanjem u centraliziranom repozitoriju.

MLflow djeluje na dva entiteta:

  • lansiranje je puni ciklus obuke, parametara i metrika po kojima se želimo registrirati;
  • Eksperiment je "tema" koja teče zajedno.

Svi koraci primjera implementirani su na Ubuntu 18.04 operativnom sustavu.

1. Postavite poslužitelj

Kako bismo lakše upravljali našim projektom i primali sve potrebne informacije, postavit ćemo server. MLflow poslužitelj za praćenje ima dvije glavne komponente:

  • backend store - odgovoran za pohranu informacija o registriranim modelima (podržava 4 DBMS-a: mysql, mssql, sqlite i postgresql);
  • skladište artefakata - odgovorno za pohranu artefakata (podržava 7 opcija pohrane: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP poslužitelj, SFTP poslužitelj, NFS, HDFS).

Kao skladište artefakata Radi jednostavnosti, uzmimo sftp poslužitelj.

  • stvoriti grupu
    $ sudo groupadd sftpg
  • dodajte korisnika i postavite mu lozinku
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • podešavanje nekoliko postavki pristupa
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • dodajte nekoliko redaka u /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • ponovno pokrenite uslugu
    $ sudo systemctl restart sshd

Kao pozadinska trgovina Uzmimo 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

Za pokretanje poslužitelja morate instalirati sljedeće python pakete (preporučam stvaranje zasebnog virtualnog okruženja):

pip install mlflow
pip install pysftp

Pokrenimo naš 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. Dodajte praćenje

Kako se rezultati našeg treninga ne bi izgubili, buduće generacije programera razumjele što se događa, a kako biste stariji suborci i vi mogli mirno analizirati proces učenja, moramo dodati praćenje. Praćenje podrazumijeva spremanje parametara, metrika, artefakata i svih dodatnih informacija o početku treninga, u našem slučaju, na server.

Na primjer, stvorio sam mali projekt na githubu na Kerasu za segmentiranje svega što je unutra Skup podataka COCO. Da bih dodao praćenje, napravio sam datoteku mlflow_training.py.

Evo redaka u kojima se događaju najzanimljivije stvari:

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)

Ovdje je self.remote_server mali omotač nad metodama mlflow.tracking. MlflowClient (napravio sam ga radi praktičnosti), uz pomoć kojeg kreiram eksperiment i pokrećem ga na poslužitelju. Zatim ću naznačiti gdje se rezultati pokretanja trebaju spojiti (mlflow.set_tracking_uri(self.tracking_uri)). Omogućavam automatsko bilježenje mlflow.keras.autolog(). Trenutno MLflow Tracking podržava automatsko bilježenje za TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ako niste pronašli svoj okvir ili biblioteku, uvijek se možete eksplicitno prijaviti. Počinjemo s treninzima. Registrirajte oznake i ulazne parametre na udaljenom poslužitelju.

Nekoliko redaka i vi, kao i svi ostali, imate pristup informacijama o svim lansiranjima. Cool?

3. Izrađujemo projekt

Sada olakšajmo pokretanje projekta. Da biste to učinili, dodajte MLproject i conda.yaml datoteku u korijen projekta.
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}"

Projekt MLflow ima nekoliko svojstava:

  • Naziv - naziv vašeg projekta;
  • Okolina - u mom slučaju, conda_env označava da se Anaconda koristi za pokretanje, a opis ovisnosti nalazi se u datoteci conda.yaml;
  • Ulazne točke - označava koje datoteke i s kojim parametrima možemo pokrenuti (svi parametri se automatski bilježe prilikom pokretanja treninga)

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

Možete koristiti docker kao svoje runtime okruženje, za više detalja pogledajte dokumentacija.

4. Krenimo s treninzima

Kloniramo projekt i idemo u direktorij projekta:

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

Za pokretanje morate instalirati biblioteke

pip install mlflow
pip install pysftp

Jer u primjeru koji koristim conda_env, Anaconda mora biti instalirana na vašem računalu (ali to možete zaobići tako da sami instalirate sve potrebne pakete i igrate se s parametrima pokretanja).

Svi pripremni koraci su završeni i možemo započeti s obukom. Iz korijena projekta:

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

Nakon unosa naredbe automatski će se kreirati conda okruženje i započet će obuka.
U gornjem primjeru sam proslijedio broj epoha za obuku, kategorije u koje želimo segmentirati (možete vidjeti cijeli popis здесь) i adresu našeg udaljenog poslužitelja.
Kompletan popis mogućih parametara može se pronaći u datoteci MLproject.

5. Ocijenite rezultate učenja

Nakon završene obuke, možemo u pregledniku otići na adresu našeg poslužitelja http://server_host:server_port

MLOps - Kuharica, 1. poglavlje

Ovdje vidimo popis svih eksperimenata (gore lijevo), kao i informacije o izvođenjima (u sredini). Možemo vidjeti detaljnije informacije (parametre, metrike, artefakte i neke dodatne informacije) za svako pokretanje.

MLOps - Kuharica, 1. poglavlje

Za svaku metriku možemo promatrati povijest promjena

MLOps - Kuharica, 1. poglavlje

Oni. Trenutno možemo analizirati rezultate u “ručnom” načinu rada, a također možete postaviti automatsku provjeru pomoću MLflow API-ja.

6. Registrirajte model

Nakon što smo analizirali naš model i odlučili da je spreman za bitku, nastavljamo s registracijom, za to odabiremo lansiranje koje nam je potrebno (kao što je prikazano u prethodnom odlomku) i idemo dolje.

MLOps - Kuharica, 1. poglavlje

Nakon što našem modelu damo ime, on ima verziju. Ako spremite drugi model s istim imenom, verzija će se automatski nadograditi.

MLOps - Kuharica, 1. poglavlje

Za svaki model možemo dodati opis i odabrati jedno od tri stanja (Staging, Production, Archived), a zatim pomoću API-ja možemo pristupiti tim stanjima, što uz verzioniranje daje dodatnu fleksibilnost.

MLOps - Kuharica, 1. poglavlje

Također imamo jednostavan pristup svim modelima

MLOps - Kuharica, 1. poglavlje

i njihove verzije

MLOps - Kuharica, 1. poglavlje

Kao iu prethodnom odlomku, sve se operacije mogu obaviti pomoću API-ja.

7. Postavite model

U ovoj fazi već imamo istrenirani (keras) model. Primjer kako ga možete koristiti:

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

Ovdje je self.registry ponovno mali omot preko mlflow.tracking.MlflowClient, radi praktičnosti. Poanta je da pristupim udaljenom serveru i tamo potražim model s navedenim imenom i zadnjom produkcijskom verzijom. Zatim preuzimam artefakt lokalno u mapu ./model i gradim model iz ovog direktorija mlflow.keras.load_model(local_path). Sada možemo koristiti naš model. CV (ML) programeri mogu lako poboljšati model i objaviti nove verzije.

U zaključku

Predstavio sam sustav koji omogućuje:

  • centralno pohraniti informacije o ML modelima, napretku i rezultatima obuke;
  • brzo implementirati razvojno okruženje;
  • pratiti i analizirati tijek rada na modelima;
  • prikladno je kreirati verzije i upravljati stanjem modela;
  • Lako je implementirati rezultirajuće modele.

Ovaj primjer je igračka i služi kao početna točka za izgradnju vlastitog sustava, koji može uključivati ​​automatizaciju evaluacije rezultata i registraciju modela (točke 5 i 6, respektivno) ili ćete dodati verziju skupova podataka, ili možda nešto treće? Poanta koju sam pokušavao istaknuti je da trebate MLOps kao cjelinu, MLflow je samo sredstvo za postizanje cilja.

Napišite na koje ste probleme naišli, a nisam ih prikazao?
Što biste dodali sustavu da bi zadovoljio vaše potrebe?
Koje alate i pristupe koristite za rješavanje svih ili dijela problema?

PS Ostaviću par linkova:
github projekt - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Moja poslovna e-pošta za pitanja - [e-pošta zaštićena]

Naša tvrtka povremeno ugošćuje razne događaje za IT stručnjake, na primjer: 8. srpnja u 19:00 po moskovskom vremenu održat će se CV susret u online formatu, ako ste zainteresirani, možete sudjelovati, registracija здесь .

Izvor: www.habr.com

Dodajte komentar