MLOps — Kokbok, kapitel 1

MLOps — Kokbok, kapitel 1

Hej alla! Jag Àr CV-utvecklare pÄ KROK. Under de senaste tre Ären har vi genomfört projekt inom CV. Under denna tid har vi gjort mÄnga saker, till exempel: övervakat förare för att sÀkerstÀlla att de inte dricker, röker, pratar i telefon, och att de tittar pÄ vÀgen istÀllet för att drömma eller titta pÄ molnen; registrerat dem som gillar att köra i specifika filer och ocjera flera parkeringsplatser; sÄg till att arbetare bÀr hjÀlmar, handskar och sÄ vidare; identifierat anstÀllda som vill gÄ in pÄ omrÄdet; rÀknat allt som gÄr att rÀkna.

Vad Àr poÀngen med detta?

Under genomförandet av projekten har vi stött pÄ mÄnga hinder, en del av problemen kÀnner ni kanske till, eller kommer att fÄ kÀnna igen i framtiden.

LÄt oss modellera en situation

FörestÀll dig att vi börjar pÄ ett ungt företag "N", vars verksamhet Àr kopplad till ML. Vi arbetar med ett ML (DL, CV) projekt, och av nÄgon anledning gÄr vi över till ett annat jobb, tar en paus, och ÄtervÀnder till vÄrt eller nÄgon annans neurala nÀtverk.

  1. Det Àr dags för sanningen, vi mÄste pÄ nÄgot sÀtt komma ihÄg var vi slutade, vilka hyperparametrar vi testade och, viktigast av allt, vilka resultat de gav. Det kan finnas mÄnga sÀtt att spara information om alla körningar: i huvudet, i konfigurationer, i anteckningsböcker, i arbetsmiljön i molnet. Jag har sett en lösning dÀr hyperparametrar sparades som kommenterade rader i koden, en riktig fantasi. TÀnk nu att du inte ÄtervÀnder till ditt eget projekt, utan till ett projekt av en person som lÀmnat företaget, och du har fÄtt koden och modellen som heter model_1.pb. För att ge en fullstÀndig bild och överföra all smÀrta, förestÀll dig att du dessutom Àr en nybörjare.
  2. Vi gÄr vidare. För att köra koden behöver vi, och alla som ska arbeta med den, skapa en miljö. Det hÀnder ofta att vi ocksÄ av nÄgon anledning inte har fÄtt den i arv. Detta kan ocksÄ bli en icke-trivsam uppgift. Man vill ju inte spendera tid pÄ det hÀr steget, eller hur?
  3. TrĂ€nar modellen (till exempel, en bil-detektor). Vi nĂ„r en punkt dĂ€r den blir ganska bra — det Ă€r dags att spara resultatet. Vi kallar den car_detection_v1.pb. Sedan trĂ€nar vi en till — car_detection_v2.pb. En tid senare trĂ€nar vĂ„ra kollegor, eller vi sjĂ€lva, fler och fler, med olika arkitekturer. Slutligen samlas en hel del artefakter, vars information vi behöver noggrant samla in (men det fĂ„r vi ta senare, vi har ju mer prioriterade saker just nu).
  4. Och dÀr har vi det! Vi har en modell! Vi kan börja trÀna nÀsta modell, utveckla en arkitektur för att lösa ett nytt problem, eller ska vi gÄ och ta en kopp te? Men vem ska deploya den?

Identifiera problem

Arbete med projekt eller produkter Ă€r resultatet av mĂ„nga mĂ€nniskors insatser. Med tiden gĂ„r mĂ€nniskor, och nya kommer, projekten ökar i antal, och projekten blir mer komplexa. SĂ„ eller sĂ„, situationer frĂ„n stegen ovan (och inte bara) kommer att dyka upp i olika kombinationer frĂ„n iteration till iteration. Allt detta resulterar i tidsförlust, förvirring, stress, och kanske missnöje frĂ„n kunden, vilket i slutĂ€ndan kan leda till förlorade pengar. Även om vi oftast trampar i samma gamla fĂ€llor, tror jag ingen vill uppleva dessa situationer om och om igen.

MLOps — Kokbok, kapitel 1

