MLOps - Libër gatimi, kapitulli 1

MLOps - Libër gatimi, kapitulli 1

Pershendetje te gjitheve! Unë jam një zhvillues CV në CROC. Tashmë prej 3 vitesh zbatojmë projekte në fushën e CV-së. Gjatë kësaj kohe, ne bëmë shumë gjëra, për shembull: monitoruam shoferët në mënyrë që gjatë vozitjes të mos pinin, të mos pinin duhan, të mos flisnin në telefon, të shikonin rrugën dhe jo ëndrrat ose retë. ; Kemi regjistruar persona që lëvizin në korsi të veçanta dhe zënë disa vende parkimi; siguroi që punëtorët të mbanin helmeta, doreza, etj.; identifikoi një punonjës që dëshiron të hyjë në objekt; Ne numëruam gjithçka që mundëm.

Për çfarë po i bëj të gjitha këto?

Në procesin e zbatimit të projekteve, ne kemi goditur gunga, shumë gunga, disa nga problemet me të cilat ose jeni njohur ose do të njiheni në të ardhmen.

Le të simulojmë situatën

Le të imagjinojmë se kemi marrë një punë në një kompani të re "N", aktivitetet e së cilës lidhen me ML. Ne punojmë në një projekt ML (DL, CV), pastaj për ndonjë arsye kalojmë në një punë tjetër, në përgjithësi bëjmë një pushim dhe kthehemi në neuronin tonë ose të dikujt tjetër.

  1. Vjen momenti i së vërtetës, duhet të mbani mend disi se ku u ndalët, cilat hiperparametra keni provuar dhe, më e rëndësishmja, në çfarë rezultatesh çuan. Mund të ketë shumë opsione se kush ka ruajtur informacionin në të gjitha lëshimet: në kokë, konfigurime, bllok shënimesh, në një mjedis pune në renë kompjuterike. Më ka ndodhur të shoh një opsion kur hiperparametrat janë ruajtur si rreshta të komentuar në kod, në përgjithësi, një fluturim i zbukuruar. Tani imagjinoni që nuk jeni kthyer në projektin tuaj, por në projektin e një personi që u largua nga kompania dhe ju keni trashëguar një kod dhe një model të quajtur model_1.pb. Për të plotësuar figurën dhe për të përcjellë të gjithë dhimbjen, le të imagjinojmë se jeni gjithashtu një specialist fillestar.
  2. Shkoni përpara. Për të ekzekutuar kodin, ne dhe të gjithë ata që do të punojnë me të duhet të krijojmë një mjedis. Ndodh shpesh që për ndonjë arsye nuk e kanë lënë si trashëgimi. Kjo gjithashtu mund të bëhet një detyrë jo e parëndësishme. Ju nuk doni të humbni kohë në këtë hap, apo jo?
  3. Ne trajnojmë një model (për shembull, një detektor makine). Ne arrijmë në pikën ku bëhet shumë mirë - është koha për të ruajtur rezultatin. Le ta quajmë car_detection_v1.pb. Pastaj stërvitim një tjetër - car_detection_v2.pb. Pak kohë më vonë, kolegët tanë ose ne vetë mësojmë gjithnjë e më shumë, duke përdorur arkitektura të ndryshme. Si rezultat, formohen një mori objektesh, informacioni për të cilin duhet të mblidhen me kujdes (por këtë do ta bëjmë më vonë, sepse tani për tani kemi çështje më prioritare).
  4. OK tani ka mbaruar! Ne kemi një model! A mund të fillojmë të trajnojmë modelin tjetër, të zhvillojmë një arkitekturë për të zgjidhur një problem të ri, apo mund të shkojmë të pimë pak çaj? Dhe kush do të vendoset?

Identifikimi i problemeve

Puna në një projekt ose produkt është puna e shumë njerëzve. Dhe me kalimin e kohës, njerëzit largohen dhe vijnë, ka më shumë projekte, dhe vetë projektet bëhen më komplekse. Në një mënyrë apo tjetër, situatat nga cikli i përshkruar më sipër (dhe jo vetëm) në kombinime të caktuara do të ndodhin nga përsëritja në përsëritje. E gjithë kjo rezulton në humbje kohe, konfuzion, nerva, ndoshta pakënaqësi të klientëve dhe në fund të fundit, humbje të parave. Edhe pse ne të gjithë zakonisht ndjekim të njëjtën grabujë të vjetër, besoj se askush nuk dëshiron t'i rijetojë këto momente pa pushim.