SÄ, vi har genomgÄtt ett utvecklingscykel och ser att det finns problem som behöver lösas. För detta behöver vi:

  • en bekvĂ€m lagring för arbetsresultat;
  • göra det enkelt att involvera nya anstĂ€llda;
  • förenkla processen för att sĂ€tta upp utvecklingsmiljöer;
  • stĂ€lla in processer för versionshantering av modeller;
  • ha en enkel metod för validering av modeller;
  • hitta ett verktyg för att hantera modellens tillstĂ„nd;
  • hitta sĂ€tt att leverera modeller till produktion.

Det verkar nödvÀndigt att skapa ett arbetsflöde som gör det enkelt att hantera denna livscykel? En sÄdan praxis kallas MLOps.

MLOps, eller DevOps för maskininlÀrning, gör det möjligt för team av databehandlare, analytiker och IT-specialister att samarbeta och öka hastigheten pÄ utvecklingen och distributionen av modeller genom övervakning, verifiering och hanteringssystem för maskininlÀrningsmodeller.

Du kan lÀsa, vad grabbarna pÄ Google tycker om allt detta. I artikeln framgÄr det att MLOps Àr ganska omfattande.

MLOps — Kokbok, kapitel 1

I nÀsta del av min artikel kommer jag att beskriva endast en del av processen. För implementeringen kommer jag att anvÀnda verktyget MLflow, eftersom det Àr ett open-source projekt, och för att koppla upp det behövs en relativt liten mÀngd kod samt integration med populÀra ML-ramverk. Du kan söka pÄ internet efter andra verktyg, som Kubeflow, SageMaker, Trains, etc., och kanske hitta ett som passar dina behov bÀttre.

"Bygger" MLOps med hjÀlp av verktyget MLFlow

MLFlow Àr en plattform med öppen kÀllkod för hantering av livscykeln för ML-modeller (https://mlflow.org/).

MLflow omfattar fyra komponenter:

  • MLflow Tracking – hanterar frĂ„gor kring registrering av resultat och parametrar som ledde till det resultatet;
  • MLflow Project – lĂ„ter dig paketera kod och reproducera den pĂ„ vilken plattform som helst;
  • MLflow Models – ansvarar för driftsĂ€ttning av modeller i produktion;
  • MLflow Registry – lĂ„ter dig lagra modeller och hantera deras tillstĂ„nd i ett centraliserat förrĂ„d.

MLflow arbetar med tvÄ enheter:

  • en körning – det Ă€r en fullstĂ€ndig cykel av trĂ€ning, parametrar och metoder som vi vill registrera;
  • ett experiment – det Ă€r ett "Ă€mne" som förenar körningar.

Alla steg i exemplet Àr implementerade pÄ operativsystemet Ubuntu 18.04.

1. SĂ€tter upp servern

För att vi enkelt ska kunna hantera vÄrt projekt och fÄ all nödvÀndig information, ska vi sÀtta upp en server. MLflow tracking server bestÄr av tvÄ huvudkomponenter:

  • backend store – ansvarar för att lagra information om registrerade modeller (stödjer 4 databashanterare: mysql, mssql, sqlite och postgresql);
  • artifact store – ansvarar för att lagra artefakter (stödjer 7 lagringsalternativ: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP-server, SFTP-server, NFS, HDFS).

Som artifact store för enkelhetens skull tar vi en sftp-server.

  • skapar en grupp
    $ sudo groupadd sftpg
  • lĂ€gger till en anvĂ€ndare och stĂ€ller in ett lösenord
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • justerar nĂ„gra instĂ€llningar för Ă„tkomst
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • lĂ€gger till nĂ„gra rader i /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • startar om tjĂ€nsten
    $ sudo systemctl restart sshd

Som backend store vi tar 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
# Skapa ny anvÀndare: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Ange namn pÄ rollen som ska lÀggas till: mlflow_user
Ange lösenord för ny roll: mlflow
Skriv in det igen: mlflow
Ska den nya rollen vara superanvÀndare? (j/n) n
Ska den nya rollen fÄ skapa databaser? (j/n) n
Ska den nya rollen fÄ skapa fler nya roller? (j/n) n
# Skapa databas mlflow_bd Àgd av mlflow_user
$ createdb -O mlflow_user mlflow_db

För att starta servern mÄste följande python-paket installeras (jag rekommenderar att skapa en separat virtuell miljö):

pip install mlflow
pip install pysftp

Vi startar vÄr 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. LÀgga till spÄrning

För att se till att resultaten av vÄra trÀningar inte gÄr förlorade, att framtida generationer av utvecklare förstÄr vad som faktiskt hÀnde, och att Àldre kollegor och du sjÀlva kan analysera utbildningsprocessen, mÄste vi lÀgga till spÄrning. Med spÄrning menas att spara parametrar, metrik, artefakter och all annan ytterligare information om utbildningskörningarna, i vÄrt fall, pÄ servern.

Som exempel har jag skapat ett litet projekt pÄ github med Keras för segmentering av allt som finns i COCO-datasettet. För att lÀgga till spÄrning har jag skapat filen mlflow_training.py.

HÀr Àr raderna dÀr den verkliga handlingen sker:

def run(self, epochs, lr, experiment_name):
        # fÄr id för experimentet, skapar ett experiment om det saknas
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # skapar en "run" och fÄr dess id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # ange att vi vill spara resultaten pÄ en fjÀrrserver
        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)