MLOps - Libër gatimi, kapitulli 1

Pra, ne kemi kaluar një cikël zhvillimi dhe shohim se ka probleme që duhen zgjidhur. Për ta bërë këtë ju duhet:

  • ruaj me lehtësi rezultatet e punës;
  • të thjeshtojë procesin e përfshirjes së punonjësve të rinj;
  • thjeshtimi i procesit të vendosjes së një mjedisi zhvillimi;
  • konfiguroni procesin e versionimit të modelit;
  • të ketë një mënyrë të përshtatshme për të vërtetuar modelet;
  • gjeni një mjet model për menaxhimin e shtetit;
  • gjeni një mënyrë për të ofruar modele në prodhim.

Me sa duket është e nevojshme të krijoni një rrjedhë pune që do t'ju lejojë të menaxhoni lehtësisht dhe me lehtësi këtë cikël jetësor? Kjo praktikë quhet MLOps

MLOps, ose DevOps për mësimin e makinerive, lejon ekipet e shkencës së të dhënave dhe IT të bashkëpunojnë dhe të rrisin ritmin e zhvillimit dhe vendosjes së modelit përmes monitorimit, vërtetimit dhe qeverisjes për modelet e mësimit të makinerive.

Ju mundeni per te nderuarÇfarë mendojnë djemtë e Google për gjithë këtë? Nga artikulli është e qartë se MLOps është një gjë mjaft voluminoze.

MLOps - Libër gatimi, kapitulli 1

Më tej në artikullin tim do të përshkruaj vetëm një pjesë të procesit. Për implementim, do të përdor mjetin MLflow, sepse... Ky është një projekt me burim të hapur, kërkohet një sasi e vogël kodi për t'u lidhur dhe ka integrim me kornizat popullore ml. Mund të kërkoni në internet për mjete të tjera, si Kubeflow, SageMaker, Trains, etj., dhe ndoshta të gjeni një që i përshtatet më mirë nevojave tuaja.

“Ndërtimi” i MLO-ve duke përdorur shembullin e përdorimit të mjetit MLFlow

MLFlow është një platformë me burim të hapur për menaxhimin e ciklit jetësor të modeleve ml (https://mlflow.org/).

MLflow përfshin katër komponentë:

  • MLflow Tracking - mbulon çështjet e regjistrimit të rezultateve dhe parametrave që çuan në këtë rezultat;
  • Projekti MLflow - ju lejon të paketoni kodin dhe ta riprodhoni atë në çdo platformë;
  • Modelet MLflow - përgjegjës për vendosjen e modeleve në prodhim;
  • Regjistri MLflow - ju lejon të ruani modelet dhe të menaxhoni gjendjen e tyre në një depo të centralizuar.

MLflow operon në dy entitete:

  • nisja është një cikël i plotë i trajnimeve, parametrave dhe matjeve me të cilat duam të regjistrohemi;
  • Një eksperiment është një "temë" që shkon së bashku.

Të gjithë hapat e shembullit zbatohen në sistemin operativ Ubuntu 18.04.

1. Vendosni serverin

Në mënyrë që ne të menaxhojmë me lehtësi projektin tonë dhe të marrim të gjithë informacionin e nevojshëm, ne do të vendosim një server. Serveri i përcjelljes MLflow ka dy komponentë kryesorë:

  • backend store - përgjegjës për ruajtjen e informacionit rreth modeleve të regjistruara (mbështet 4 DBMS: mysql, mssql, sqlite dhe postgresql);
  • dyqani i objekteve - përgjegjës për ruajtjen e objekteve (mbështet 7 opsione ruajtjeje: Amazon S3, Azure Blob Storage, Google Cloud Storage, server FTP, Server SFTP, NFS, HDFS).

Si dyqan objektesh Për thjeshtësi, le të marrim një server sftp.

  • krijoni një grup
    $ sudo groupadd sftpg
  • shtoni një përdorues dhe vendosni një fjalëkalim për të
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • duke rregulluar disa cilësime aksesi
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • shtoni disa rreshta në /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • rinisni shërbimin
    $ sudo systemctl restart sshd

Si dyqan backend Le të marrim 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

Për të nisur serverin, duhet të instaloni paketat e mëposhtme të python (Unë rekomandoj krijimin e një mjedisi të veçantë virtual):

pip install mlflow
pip install pysftp

Le të fillojmë serverin tonë

$ 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. Shto gjurmimin

Në mënyrë që rezultatet e trajnimit tonë të mos humbasin, brezat e ardhshëm të zhvilluesve të kuptojnë se çfarë po ndodhte, dhe që shokët më të vjetër dhe ju të jeni në gjendje të analizoni me qetësi procesin e mësimit, ne duhet të shtojmë gjurmimin. Gjurmimi nënkupton ruajtjen e parametrave, metrikave, objekteve dhe çdo informacioni shtesë në lidhje me fillimin e trajnimit, në rastin tonë, në server.

Për shembull, kam krijuar një të vogël projekt në github në Keras për segmentimin e gjithçkaje që është në Të dhënat e COCO-s. Për të shtuar gjurmimin, kam krijuar një skedar mlflow_training.py.

Këtu janë rreshtat ku ndodhin gjërat më interesante:

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)

Këtu self.remote_server është një mbështjellës i vogël mbi metodat e mlflow.tracking. MlflowClient (e bëra për lehtësi), me ndihmën e të cilit krijoj një eksperiment dhe e drejtoj në server. Më pas, unë tregoj se ku duhet të bashkohen rezultatet e nisjes (mlflow.set_tracking_uri(self.tracking_uri)). Aktivizoj regjistrimin automatik mlflow.keras.autolog(). Aktualisht MLflow Tracking mbështet regjistrimin automatik për TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Nëse nuk e keni gjetur kornizën ose bibliotekën tuaj, atëherë gjithmonë mund të regjistroheni në mënyrë të qartë. Po fillojmë stërvitjen. Regjistroni etiketat dhe parametrat e hyrjes në serverin në distancë.

Disa rreshta dhe ju, si gjithë të tjerët, keni akses në informacione për të gjitha lëshimet. E bukur?

3. Ne hartojmë projektin

Tani le ta bëjmë të lehtë nisjen e projektit. Për ta bërë këtë, shtoni skedarin MLproject dhe conda.yaml në rrënjën e projektit.
Projekti ML

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

Projekti MLflow ka disa karakteristika:

  • Emri - emri i projektit tuaj;
  • Mjedisi - në rastin tim, conda_env tregon se Anaconda përdoret për të ekzekutuar dhe përshkrimi i varësisë është në skedarin conda.yaml;
  • Pikat e hyrjes - tregon se cilat skedarë dhe me cilët parametra mund të ekzekutojmë (të gjithë parametrat regjistrohen automatikisht kur filloni trajnimin)

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

Ju mund të përdorni docker si mjedisin tuaj të ekzekutimit, për më shumë detaje ju lutemi referojuni dokumentacionin.

4. Le të fillojmë stërvitjen

Ne klonojmë projektin dhe shkojmë në drejtorinë e projektit:

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

Për të ekzekutuar, duhet të instaloni bibliotekat

pip install mlflow
pip install pysftp

Sepse në shembullin që përdor conda_env, Anaconda duhet të instalohet në kompjuterin tuaj (por ju mund ta shmangni këtë duke instaluar vetë të gjitha paketat e nevojshme dhe duke luajtur me parametrat e nisjes).

Të gjithë hapat përgatitorë kanë përfunduar dhe ne mund të fillojmë të fillojmë trajnimin. Nga rrënja e projektit:

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

Pas futjes së komandës, do të krijohet automatikisht një mjedis conda dhe do të fillojë trajnimi.
Në shembullin e mësipërm, kalova numrin e epokave për trajnim, kategoritë në të cilat duam të segmentojmë (mund të shihni listën e plotë këtu) dhe adresën e serverit tonë në distancë.
Një listë e plotë e parametrave të mundshëm mund të gjendet në skedarin MLproject.

5. Vlerësoni rezultatet e të nxënit

Pas përfundimit të trajnimit, ne mund të shkojmë në shfletues në adresën e serverit tonë http://server_host:server_port

MLOps - Libër gatimi, kapitulli 1

Këtu shohim një listë të të gjitha eksperimenteve (lart majtas), si dhe informacione mbi ekzekutimet (në mes). Ne mund të shohim informacione më të detajuara (parametra, metrikë, objekte dhe disa informacione shtesë) për çdo lëshim.

MLOps - Libër gatimi, kapitulli 1

Për çdo metrikë mund të vëzhgojmë historinë e ndryshimeve

MLOps - Libër gatimi, kapitulli 1

Ato. Për momentin, ne mund t'i analizojmë rezultatet në një modalitet "manual", dhe gjithashtu mund të konfiguroni vërtetimin automatik duke përdorur API MLflow.

6. Regjistroni modelin

Pasi të kemi analizuar modelin tonë dhe kemi vendosur që ai është gati për betejë, ne vazhdojmë ta regjistrojmë atë, për këtë zgjedhim nisjen që na nevojitet (siç tregohet në paragrafin e mëparshëm) dhe zbresim.

MLOps - Libër gatimi, kapitulli 1

Pasi i japim një emër modelit tonë, ai ka një version. Nëse ruani një model tjetër me të njëjtin emër, versioni do të përmirësohet automatikisht.

MLOps - Libër gatimi, kapitulli 1

Për secilin model, ne mund të shtojmë një përshkrim dhe të zgjedhim një nga tre gjendjet (Staging, Production, Arkived); më pas, duke përdorur API, ne mund të aksesojmë këto gjendje, të cilat, së bashku me versionimin, ofrojnë fleksibilitet shtesë.

MLOps - Libër gatimi, kapitulli 1

Gjithashtu kemi akses te lehte ne te gjitha modelet

MLOps - Libër gatimi, kapitulli 1

dhe versionet e tyre

MLOps - Libër gatimi, kapitulli 1

Ashtu si në paragrafin e mëparshëm, të gjitha operacionet mund të bëhen duke përdorur API.

7. Vendosni modelin

Në këtë fazë tashmë kemi një model (keras) të trajnuar. Një shembull se si mund ta përdorni:

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

Këtu self.registry është përsëri një mbështjellës i vogël mbi mlflow.tracking.MlflowClient, për lehtësi. Çështja është që unë hyj në një server të largët dhe kërkoj një model atje me emrin e specifikuar dhe versionin e fundit të prodhimit. Më pas, e shkarkoj objektin lokalisht në dosjen ./model dhe ndërtoj modelin nga kjo direktori mlflow.keras.load_model(local_path). Tani mund të përdorim modelin tonë. Zhvilluesit e CV (ML) mund të përmirësojnë lehtësisht modelin dhe të publikojnë versione të reja.

Në përfundim

Kam paraqitur një sistem që lejon:

  • ruajnë në mënyrë qendrore informacione rreth modeleve të ML, progresit dhe rezultateve të trajnimit;
  • vendosja e shpejtë e një mjedisi zhvillimi;
  • monitoron dhe analizon ecurinë e punës në modele;
  • është i përshtatshëm për të versionuar dhe menaxhuar gjendjen e modeleve;
  • Është e lehtë të vendosësh modelet që rezultojnë.

Ky shembull është një lodër dhe shërben si një pikënisje për ndërtimin e sistemit tuaj, i cili mund të përfshijë automatizimin e vlerësimit të rezultateve dhe regjistrimin e modeleve (pikat 5 dhe 6, respektivisht) ose do të shtoni versionimin e grupeve të të dhënave, apo ndoshta diçka tjetër? Pika që po përpiqesha të them është se ju nevojiten MLOps në tërësi, MLflow është vetëm një mjet për një qëllim.

Shkruaj çfarë problemesh ke hasur që nuk i kam shfaqur?
Çfarë do t'i shtonit sistemit për ta bërë atë të plotësojë nevojat tuaja?
Çfarë mjetesh dhe qasjesh përdorni për të zgjidhur të gjitha ose një pjesë të problemeve?

PS do le disa lidhje:
projekti github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Email-i im i punës për pyetje - [email mbrojtur]

Kompania jonë organizon periodikisht ngjarje të ndryshme për specialistët e IT-së, për shembull: më 8 korrik në orën 19:00 me kohën e Moskës do të ketë një takim CV në një format online, nëse jeni të interesuar, mund të merrni pjesë, regjistrim këtu .

Burimi: www.habr.com

Shto një koment