HÀr Àr self.remote_server ett litet wrapper runt metoderna mlflow.tracking. MlflowClient (gjorde jag för bekvÀmlighet), med hjÀlp av vilka jag skapar ett experiment och en körning pÄ servern. Sedan anger jag var resultaten frÄn körningen ska sparas (mlflow.set_tracking_uri(self.tracking_uri)). Jag aktiverar automatisk loggning mlflow.keras.autolog(). För tillfÀllet stöder MLflow Tracking automatisk loggning för TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Om du inte hittar ditt ramverk eller bibliotek kan du alltid logga explicit. Vi startar utbildningen. Vi registrerar taggar och inparametrar pÄ den fjÀrrservern.

NÄgra rader och du, precis som alla som Àr intresserade, har tillgÄng till information om alla körningar. Coolt?

3. Skapa projektet

Nu ska vi göra det enklare att starta projektet. För detta lÀgger vi till en fil MLproject och conda.yaml i projektets rot.
MLproject

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'lista över kategorier frÄn coco-dataset'}
        epochs: {type: int, help: 'antal epoker i trÀningen'}

        lr: {type: float, default: 0.001, help: 'inlÀrningshastighet'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'exempel resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'serveradress'}
        experiment_name: {type: str, default: 'My_experiment', help: 'namn pÄ fjÀrr- och lokalt experiment'}
    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 har flera egenskaper:

  • Name — namnet pĂ„ ditt projekt;
  • Environment — i mitt fall anger conda_env att Anaconda anvĂ€nds för körningen och att beskrivningen av beroenden finns i filen conda.yaml;
  • Entry Points — anger vilka filer och med vilka parametrar vi kan starta (alla parametrar vid start av trĂ€ningen loggas automatiskt)

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

Som körmiljö kan du anvÀnda docker, för mer information se dokumentationen.

4. Vi startar trÀningen

Klonar projektet och gÄr till projektkatalogen:

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

För att starta behöver du installera biblioteken

pip install mlflow
pip install pysftp

Eftersom jag anvÀnder conda_env i exemplet mÄste Anaconda vara installerat pÄ din dator (men detta kan ocksÄ kringgÄs genom att installera alla nödvÀndiga paket sjÀlv och experimentera med körparametrarna).

Alla förberedande steg Àr avklarade och vi kan börja med att starta trÀningen. FrÄn projektroten:

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

Efter att kommandot har angetts skapas automatiskt en conda-miljö och trÀningen startar.
I exemplet ovan har jag angett antalet epoker för trÀning, kategorierna som vi vill segmentera (en fullstÀndig lista kan ses hÀr) och adressen till vÄr fjÀrrserver.
En fullstÀndig lista över möjliga parametrar kan ses i filen MLproject.

5. UtvÀrdera trÀningsresultaten

Efter att trÀningen Àr avslutad kan vi öppna vÄr serveradress i webblÀsaren http://server_host:server_port

MLOps — Kokbok, kapitel 1

HÀr ser vi en lista över alla experiment (i det övre vÀnstra hörnet), samt information om körningarna (i mitten). Vi kan se mer detaljerad information (parametrar, metrik, artefakter och viss extra information) om varje körning.

MLOps — Kokbok, kapitel 1

För varje metrisk kan vi observera historiken av förÀndringar.

MLOps — Kokbok, kapitel 1

Det vill sÀga, just nu kan vi analysera resultaten manuellt, och du kan ocksÄ stÀlla in automatisk validering med hjÀlp av MLflow API.

6. Registrera modellen

Efter att vi har analyserat vÄr modell och bestÀmt oss för att den Àr redo för produktion, gÄr vi vidare med att registrera den. För detta vÀljer vi den körning vi behöver (som visats i föregÄende punkt) och scrollar ner.

MLOps — Kokbok, kapitel 1

Efter att vi har gett vÄrt modell ett namn, fÄr den en version. NÀr en annan modell med samma namn sparas, höjs versionen automatiskt.

MLOps — Kokbok, kapitel 1

För varje modell kan vi lÀgga till en beskrivning och vÀlja en av tre statusar (Staging, Production, Archived). Senare kan vi med hjÀlp av API:n referera till dessa statusar, vilket i kombination med versionering ger ytterligare flexibilitet.

MLOps — Kokbok, kapitel 1

Vi har ocksÄ bekvÀm tillgÄng till alla modeller

MLOps — Kokbok, kapitel 1

och deras versioner.

MLOps — Kokbok, kapitel 1

Som i föregÄende punkt kan alla operationer göras med hjÀlp av API.

7. Distribuera modellen

I det hÀr skedet har vi redan en trÀnad (keras) modell. Ett exempel pÄ hur man kan anvÀnda den:

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

HÀr Àr self.registry Äterigen ett litet lager ovanför mlflow.tracking.MlflowClient, för bekvÀmlighetens skull. PoÀngen Àr att jag ansluter till en remote server och letar efter en modell med det angivna namnet, specifikt den senaste produktionsversionen. DÀrefter laddar jag ner artefakten lokalt i mappen .\/model och bygger modellen frÄn den hÀr mappen mlflow.keras.load_model(local_path). Nu kan vi anvÀnda vÄr modell. CV (ML) utvecklare kan lugnt arbeta med att förbÀttra modellen och publicera nya versioner.

Avslutningsvis

Jag har presenterat ett system som möjliggör:

  • centraliserad lagring av information om ML-modeller, trĂ€ningsstatus och resultat;
  • snabb distribution av utvecklingsmiljö;
  • övervakning och analys av arbetet med modeller;
  • smidig versionshantering och hantering av modellernas tillstĂ„nd;
  • lĂ€tt att distribuera de framtagna modellerna.

Detta exempel Àr en demonstrationsvariant och agerar som en startpunkt för att bygga ditt eget system, vilket kanske kommer att inkludera automatisering av resultatutvÀrdering och registrering av modeller (punkt 5 och punkt 6 respektive) eller sÄ kan du lÀgga till versionshantering av datamÀngder, eller kanske nÄgot annat? Jag försökte förmedla tanken att du behöver MLOps generellt, MLflow Àr bara ett verktyg för att uppnÄ ditt mÄl.

Skriv gÀrna vilka problem du har stött pÄ som jag inte tog upp?
Vad skulle du lÀgga till i systemet för att möta dina behov?
Vilka verktyg och metoder anvÀnder du för att lösa alla eller delar av problemen?

P.S. Jag lÀmnar ett par lÀnkar:
github-projekt — https://github.com/simbakot/mlflow_example
MLflow — https://mlflow.org/
Min arbetsmail för frĂ„gor — ikryakin@croc.ru

Vi anordnar regelbundet olika evenemang för IT-specialister. Till exempel kommer ett meetup om CV att hÄllas online den 8 juli kl. 19:00 Moskvatid. Om du Àr intresserad kan du delta, registrera dig. hÀr .

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster